Fix hoverzoom snapping to last known position.
Suddenly hoverzoom started acting wrongly. Possibly a Chrome update.
This commit is contained in:
parent
87abb055c3
commit
980688fbc1
1 changed files with 54 additions and 35 deletions
|
@ -208,12 +208,11 @@
|
||||||
<!-- THE PHOTO ITSELF -->
|
<!-- THE PHOTO ITSELF -->
|
||||||
<div class="photo_viewer">
|
<div class="photo_viewer">
|
||||||
{% if photo.simple_mimetype == "image" %}
|
{% if photo.simple_mimetype == "image" %}
|
||||||
<div id="photo_img_holder">
|
<div id="photo_img_holder" onclick="toggle_hoverzoom(event)">
|
||||||
<img
|
<img
|
||||||
id="photo_img"
|
id="photo_img"
|
||||||
src="{{file_link}}"
|
src="{{file_link}}"
|
||||||
alt="{{photo.basename}}"
|
alt="{{photo.basename}}"
|
||||||
onclick="toggle_hoverzoom()"
|
|
||||||
onload="this.style.opacity=0.99"
|
onload="this.style.opacity=0.99"
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
|
@ -237,6 +236,9 @@ var add_tag_button = document.getElementById('add_tag_button');
|
||||||
var message_area = document.getElementById('message_area');
|
var message_area = document.getElementById('message_area');
|
||||||
add_tag_box.onkeydown = function(){entry_with_history_hook(add_tag_box, add_tag_button)};
|
add_tag_box.onkeydown = function(){entry_with_history_hook(add_tag_box, add_tag_button)};
|
||||||
|
|
||||||
|
photo_img_holder = document.getElementById("photo_img_holder");
|
||||||
|
photo_img = document.getElementById("photo_img");
|
||||||
|
|
||||||
function add_photo_tag(photoid, tagname, callback)
|
function add_photo_tag(photoid, tagname, callback)
|
||||||
{
|
{
|
||||||
if (tagname === ""){return}
|
if (tagname === ""){return}
|
||||||
|
@ -292,49 +294,50 @@ function refresh_metadata(photoid)
|
||||||
{
|
{
|
||||||
var url= "/photo/" + photoid + "/refresh_metadata";
|
var url= "/photo/" + photoid + "/refresh_metadata";
|
||||||
var data = new FormData();
|
var data = new FormData();
|
||||||
post(url, data);
|
callback = function(){location.reload();};
|
||||||
setTimeout(function(){location.reload();}, 2000);
|
post(url, data, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
function enable_hoverzoom()
|
function enable_hoverzoom(event)
|
||||||
{
|
{
|
||||||
console.log("enable zoom");
|
//console.log("enable zoom");
|
||||||
img_holder = document.getElementById("photo_img_holder");
|
photo_img_holder = document.getElementById("photo_img_holder");
|
||||||
img = document.getElementById("photo_img");
|
photo_img = document.getElementById("photo_img");
|
||||||
if (img.naturalWidth < img_holder.offsetWidth && img.naturalHeight < img_holder.offsetHeight)
|
if (
|
||||||
|
photo_img.naturalWidth < photo_img_holder.offsetWidth &&
|
||||||
|
photo_img.naturalHeight < photo_img_holder.offsetHeight
|
||||||
|
)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
img.style.opacity = "0";
|
photo_img.style.opacity = "0";
|
||||||
img.style.display = "none";
|
photo_img.style.display = "none";
|
||||||
img_holder.style.cursor = "zoom-out";
|
photo_img_holder.style.cursor = "zoom-out";
|
||||||
img_holder.style.backgroundImage = "url('{{file_link}}')";
|
photo_img_holder.style.backgroundImage = "url('{{file_link}}')";
|
||||||
img_holder.onmousemove = move_hoverzoom;
|
photo_img_holder.onmousemove = move_hoverzoom;
|
||||||
setTimeout(function(){img_holder.onclick = toggle_hoverzoom;}, 100);
|
move_hoverzoom(event)
|
||||||
|
//setTimeout(function(){img_holder.onclick = toggle_hoverzoom;}, 100);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
function disable_hoverzoom()
|
function disable_hoverzoom()
|
||||||
{
|
{
|
||||||
console.log("disable zoom");
|
//console.log("disable zoom");
|
||||||
img_holder = document.getElementById("photo_img_holder");
|
photo_img.style.opacity = "100";
|
||||||
img = document.getElementById("photo_img");
|
photo_img_holder.style.cursor = "";
|
||||||
img.style.opacity = "100";
|
photo_img.style.display = "";
|
||||||
img_holder.style.cursor = "";
|
photo_img_holder.style.backgroundImage = "none";
|
||||||
img.style.display="";
|
photo_img_holder.onmousemove = null;
|
||||||
img_holder.style.backgroundImage = "none";
|
//photo_img_holder.onclick = null;
|
||||||
img_holder.onmousemove = null;
|
|
||||||
img_holder.onclick = null;
|
|
||||||
}
|
}
|
||||||
function toggle_hoverzoom()
|
function toggle_hoverzoom()
|
||||||
{
|
{
|
||||||
img = document.getElementById("photo_img");
|
if (photo_img.style.opacity === "0")
|
||||||
if (img.style.opacity === "0")
|
|
||||||
{
|
{
|
||||||
disable_hoverzoom();
|
disable_hoverzoom();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
enable_hoverzoom();
|
enable_hoverzoom(event);
|
||||||
}
|
}
|
||||||
if (getComputedStyle(content_body).flexDirection != "column-reverse")
|
if (getComputedStyle(content_body).flexDirection != "column-reverse")
|
||||||
{
|
{
|
||||||
|
@ -342,24 +345,40 @@ function toggle_hoverzoom()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
photo_img_holder = document.getElementById("photo_img_holder");
|
|
||||||
photo_img = document.getElementById("photo_img");
|
|
||||||
function move_hoverzoom(event)
|
function move_hoverzoom(event)
|
||||||
{
|
{
|
||||||
var x;
|
var x;
|
||||||
var y;
|
var y;
|
||||||
|
|
||||||
// Adding 5% to perceived position gives us a bit of padding around the image,
|
/*
|
||||||
// so you don't need to navigate a 1px line to see the edge.
|
When clicking on the image, the event handler takes the image as the event
|
||||||
// We first subtract half of the image dimensions so that the 5% is applied
|
target even though the handler was assigned to the holder. The coordinates
|
||||||
// to both left and right. Otherwise 105% of 0 is still 0 which doesn't
|
for the zoom need to be based on the holder, so when this happens we need
|
||||||
// apply padding on the left.
|
to adjust the numbers.
|
||||||
|
I'm not sure why the offset is the holder's offsetLeft. It seems that when
|
||||||
|
the event triggers on the holder, the event X is based on its bounding box,
|
||||||
|
but when it triggers on the image it's based on the viewport.
|
||||||
|
*/
|
||||||
var mouse_x = event.offsetX;
|
var mouse_x = event.offsetX;
|
||||||
|
var mouse_y = event.offsetY;
|
||||||
|
if (event.target !== photo_img_holder)
|
||||||
|
{
|
||||||
|
mouse_x -= photo_img_holder.offsetLeft;
|
||||||
|
mouse_y -= photo_img_holder.offsetTop;
|
||||||
|
}
|
||||||
|
//console.log(mouse_x);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Adding 5% to perceived position gives us a bit of padding around the image,
|
||||||
|
so you don't need to navigate a 1px line to see the edge.
|
||||||
|
We first subtract half of the image dimensions so that the 5% is applied
|
||||||
|
to both left and right. Otherwise 105% of 0 is still 0 which doesn't
|
||||||
|
apply padding on the left.
|
||||||
|
*/
|
||||||
mouse_x -= (photo_img_holder.offsetWidth / 2);
|
mouse_x -= (photo_img_holder.offsetWidth / 2);
|
||||||
mouse_x *= 1.05;
|
mouse_x *= 1.05;
|
||||||
mouse_x += (photo_img_holder.offsetWidth / 2);
|
mouse_x += (photo_img_holder.offsetWidth / 2);
|
||||||
|
|
||||||
var mouse_y = event.offsetY;
|
|
||||||
mouse_y -= (photo_img_holder.offsetHeight / 2);
|
mouse_y -= (photo_img_holder.offsetHeight / 2);
|
||||||
mouse_y *= 1.05;
|
mouse_y *= 1.05;
|
||||||
mouse_y += (photo_img_holder.offsetHeight / 2);
|
mouse_y += (photo_img_holder.offsetHeight / 2);
|
||||||
|
|
Loading…
Reference in a new issue