JavaScript 优化拖移效果
上次我们在 Canvas 实现根据背景色更改前景色中使用了一个拖动效果,刚开始非常智障的用 Drag & Drop,后来由于我们更关注一个即时的反馈,所以用
mousedown
/mousemove
/mouseup
。
最初我们绑定 mousemove
在待拖动的 element
中,结果在移动中如果速度过快,会导致 mousemove
离开 element
,于是我们把 mousemove
改绑到 document
中。
这样的效果其实仍然有些卡,或者说移动的延迟,尽管最终会到达鼠标所在的位置,高速移动时却不时刻在鼠标下面。之后我们用捕获来代替默认 addEventListener
的冒泡阶段触发:
之后,如果需要在移动时取消所有鼠标的响应时间,可以通过调整 pointer-events
样式来修改,在变更拖动状态时修改 body 的 style 即可。
1function preventGlobalMouseEvents () {
2 document.body.style['pointer-events'] = 'none';
3}
4
5function restoreGlobalMouseEvents () {
6 document.body.style['pointer-events'] = 'auto';
7}
8
9document.addEventListener('mousemove', event => {
10 if (drag) {
11 text.style.left = (event.pageX - text.clientWidth / 2) + 'px';
12 text.style.top = (event.pageY - text.clientHeight / 2) + 'px';
13 const [r, g, b] = echoColor(event.pageX, event.pageY, ctx);
14 text.style.color = gray(r, g, b) / 255 < 0.5 ? '#fff' : '#000';
15 }
16}, false);
17text.addEventListener('mousedown', event => {
18 drag = true;
19}, false);
20document.addEventListener('mouseup', event => {
21 drag = false;
22}, false);
23
参考:
评论 (0)