Javascript (jQuery) 将图像缩放到其容器的中心点
这看起来应该很简单,但由于某种原因我无法完全理解它。我在“视口”div 中有一个图像,其溢出属性设置为隐藏。
我已经使用 jQuery UI 实现了简单的缩放和平移,但是我无法让缩放看起来源自视口的中心。我在 Photoshop 中做了一些截屏,展示了我想要重现的效果: http://dl.dropbox.com/u/107346/share/reference-point-zoom.mov
在 PS 中,您可以调整缩放参考点,对象将从该点开始缩放。显然,这对于 HTML/CSS/JS 来说是不可能的,所以我试图找到合适的左侧和顶部 CSS 值来模拟效果。
这是有问题的代码,删除了一些不必要的部分:
html
<div id="viewport">
<img id="map" src="http://dl.dropbox.com/u/107346/share/fake-map.png" alt="" />
</div>
<div id="zoom-control"></div>
javascript
$('#zoom-control').slider({
min: 300,
max: 1020,
value: 300,
step: 24,
slide: function(event, ui) {
var old_width = $('#map').width();
var new_width = ui.value;
var width_change = new_width - old_width;
$('#map').css({
width: new_width,
// this is where I'm stuck...
// dividing by 2 makes the map zoom
// from the center, but if I've panned
// the map to a different location I'd
// like that reference point to change.
// So instead of zooming relative to
// the map image center point, it would
// appear to zoom relative to the center
// of the viewport.
left: "-=" + (width_change / 2),
top: "-=" + (width_change / 2)
});
}
});
这是 JSFiddle 上的项目:http://jsfiddle.net/christiannaths/W4seR/
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是工作解决方案。我将在下次编辑时解释逻辑。
函数逻辑:
总结:记住图像的中心位置,相对。
宽度和高度的计算类似,我只解释
高度
的计算详细解释只是函数逻辑的示例。具有不同变量名称的真实代码可以在答案底部找到。
计算
#map
相对于#viewport
的中心 (x,y)。这可以通过使用offset()
来完成,height()
和width()
方法。计算新的顶部和左侧偏移量:
更改 CSS 属性
演示:http://jsfiddle.net/W4seR /12/
Here's the working solution. I will explain the logic at the next edit.
Function Logic:
Summary: Remember the center position of the image, relatively.
The calculations for width and height are similar, I will only explain the
height
calculationThe detailled explanation is just an example of function logic. The real code, with different variable names can be found at the bottom of the answer.
Calculate the center (x,y) of the
#map
, relative to#viewport
. This can be done by using theoffset()
,height()
andwidth()
methods.Calculate the new top and left offsets:
Change the CSS property
Demo: http://jsfiddle.net/W4seR/12/
我一直依赖陌生人的善意。相关更改:
如有必要,将硬编码的
150
替换为视口实例化时设置的变量。I have always relied on the kindness of strangers. Pertinent changes:
Replace the hardcoded
150
with a variable set on viewport instantiation if necessary.这是一个快速工作版本:
http://jsfiddle.net/flabbyrabbit/chLkZ/
可能不是最简洁的解决方案,但似乎效果很好,希望有帮助。
更新:抱歉,只有当地图移动时缩放为 0 时,这才有效。
Here is a quick working version:
http://jsfiddle.net/flabbyrabbit/chLkZ/
Probably not the neatest solution but seems to work nicely, hope it helps.
Update: sorry this only works if zoom is 0 when the map is moved.