Javascript 将css变换转换为缩放和定位
我想用硬件加速的Javascript 将css变换转换为缩放和定位,javascript,css,multi-touch,css-transforms,hammer.js,Javascript,Css,Multi Touch,Css Transforms,Hammer.js,我想用硬件加速的transform:translate3d()scale3d()CSS来进行压缩缩放和平移。完成手势后,我重置变换并切换到CSSzoom和绝对定位。通过这种方式,缩放和平移是自由的,并且在手势结束时,它会很好地重新播放内容 如果考虑到缩放,平移效果很好: .on('dragend', function(event){ $pinch.css({ // Reset transform transform: "translate3d(0, 0, 0) " });
transform:translate3d()scale3d()
CSS来进行压缩缩放和平移。完成手势后,我重置变换并切换到CSSzoom
和绝对定位。通过这种方式,缩放和平移是自由的,并且在手势结束时,它会很好地重新播放内容
如果考虑到缩放,平移效果很好:
.on('dragend', function(event){
$pinch.css({
// Reset transform
transform: "translate3d(0, 0, 0) "
});
// Convert transform to position
panX += event.gesture.deltaX/zoom;
panY += event.gesture.deltaY/zoom;
$("#content").css({
left: panX,
top: panY
});
})
但是使用捏缩缩放时,我不知道如何考虑缩放的原点(0,0)和手势的原点(捏缩的中间)之间的差异
资料来源:或。。。shift+鼠标拖动模拟多点触摸。CSSzoom
在Firefox中不起作用
Hammer.js'事件.手势
看起来像
angle: -133.87669728592456
center: Object
pageX: 426
pageY: 337
deltaTime: 853
deltaX: -75
deltaY: -78
direction: "up"
distance: 108.2081327812286
eventType: "end"
pointerType: "touch"
rotation: 0
scale: 1
target: HTMLDivElement
timeStamp: 1375041776946
velocityX: 0.08792497069167643
velocityY: 0.0914419695193435
将您的代码修改到下面
var $pinch = $("#pan");
var pinch = $pinch[0];
var currentZoom, startX, startY, originX, originY, scale, deltaX, deltaY, distance_to_origin_x, distance_to_origin_y;
var zoom = 1;
var panX = 0;
var panY = 0;
Hammer(pinch)
.on('transformstart', function (event) {
currentZoom = zoom;
startX = event.gesture.center.pageX;
startY = event.gesture.center.pageY;
originX = startX/currentZoom;
originY = startY/currentZoom;
distance_to_origin_x = originX - $pinch.left();
distance_to_origin_y = originY - $pinch.top();
$pinch.css({
transformOrigin: originX+"px "+originY+"px"
});
})
.on('transform', function (event) {
scale = Math.max(0.25/currentZoom, Math.min(event.gesture.scale, 6/currentZoom));
deltaX = (event.gesture.center.pageX - startX) / currentZoom;
deltaY = (event.gesture.center.pageY - startY) / currentZoom;
$pinch.css({
transform: "translate3d("+deltaX+"px,"+deltaY+"px, 0) " +
"scale3d("+scale+","+scale+", 1) "
});
})
.on('transformend', function (event) {
// Convert scale to zoom
zoom = currentZoom * scale;
zoom = Math.max(0.25, Math.min(zoom, 6));
distance_to_origin_x *= zoom;
distance_to_origin_y *= zoom;
$pinch.css({
// Reset transform
transform: "translate3d(0, 0, 0) " +
"scale3d(1, 1, 1) ",
zoom: zoom
});
$("#content").css({
top: originY + distance_to_origin_y ,
left: originX + distance_to_origin_x
});
})
其工作方式是计算手势原点和内容左上角之间的向量。缩放页面时,该向量应与页面的其余部分线性缩放
向量是距离x和距离y,虽然我可能无法回答你的问题,但我可以给出一些建议。在可能的情况下,使用类而不是jQuery css函数。在我看来,尽可能将css保存在css文件中,而不是JavaScript中,可以使代码更清晰、更易于理解。还有一些css3变量在JavaScript中使用时会变得相当混乱。因此,我宁愿在JS中使用css3转换和超时来匹配时间,而不是使用JavaScript进行动画。不是说你的不好,只是个人经验。我所做的.css()
调用都是针对动态位置的。另外,jQuery处理浏览器前缀,这很好。Less也可以,witch也很好,只是一个观点,但不要认为它真的会对你的问题有多大帮助。
var $pinch = $("#pan");
var pinch = $pinch[0];
var currentZoom, startX, startY, originX, originY, scale, deltaX, deltaY, distance_to_origin_x, distance_to_origin_y;
var zoom = 1;
var panX = 0;
var panY = 0;
Hammer(pinch)
.on('transformstart', function (event) {
currentZoom = zoom;
startX = event.gesture.center.pageX;
startY = event.gesture.center.pageY;
originX = startX/currentZoom;
originY = startY/currentZoom;
distance_to_origin_x = originX - $pinch.left();
distance_to_origin_y = originY - $pinch.top();
$pinch.css({
transformOrigin: originX+"px "+originY+"px"
});
})
.on('transform', function (event) {
scale = Math.max(0.25/currentZoom, Math.min(event.gesture.scale, 6/currentZoom));
deltaX = (event.gesture.center.pageX - startX) / currentZoom;
deltaY = (event.gesture.center.pageY - startY) / currentZoom;
$pinch.css({
transform: "translate3d("+deltaX+"px,"+deltaY+"px, 0) " +
"scale3d("+scale+","+scale+", 1) "
});
})
.on('transformend', function (event) {
// Convert scale to zoom
zoom = currentZoom * scale;
zoom = Math.max(0.25, Math.min(zoom, 6));
distance_to_origin_x *= zoom;
distance_to_origin_y *= zoom;
$pinch.css({
// Reset transform
transform: "translate3d(0, 0, 0) " +
"scale3d(1, 1, 1) ",
zoom: zoom
});
$("#content").css({
top: originY + distance_to_origin_y ,
left: originX + distance_to_origin_x
});
})