首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript拖拽div滞后

JavaScript拖拽div滞后
EN

Stack Overflow用户
提问于 2013-03-09 17:55:40
回答 1查看 1.4K关注 0票数 2

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

奇怪的是,当从左到右拖动时,这种延迟不会发生,只从上到下。

你有什么办法摆脱这个函数的垂直滞后吗?

代码语言:javascript
复制
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' ] }
} 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-09 19:47:53

我在这里放了一个var grabber = ele;并创建了一个演示:http://jsfiddle.net/N6A4q/ (注意,我已经修改了要测试的var grabber = ele;

我确实注意到,较慢的行为取决于css的位置。

这个问题可能需要一些优化,比如缓存值。

例如

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

可以通过以下方式进行改进

变量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/

该链接建议:

例如,快速连续地设置和获取样式(在循环中)不是一个好主意,例如:

//不-不!

el.style.left = el.offsetLeft + 10 + "px";

很简单,因为它就像读和写一样简单。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15309398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档