美文网首页Web前端之路
mousemove事件,鼠标移动过快时,无法全部响应

mousemove事件,鼠标移动过快时,无法全部响应

作者: 青天诀 | 来源:发表于2019-06-19 11:51 被阅读26次

问题描述:

项目中,运用mousemove来实现绘制圆形时,发现鼠标移动速度过快时,绘制的圆形,不能连接一起,中间出现断点,无法形成一条完整的路径。

问题分析:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件</title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        #content{
            width: 200px;
            height: 200px;
            border: 1px solid #ccc;
            background-color: blue;
            margin: 0 auto;
        }

    </style>
</head>
<body>
    <div id="content"></div>
    <script type="text/javascript">
        var box=document.getElementById("content");
        var isMouseDown=false;
        var t=0;
        box.addEventListener("mousemove",function(e){
            if(isMouseDown){
                console.log("move");    
                /*t++;
                console.log(t);*/
            }
            
        });
        box.addEventListener("mousedown",function(e){
            isMouseDown=true;
        });
        document.addEventListener("mouseup",function(e){
            isMouseDown=false;
        });

    </script>
</body>
</html>

鼠标移动过快时效果图:

在这里插入图片描述

鼠标移动缓慢时效果图:

20150901183909954.jpg

经过如上代码分析,发现当鼠标移动过快时,console.log("move")执行的次数很少;当鼠标移动足够缓慢时,执行次数鼠标移动的像素数近似(这正好验证了,当每移动一个像素时,就会触发mousemove事件)。

原因:鼠标移动时,不会存储所有的移动信息,而是通过取插值的方法取得鼠标位置信息,否则,系统会被鼠标移动拖垮。所以就会出现,移动过快时,出现断点的问题。

解决方案:

绘制移动轨迹时,最常想到的方案就是通过每移动一个像素,就绘制一个圆,让所有圆连接在一起,正好形成轨迹。(下图中的圆,就是每移动一个像素,绘制出的圆,连接在一起就是一条轨迹路径)


在这里插入图片描述

理想是美好的,现实是残酷的。正如上面分析的那样,mousemove事件的响应时间粒度不够,鼠标移动过快时,不能做到移动一个像素,响应一次mousemove事件,所以无法通过移动一个像素就绘制一个圆,进而形成连续轨迹路径。如下图所示,移动过快时,路径会间断。


在这里插入图片描述

我们换种思路,第一次mousemove响应时,记录为起点startPoint,第二次响应记录为终点endPoint,将两点相连绘制直线,就不会出现中间断点的情况。
为了美观,可以利用lineCap属性,可以保证直线两端为圆角,如下所示:

ctx.beginPath();
ctx.lineCap="round";
ctx.moveTo(20,40);
ctx.lineTo(200,40);
ctx.stroke();
在这里插入图片描述

这样我们的问题就解决了
演示效果:http://zhaoshaobang.github.io/blog/lottery/

相关文章

  • mousemove事件,鼠标移动过快时,无法全部响应

    问题描述: 项目中,运用mousemove来实现绘制圆形时,发现鼠标移动速度过快时,绘制的圆形,不能连接一起,中间...

  • JS事件

    1. 鼠标事件 mousedown 鼠标按下时触发 mousemove 鼠标在目标元素上移动时处罚 mouse...

  • jQuery基础-事件篇

    1、鼠标事件 常见的click等事件这里不做详细介绍 1、mousemove: 用来监听用户移动的操作,基于移动的...

  • 鼠标点击事件流

    总结一下鼠标从按下触发的事件,和事件的冒泡情况。 事件类型:mousedown(按下),mousemove(移动)...

  • JS补充27–事件2

    事件分类 鼠标事件 click,mousedwon,mousemove,mouseup,conte...

  • javascript事件, 解决mousedown和click冲

    事件分类 鼠标事件 click/ mousedown/ mousemove/ mouseup/ contextme...

  • js 函数节流和防抖

    js 函数节流和防抖 throttle 节流 应用场景 触发mousemove事件的时候, 如鼠标移动。 触发ke...

  • 事件处理

    一、几个专有名词的解释 1.事件类型 用来说明发生什么类型事件的字符串。例如“mousemove”表示用户移动鼠标...

  • 前端元素拖拽原理

    拖放的基本概念 创建一个绝对定位的元素,使其可以用鼠标移动依据mousemove事件处理,(clientX,cli...

  • CSS3神奇的样式 pointer-events: none

    让标签不接受鼠标事件(含click,mousemove,mouseup之类的)

网友评论

    本文标题:mousemove事件,鼠标移动过快时,无法全部响应

    本文链接:https://www.haomeiwen.com/subject/isvhqctx.html