我有一段JavaScript代码,可以完美地拖动对象......但是当我将页面缩小到0.5倍时...
transform:scale(0.5);
鼠标位置和拖动的对象位置不同,我该如何修复?或者这可能吗?...谢谢。
这是一个 jsfiddle 示例:http://jsfiddle.net/Xcb8d/65/
我有一段JavaScript代码,可以完美地拖动对象......但是当我将页面缩小到0.5倍时...
transform:scale(0.5);
鼠标位置和拖动的对象位置不同,我该如何修复?或者这可能吗?...谢谢。
这是一个 jsfiddle 示例:http://jsfiddle.net/Xcb8d/65/
html,
body {
width:100%;
height:100%;
}
.half-size
{
transform:scale(0.5);
-moz-transform:scale(0.5);
-webkit-transform:scale(0.5);
}
.quarter-size
{
transform:scale(0.25);
-moz-transform:scale(0.25);
-webkit-transform:scale(0.25);
}
#draggable-element {
width:100px;
height:100px;
background-color:#666;
color:white;
padding:10px 12px;
cursor:move;
position:relative; /* important (all position that's not `static`) */
display:block;
}
JavaScript:
var selected = null, // Object of the element to be moved
x_pos = 0, y_pos = 0, // Stores x & y coordinates of the mouse pointer
x_elem = 0, y_elem = 0; // Stores top, left values (edge) of the element
var elem_height = 0;
var elem_width = 0;
// Will be called when user starts dragging an element
function _drag_init(elem) {
// Store the object of the element which needs to be moved
selected = elem;
var boundingRectangle = selected.getBoundingClientRect();
y_elem = (selected.offsetHeight - (boundingRectangle.bottom - boundingRectangle.top)) / 2;
x_elem = (selected.offsetWidth - (boundingRectangle.right - boundingRectangle.left)) / 2
half_elem_height = (boundingRectangle.bottom - boundingRectangle.top) / 2;
half_elem_width = (boundingRectangle.right - boundingRectangle.left) /2;
document.addEventListener('mousemove', _move_elem, false);
document.addEventListener('mouseup', _destroy, false);
};
// Will be called when user dragging an element
function _move_elem(e)
{
x_pos = e.clientX;
y_pos = e.clientY;
selected.style.left = ((x_pos - x_elem) - half_elem_width) + 'px';
selected.style.top = ((y_pos - y_elem) - half_elem_height) + 'px';
}
// Destroy the object when we are done and remove event binds
function _destroy() {
selected = null;
document.removeEventListener('mousemove', _move_elem);
document.removeEventListener('mouseup', _destroy);
}
// Bind the functions...
document.getElementById('draggable-element').onmousedown = function () {
_drag_init(this);
};
HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div id="draggable-element" class='half-size'>Drag me!</div>
</body>
</html>
点击下方查看实时预览
http://jsbin.com/moyadici/1/edit (我更喜欢 jsBin 而非 jsFiddle,因为它可以实时更新)
我修改了一些事件绑定,仅用于我的初始测试。此外,我将转换分解成样式,以便尝试其他转换方式。在呈现“四分之一大小”时,测试结果正确。这证明它可以正常工作,而不需要魔数来进行位置计算。
getBoundingClientRect
会在每次鼠标按下时触发一次布局/回流。 - Jackpointer-events
,您可以尝试限制将捕捉鼠标的区域。scale(0.5)
一个100px
的正方形,因此让我们用伪元素在中间画一个50px
的正方形。pointer-events
设置为none,并将其重置为伪元素的正常状态。现在我们有一个50px
的正方形,它将接受鼠标。一旦元素缩小到50px
,我们仍然有这个区域起反应。(正方形只是看起来更小了,但保持了相同的空间。)transform-origin:top left;
,现在我们应该能够拖动这个正方形。Chrome测试: http://jsfiddle.net/Xcb8d/79/ (添加负边距)
点击几次后,它真的会跳出限制 :)
阅读此文:http://css-tricks.com/get-value-of-css-rotation-through-javascript/
我认为,我们可以从body中获取transform的值,并在函数内更新计算,这样我们就可以修改比例值而不用触及脚本。
新手测试:http://jsfiddle.net/Xcb8d/82/
例如:从原始fiddle更新的函数
// Will be called when user dragging an element
function _move_elem(e) {
var el = window.document.body;
var st = window.getComputedStyle(el, null);
var tr = st.getPropertyValue("transform") ;
var values = tr.split('(')[1];
values = values.split(')')[0];
values = values.split(',');
var a = values[0];
var b = values[1];
var c = values[2];
var d = values[3];
x_pos = document.all ? window.event.clientX : e.pageX;
y_pos = document.all ? window.event.clientY : e.pageY;
if (selected !== null) {
selected.style.left = ((x_pos / a) - x_elem) + 'px';
selected.style.top = ((y_pos / d) - y_elem) + 'px';
}
}