模板部分

    1. <template>
    2. <div class="home">
    3. <div id="box" v-drag></div>
    4. </div>
    5. </template>

    自定义指令

    1. <script>
    2. // @ is an alias to /src
    3. export default {
    4. name: "Home",
    5. data() {return {}},
    6. directives: {
    7. drag: {
    8. // 指令的定义
    9. inserted: function(el) {
    10. // el.drag();
    11. console.log(el);
    12. //获取元素
    13. // var dv = document.getElementById("dv");
    14. let x = 0;
    15. let y = 0;
    16. let l = 0;
    17. let t = 0;
    18. let isDown = false;
    19. //鼠标按下事件
    20. el.onmousedown = function(e) {
    21. //获取x坐标和y坐标
    22. x = e.clientX;
    23. y = e.clientY;
    24. //获取左部和顶部的偏移量
    25. l = el.offsetLeft;
    26. t = el.offsetTop;
    27. //开关打开
    28. isDown = true;
    29. //设置样式
    30. el.style.cursor = "move";
    31. };
    32. //鼠标移动
    33. window.onmousemove = function(e) {
    34. if (isDown == false) {
    35. return;
    36. }
    37. //获取x和y
    38. let nx = e.clientX;
    39. let ny = e.clientY;
    40. //计算移动后的左偏移量和顶部的偏移量
    41. let nl = nx - (x - l);
    42. let nt = ny - (y - t);
    43. el.style.left = nl + "px";
    44. el.style.top = nt + "px";
    45. };
    46. //鼠标抬起事件
    47. el.onmouseup = function() {
    48. //开关关闭
    49. isDown = false;
    50. el.style.cursor = "default";
    51. };
    52. }
    53. }
    54. }
    55. };
    56. </script>

    样式部分

    1. <style lang="scss" scoped>
    2. #box {
    3. width: 60px;
    4. height: 60px;
    5. background-color: darkorange;
    6. border-radius: 50%;
    7. position: absolute;
    8. //脱离文档流
    9. }
    10. </style>