Skip to content

1209 今日总结

今日工作

  • 迭代开发

今天的开发接触了很多 鼠标事件

  • onClick
  • onDblClick
  • onMouseDown 鼠标按下
  • onMouseUp 鼠标松开
  • onMouseEnter 鼠标移入
  • onMouseOver 当鼠标移动到某对象范围的上方时触发的事件
  • onMouseMove 鼠标移动时触发的事件
  • onMouseOut 当鼠标离开某对象范围时触发的事件
  • onKeyPress
  • onKeyDown
  • onKeyUp

明天会用到 图片的拖拽相关,先学习了解相关的资料:

在 HTML 中,只有以下元素默认可以拖拉:

  • 图片
  • 链接
  • 选中的文字

对于其他的元素,如果要实现可拖动,需要添加 属性 draggable="true", 例如:

html
<div draggable="true">
  此区域可拖拉
</div>

学习了解以下拖拉相关的 事件:

具体代码:

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Dom Drag Event</title>
    <style type="text/css">
      div {
        width: 100px;
        height: 100px;
        background-color: gray;
        margin-bottom: 20px;
      }
      #draggable {
        position: absolute;
      }
      </style>
  </head>
  <body draggable="true">
    <div class="dropzone" id="0">
      <div id="draggable" draggable="true">
        该节点可拖拉
      </div>
    </div>
    <div class="dropzone" id="1"></div>
    <div class="dropzone" id="2"></div>
    <div class="dropzone" id="3"></div>

    <script>
      // 被拖拉节点
      var dragged;
      var dif = {};
      document.addEventListener('dragstart', function (event) {
        dif.x = event.clientX - event.target.offsetLeft;
        dif.y = event.clientY - event.target.offsetTop;
        // 保存被拖拉节点
        dragged = event.target;
        // 被拖拉节点的背景色变透明
        event.target.style.opacity = 0.5;
      }, false);

      document.addEventListener('dragend', function (event) {
        dragged.style.left = (event.clientX - dif.x) + "px";
        dragged.style.top = (event.clientY - dif.y) + "px";
        // 被拖拉节点的背景色恢复正常
        event.target.style.opacity = '';
      }, false);

      document.addEventListener('dragover', function (event) {
        // 防止拖拉效果被重置,允许被拖拉的节点放入目标节点
        event.preventDefault();
      }, false);

      document.addEventListener('dragenter', function (event) {
        // 目标节点的背景色变紫色
        // 由于该事件会冒泡,所以要过滤节点
        if (event.target.className === 'dropzone') {
          event.target.style.background = 'purple';
        }
      }, false);

      document.addEventListener('dragleave', function( event ) {
        // 目标节点的背景色恢复原样
        if (event.target.className === 'dropzone') {
          event.target.style.background = '';
        }
      }, false);

      document.addEventListener('drop', function( event ) {
        // 防止事件默认行为(比如某些元素节点上可以打开链接),
        event.preventDefault();
        if (event.target.className === 'dropzone') {
          // 恢复目标节点背景色
          event.target.style.background = '';
          // 将被拖拉节点插入目标节点
          dragged.parentNode.removeChild(dragged);
          event.target.appendChild( dragged );
        }
      }, false);
    </script>
  </body>
</html>

当然,

也可以使用 onmousedown, onmouseup, onmouseover 三个鼠标事件实现拖动;

简单写了个一个 有 bug 的例子:drag-div-with-mouse-event

相关资料:

资料:

今日算法

今日学习:

今日复习:

手撕代码

防抖节流等各种手写,http和网络,浏览器原理,性能优化,Webpack

利用 mouse 事件写一个可拖拽的 div

html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
  <style type="text/css">
    div {
    border: 1px solid red;
    position: absolute;
    top: 0;
    left: 0;
    width: 100px;
    height: 100px;
  }

*{margin:0; padding: 0;}
  </style>
</head>
<body>
<div id="xxx"></div>

<script>
  var dragging = false
  var position = null

  xxx.addEventListener('mousedown',function(e){
    dragging = true
    position = [e.clientX, e.clientY]
  })

  document.addEventListener('mousemove', function(e){
    if(dragging === false){return}
    console.log('hi')
    const [x, y] = [e.clientX, e.clientY]
    const [originX, originY] = position || [0, 0]
    const [deltaX, deltaY] = [x - originX, y - originY]
    const [left, top] = [parseInt(xxx.style.left || 0), parseInt(xxx.style.top || 0)]
    xxx.style.left = left + deltaX + 'px'
    xxx.style.top = top + deltaY + 'px'
    position = [x, y]
  })
  document.addEventListener('mouseup', function(e){
    dragging = false
  })
</script>

</body>
</html>

核心要点

需要使用 document.addEventListener('mousemove',fn) 而不是 dom.addEventListener('mousemove',fn) 否则会有 bug,拖拽过程中移出了 拖拽体,就出bug 了

心情

好文推荐

有感好文

反问一下自己:你的 2021 总结是什么样呢?

项目/博客推荐

值得学习的项目/作者

面经相关

八股文相关

明日计划

  • 算法:
    • 学习:
    • 复习:
  • 手写:
  • 面经复习:

TODOS

短期内要做的事情

  • 每天看这么多文章,也仅仅只是看过了,希望日后每次文章阅读,都能 写/摘抄几句话的感悟和成长
  • 多进行体系化阅读,持之以恒和坚持输出;
  • 自定义Hook会很难吗? 学习了解一下自定义 hook
  • 2021 年年中总结;

Released under the MIT License.