页面点击特效

471 阅读3分钟

之前在浏览一个博客时,发现了鼠标点击页面会出现文字特效,事后想着怎么实现,这里给出demo的源码和实现过程中一些需要注意的知识点。

实现的效果:鼠标点击页面时,光标处会淡入淡出一个词语

先给出demo的代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>demo</title>
    <style>
    /* css3动画 */
      @keyframes myFirst {
        from {
          opacity: 0;
        }
        to {
          opacity: 1;
        }
      }

      @keyframes mySecond {
        from {
          opacity: 1;
          /* background-color: red */
        }
        to {
          opacity: 0;
          /* background-color: blue; */
        }
      }
      .body {
        width: 1024px;
        height: 1024px;
        background-color: aliceblue;
      }
      .newDiv {
        position: absolute;
        width: 40px;
        height: 30px;
        text-align: center;
        animation: myFirst 0.8s;   /* 淡入 */
        animation: mySecond 0.8s;  /* 淡出 */
      }
    </style>
  </head>
  <body class="body">
  </body>
  <script>
    var arr = ["富强", "民主", "文明", "和谐", "自由", "平等", "公正", "法治"];
    let mark = true;
    document.body.onmousedown = function(e) {
      if (mark) {
        mark = false;
        var clientX = e.clientX;
        var clientY = e.clientY;
        var index = Math.floor(Math.random() * 8);
        var text = arr[index];
        createDiv(clientX, clientY, text);
        var body = document.body;
        var div = document.getElementsByClassName("newDiv")[0];
        setTimeout(() => {
          body.removeChild(div);
        }, 1600);
        setTimeout(()=>{
          mark = true
        },1600);
      } else {
        // alert('你点的太快了');
      }
    };

    function createDiv(x, y, text) {
      var colorArr = ["red", "yellow", "green", "blue", "orange", "black"];
      var index = Math.floor(Math.random() * colorArr.length);
      var color = colorArr[index];
      var newDiv = document.createElement("div");
      newDiv.innerText = text;
      newDiv.classList.add("newDiv");
      newDiv.style.color = color;
      newDiv.style.opacity = 0;
      newDiv.style.left = x + "px";
      newDiv.style.top = y + "px";
      document.body.appendChild(newDiv);
    }
  </script>
</html>

复制以上代码,新建文件,浏览器打开,鼠标点击,即可看到效果。

demo实现过程中需要注意的点:

  1. 怎么获取鼠标点击处的坐标。

    当发生鼠标事件时,事件对象中包括这些这些属性:

    clientX,clientY:客户区坐标,这两个属性保存着事件发生时,光标在浏览器视口中的位置信息。

    pageX,pageY:页面坐标 这两个属性保存着事件发生时,光标在页面中的位置信息(IE8及以下版本不支持这两个属性,不过可以使用客户区坐标和滚动信息计算出来)。

        //IE8及以下版本,其他浏览器可以直接使用页面坐标.
        pageY = clientY + (document.body.srollTop || document.documentElement.scrollTop)
        pageX = clientX + (document.body.srollLeft || document.documentElement.scrollLeft)
        //document.body为混杂模式,document.documentElement 为标准模式
        //从上面的表达式中,也可以看出,如果页面没有滚动,客户区坐标和页面坐标的值是一致的。
    

    screenX,screenY:屏幕坐标位置,这两个属性保存着事件发生时,光标在屏幕上的位置信息。

  2. 怎么限制点击的频率

    一种方法是,在事件回调函数外声明一个变量,通过控制该变量的布尔值,控制用户的点击频率不至于太快

        let mark = true;
        document.body.onmousedown = function(e){
            if(mark){
                mark = false;
                ...  //逻辑代码
                setTimeout(()=>{
                    mark = true
                },2000)  
            } else{
                alert('你点击的太快了') //或者什么也不做。
            }
        }
    

    另一种方法接收超时调用返回的ID值,如果在指定的时间内重复触发事件,会取消超时调用,重新进行超时调用。 这种实现方法并不能准确的限制点击的频率。

        let timer =null;
        document.body.addEventListener('click',function(e){
         clearTimeout(timer);
         timer = setTimeout(function(){
             ...//你的逻辑
         },2000)
    })