定位并拖动应用了变换的元素
Position and Drag An Element With A Transform Applied
我有一个javascript代码,它非常适合拖动对象。。。但当我把身体缩小到0.5…
transform:scale(0.5);
鼠标的位置和拖动的对象不相同。我该怎么解决这个问题?或者这可能吗?。。。非常感谢。
这是一把小提琴:http://jsfiddle.net/Xcb8d/65/
这很有趣,让我重新思考我只使用offsetHeight和offsetWidth的所有位置,而不知道如果对元素应用转换,JavaScript中的这些只读属性将返回错误。
"诀窍"是clientHeight/offsetHeight不会正确报告其转换的属性。为了从元素中获得正确的大小信息,您需要调用getBoundingClientRect()。然后可以计算缩放元素的正确像素信息,从而执行正确的定位。
检索边界矩形可以从视口中获取像素信息,然后可以将这些信息与浏览器中的clientHeight进行比较,以确定缩放的偏移高度和位置。
我修改了一些事件接线只是为了测试。此外,我添加了另一个类来生成四分之一大小的对象,只是为了证明它无论规模大小都能工作。
CSS:
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的实时更新)
我确实修改了一些事件连线,只是为了我的初步测试。此外,我还将变换分解为一种样式,以便尝试其他变换。呈现"四分之一大小"时,测试看起来是正确的。这证明了无论规模大小,它都是有效的,而且你不需要一个神奇的数字来计算你的位置。
不是一个真正的答案,但对于评论来说太长了,而且因为它仍然很跳跃,可能不是第一次尝试。。。
在Firefox中,使用pointer-events
,您可以尝试限制将捕捉鼠标的区域。
在中心创建一个内部元素,其大小与缩放后的元素本身相同。
你的小提琴说scale(0.5)
是100px
的平方,所以让我们在中间用一个伪元素画一个50px
的平方。
将元素的指针事件设置为none,并将伪元素的指针重置回正常值。现在我们有一个50px
的正方形,它将接受鼠标。一旦元素缩小到50px
,我们仍然有这个区域发生反应。(正方形看起来更小,但仍使用相同的空间。
为了完成你的小提琴测试,让我们添加到正文:transform-origin:top left;
,现在我们应该可以拖动这个方块了。
Firefox测试:http://jsfiddle.net/Xcb8d/78/
铬测试:http://jsfiddle.net/Xcb8d/79/(增加负利润)
点击几下后,它真的会跳出限制:)
希望它能提供一些提示。
阅读以下内容:http://css-tricks.com/get-value-of-css-rotation-through-javascript/
我想,我们可以从主体中获得转换值,并在函数中更新计算,这样我们就可以在不接触脚本的情况下修改比例值
新手测试: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';
}
}
- 远距离变换元素的宽度/高度(以像素为单位)
- 更改已变换元素的变换原点
- 如何向元素添加新的变换样式
- d3:应用 scale() 变换时元素移动
- 获取变换后的宽度:缩放元素
- 在SVG元素中保留变换
- 使用变换的SVG动画正在偏移元素
- 使用“变换”缩放多个元素
- 中心元素css三维变换
- 获取缩放变换元素的实际高度
- 使用动画中的Step函数来变换和旋转元素
- 使用javascript围绕某个点旋转元素(不使用变换原点)
- 拉斐尔元素没有'当传递给循环中的函数时,t变换
- 如何将屏幕坐标转换为z变换元素上的坐标
- 重新计算缩放元素上的变换原点
- CSS通过位置或变换来移动元素
- 将新元素放置在父级中包含的子级之上,并应用CSS缩放变换
- 子元素和父元素的CSS变换比例仍然占用相同的空间
- 我可以重用html5 canvas元素的变换吗?
- 定位并拖动应用了变换的元素