CodeSky 代码之空

随手记录自己的学习过程

JavaScript 优化拖移效果

2017-05-15 16:42分类: JavaScript评论: 0

上次我们在 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)