mousedown + mousemove上的糟糕表现与user-select:none

时间:2013-01-02 21:53:18

标签: html css performance mousemove textselection

标题几乎总结了它。在处理页面上的大量不可选元素时,我的表现很糟糕,我试图实现拖放系统。

我有一个计时器设置来显示它的间隔,当你在示例页面上点击并移动鼠标时,你会看到通过屋顶的间隔..

违规的css:

body
{
    -moz-user-select: none;
    -khtml-user-select: none;
    -webkit-user-select: none;
    user-select: none;
}

删除它,一切都如你所愿。这些规则是否与身体,div或实际跨度本身相关似乎并不重要。

关于这里发生了什么的任何想法?

提前谢谢! (这里是小提琴:http://jsfiddle.net/e62pE/2/

1 个答案:

答案 0 :(得分:0)

解决方法

为了避免这个问题,我发现有两件事有助于解决这个问题。

  1. 仅将CSS规则应用于应受此设置影响的元素,并且仅应用于包含所有这些元素的最高元素。 (例如,如果要影响表中的几行,只影响特定的表行,而不是影响整个表,或者更糟的是整个文档。)

  2. 仅在应避免选择时应用CSS规则,之后删除规则。这使DOM保持清洁和响应。

  3. WebKit Bugzilla实际上包含描述此问题的bug report

    我的情况

    我在调试与您描述的完全相同的效果时得出了这个结论,在那里我设法创建了一个在所有主流浏览器中工作的变通方法。我不确定这是否也适用于你的具体情况,但是,这里也是如此。

    我的<table>有数百,数千甚至更多,<tr>。当用户 SHIFT - 单击一行时,我想将样式应用于一系列行,范围从上一个单击的行到 SHIFT -clicked的行,而不在过程中选择文本。

    首先我将user-select: none; CSS添加到table.user-select-none td,这基本上意味着所有细胞都受到影响(可以相当多)。

    现在,解决方法仅在 SHIFT + Mouse Down中使用类,并且仅使用CSS选择器<tr>将该类应用于范围中的tr.user-select-none。在一个小的超时(40毫秒)之后,该类被删除,以保持DOM整洁和响应。

    这种解决方法将选择过程从平均500毫秒加速到50毫秒,使其成为现在可行的解决方案。