js 页面动态创建一个坐标(图标)

橙三吉。 提交于 2020-01-03 05:39:54

问题来源

在一个地图中,使用鼠标点击,添加一个mark(图标),来标识摄像头所在的位置

解决思路

添加一个div 元素在body最后,然后使用绝对定位(absolute),并让div的定位坐标与鼠标保持一致

案例

<!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" />
    <script src="./src/assets/jquery.min.js"></script>
    <title>Document</title>
  </head>
  <style>
    .img-box {
      border: 1px solid red;
      height: 200px;
      width: 200px;
    }
    .flower-container {
      display: inline-block;
      position: absolute;
      height: 38px;
      width: 38px;
      background-image: url("./src/assets/flower.png");
    }
  </style>
  <body>
    <div class="img-box" onmousedown="getFlower(event)"></div>
    <div class="flower-container"></div>
  </body>
  <script>
    // 缓存 body 元素对象
    let bodyObj = document.getElementsByTagName("body")[0];
    // 鼠标按下,触发的事件
    function getFlower(event) {
      // 创建一个 DIV 元素对象
      let flowerContainer = createFlowerDiv(event);
      // 兼容性处理
      event = event || window.event;
      // 缓存 鼠标点击时 的位置
      let movex;
      let movey;
      if (event.pageX || event.pageY) {
        movex = event.pageX;
        movey = event.pageY;
      }
      // 将创建的 DIV 元素 的位置设置为鼠标点击的位置
      flowerContainer.style.left = movex + "px";
      flowerContainer.style.top = movex + "px";
      // 将添加的 div 元素,添加在body 元素最后
      bodyObj.appendChild(flowerContainer);
      // 将元素改为 jquery 对象
      let nDiv = $(flowerContainer);

      // 给document添加mouseup事件
      $(document).on("mouseup", dragMouseupEvent);
      // 给document添加 mousemove 事件
      $(document).on("mousemove", dragMousemoveEvent);
      // 松开鼠标,应该关闭绑定的 mousemove 和 mouseup 事件
      function dragMouseupEvent(e) {
        // mouseup结束后解绑mousemove
        $(document).off("mousemove", dragMousemoveEvent);
        // mouseup结束后解绑mouseup
        $(document).off("mouseup", dragMouseupEvent);
      }
      // 鼠标移动的时候,设置元素的坐标与鼠标坐标保持一致
      function dragMousemoveEvent(e) {
        nDiv.css({ left: e.pageX, top: e.pageY });
      }
    }

    // 创建 flower 对象
    function createFlowerDiv(event) {
      // 创建DIV 对象
      let divObj = document.createElement("div");
      divObj.setAttribute("class", "flower-container");
      // 创建IMG 对象
      // let imgObj = document.createElement("img");
      // imgObj.setAttribute("src","./src/assets/flower.png");
      // 将img 对象挂载到 div 对象下面
      // divObj.appendChild(imgObj);
      // 返回div 对象
      return divObj;
      // bodyObj.appendChild(divObj);
    }
  </script>
</html>

如果是绑定到元素上,鼠标移动会非常的卡?

解决办法

onmousemove 事件尽量绑定到document上

原因分析

事件是基于“冒泡”,因此把 onmousemove 事件绑定到document上比绑定到具体的元素上,效率要高很多

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!