gpt4 book ai didi

JavaScript拖动div滞后

转载 作者:行者123 更新时间:2023-11-28 09:18:33 25 4
gpt4 key购买 nike

我在使用下面的函数拖动 div 时遇到问题,由于某种原因,当我将 div 拖动到页面上的内容(例如图像和文本 block )上时,它会滞后。

奇怪的是,从左到右拖动时不会发生这种滞后,只有从上到下拖动时才会发生这种滞后。

有什么想法可以消除此函数中的垂直滞后吗?

function enableDragging(ele) {
var dragging = dragging || false,
x, y, Ox, Oy,
current;
enableDragging.z = enableDragging.z || 1;
var grabber = document.getElementById("wrapper");
grabber.onmousedown = function (ev) {
ev = ev || window.event;
var target = ev.target || ev.srcElement;
current = target.parentNode;
dragging = true;
x = ev.clientX + 2;
y = ev.clientY + 2;
Ox = current.offsetLeft;
Oy = current.offsetTop;
current.style.zIndex = ++enableDragging.z;

document.onmousemove = function (ev) {
ev = ev || window.event;
if (dragging == true) {
var Sx = parseFloat(ev.clientX) - x + Ox;
var Sy = parseFloat(ev.clientY) - y + Oy;
current.style.left = Math.min(Math.max(Sx, Math.min(viewport().width - Sx, 0)), viewport().width - current.offsetWidth) + "px";

current.style.top = Math.min(Math.max(Sy, Math.min(viewport().height - Sy, 0)), viewport().height - current.offsetHeight) + "px";
}
}

document.onselectstart = function () {
return false;
};

document.onmouseup = function (ev) {
ev = ev || window.event;
dragging && (dragging = false);
if (ev.preventDefault) {
ev.preventDefault();
}
}

document.body.style.MozUserSelect = "none";
document.body.style.cursor = "default";

return false;
};
}

function viewport() {
var e = window
, a = 'inner';
if ( !( 'innerWidth' in window ) ) {
a = 'client';
e = document.documentElement || document.body;
}
return { width : e[ a+'Width' ] , height : e[ a+'Height' ] }
}

最佳答案

我在这里放了一个 fiddle 并创建了一个演示:http://jsfiddle.net/N6A4q/ (请注意,我已进行修改以处理 vargrabber = ele; 进行测试。

我确实注意到速度较慢取决于 css 的定位。
该问题可能需要一些优化,例如缓存值。

For example:
current.style.top = Math.min(Math.max(Sx, Math.min(viewport().height - Sx, 0)), viewport().height - current.offsetWidth) + "px";

可以改进

var viewportHeight = viewport.height();
current.style.top = Math.min(Math.max(Sy, Math.min(viewportHeight - Sy, 0)), viewportHeight - current.offsetHeight) + "px";

这里有一些关于浏览器重绘/流程的好读物:http://www.phpied.com/rendering-repaint-reflowrelayout-restyle/

链接建议:

For example, it's a bad idea to set and get styles in a quick succession (in a loop), like:

// no-no!
el.style.left = el.offsetLeft + 10 + "px";

仅仅因为它就像阅读和写作一样简单。

关于JavaScript拖动div滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15309398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com