【发布时间】:2015-02-20 15:00:46
【问题描述】:
即使下面的代码 sn-p 看起来很短,我在几天内都在努力(真为我感到羞耻!)找到一种方法来缩放被点击的点,只使用 CSS3 transform。现在可以了:
var current = {x: 0, y: 0, zoom: 1}, c = document.getElementById('container');
window.onclick = function(e) {
wx = current.x + e.clientX / current.zoom;
wy = current.y + e.clientY / current.zoom;
var coef = e.ctrlKey ? 0.5 : 2;
current.zoom *= coef;
current.x = wx - e.clientX / current.zoom;
current.y = wy - e.clientY / current.zoom;
c.style.transform = 'scale(' + current.zoom +') translate(' + (-current.x) + 'px,' + (-current.y) + 'px)';
};
html, body { margin: 0; padding: 0; overflow: hidden; min-height: 100%; }
#container { position: absolute; transform-origin: 0 0; transition-duration: 3s;}
#item { position: absolute; left:0px; top:0px; }
<div id="container"><div id="item"><img src="http://fadili.users.greyc.fr/demos/WaveRestore/EMInpaint/parrot_original.png"></img></div></div>
唯一的问题是过渡很奇怪,就像它先平移然后缩放一样;它会产生一种奇怪的锯齿形效果。在这种情况下如何实现平滑的 CSS3 过渡?
在此处查看奇怪的过渡效果的动画 GIF:http://gget.it/zf3fmwum/weirdtransition.gif
注意:点击的点是缩放变换的固定点(例如:点击眼睛,图片放大,光标还在眼睛上),就像在 GoogleMaps-doubleclick-zooming 中一样。
【问题讨论】:
-
旁注:我尝试使用
transform-origin失败:它让我想到了仿射变换的组合,这可能很棘手:如果你用因子 1/k 的仿射缩放组合因子 k 的仿射缩放结果不是仿射缩放,而是平移等(它给我带来了一些在一半时间内有效的糟糕代码) -
用
scale3djsfiddle.net/zpb5jxzw 试过了,有点效果 -
@VitorinoFernandes 问题没解决,转场还是怪怪的,看这里的动图:gget.it/zf3fmwum/weirdtransition.gif
-
试一试:(1) 设置
transition-property: none(2) 仅 应用translate转换 (3) 设置transition-property: all(4) 更新@ 987654335@ 变换。如果过渡仍然存在,请尝试在 #3 之后触发回流
标签: css transform css-transitions transition