当前位置:   article > 正文

js小功能--如何实现按住shift拖拽多选div_js鼠标多选

js鼠标多选

此功能为按住shift鼠标拖拽实现多选

html:

  1. <div class="box">1</div>
  2. <div class="box">2</div>
  3. <div class="box">3</div>
  4. <div class="box">4</div>
  5. <div class="box">5</div>
  6. <div class="box">6</div>
  7. <div class="box">7</div>
  8. <div class="box">8</div>
  9. <div class="box">9</div>
  10. <div class="box">10</div>

css:

  1. .box {
  2. width: 100px;
  3. height: 100px;
  4. background-color: #ccc;
  5. margin: 10px;
  6. float: left;
  7. }
  8. .selected {
  9. border: 2px solid red;
  10. }

样式中 selected 是拖拽后添加的样式,可随意更改

js:

  1. let isMouseDown = false; // 鼠标是否按下
  2. let isShiftDown = false; // Shift键是否按下
  3. let startX, startY, endX, endY; // 开始和结束位置
  4. let selectedDivs = []; // 被选中的div
  5. // 鼠标按下事件
  6. document.addEventListener('mousedown', e => {
  7. if (e.shiftKey) { // 如果同时按下了Shift键
  8. isMouseDown = true;
  9. startX = e.pageX;
  10. startY = e.pageY;
  11. }
  12. });
  13. // 鼠标移动事件
  14. document.addEventListener('mousemove', e => {
  15. if (isMouseDown && e.shiftKey) { // 如果同时按下了Shift键并且鼠标处于按下状态
  16. endX = e.pageX;
  17. endY = e.pageY;
  18. selectDivs();
  19. }
  20. });
  21. // 鼠标释放事件
  22. document.addEventListener('mouseup', e => {
  23. isMouseDown = false;
  24. isShiftDown = false;
  25. selectedDivs.forEach(div => {
  26. div.classList.remove('selected');
  27. });
  28. selectedDivs = [];
  29. });
  30. // 选择div
  31. function selectDivs() {
  32. let boxes = document.querySelectorAll('.box');
  33. boxes.forEach(box => {
  34. box.classList.remove('selected'); // 先将之前被选中的div都取消选中状态
  35. let boxRect = box.getBoundingClientRect();
  36. if (boxRect.left <= endX && boxRect.right >= startX && boxRect.top <= endY && boxRect.bottom >= startY) {
  37. box.classList.add('selected'); // 如果当前div在选择框内,则加上选中状态
  38. if (!selectedDivs.includes(box)) { // 如果之前没有被选中,则添加到选中数组中
  39. selectedDivs.push(box);
  40. }
  41. }
  42. });
  43. }

最终实现效果:

全部代码,拿走即用:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Shift + 点击拖拽多选div</title>
  6. <style>
  7. .box {
  8. width: 100px;
  9. height: 100px;
  10. background-color: #ccc;
  11. margin: 10px;
  12. float: left;
  13. }
  14. .selected {
  15. border: 2px solid red;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <div class="box">1</div>
  21. <div class="box">2</div>
  22. <div class="box">3</div>
  23. <div class="box">4</div>
  24. <div class="box">5</div>
  25. <div class="box">6</div>
  26. <div class="box">7</div>
  27. <div class="box">8</div>
  28. <div class="box">9</div>
  29. <div class="box">10</div>
  30. <script>
  31. let isMouseDown = false; // 鼠标是否按下
  32. let isShiftDown = false; // Shift键是否按下
  33. let startX, startY, endX, endY; // 开始和结束位置
  34. let selectedDivs = []; // 被选中的div
  35. // 鼠标按下事件
  36. document.addEventListener('mousedown', e => {
  37. if (e.shiftKey) { // 如果同时按下了Shift键
  38. isMouseDown = true;
  39. startX = e.pageX;
  40. startY = e.pageY;
  41. }
  42. });
  43. // 鼠标移动事件
  44. document.addEventListener('mousemove', e => {
  45. if (isMouseDown && e.shiftKey) { // 如果同时按下了Shift键并且鼠标处于按下状态
  46. endX = e.pageX;
  47. endY = e.pageY;
  48. selectDivs();
  49. }
  50. });
  51. // 鼠标释放事件
  52. document.addEventListener('mouseup', e => {
  53. isMouseDown = false;
  54. isShiftDown = false;
  55. selectedDivs.forEach(div => {
  56. div.classList.remove('selected');
  57. });
  58. selectedDivs = [];
  59. });
  60. // 选择div
  61. function selectDivs() {
  62. let boxes = document.querySelectorAll('.box');
  63. boxes.forEach(box => {
  64. box.classList.remove('selected'); // 先将之前被选中的div都取消选中状态
  65. let boxRect = box.getBoundingClientRect();
  66. if (boxRect.left <= endX && boxRect.right >= startX && boxRect.top <= endY && boxRect.bottom >= startY) {
  67. box.classList.add('selected'); // 如果当前div在选择框内,则加上选中状态
  68. if (!selectedDivs.includes(box)) { // 如果之前没有被选中,则添加到选中数组中
  69. selectedDivs.push(box);
  70. }
  71. }
  72. });
  73. }
  74. </script>
  75. </body>
  76. </html>

通过鼠标按下和移出动态转换事件和鼠标移动的距离动态记录鼠标所经过的div实现此效果,代码中的拖拽样式可随意更改,根据此主体作为功能的框架可以实现很多的效果,感兴趣的就赶紧试一下吧 (*>.<*)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/477093
推荐阅读
  

闽ICP备14008679号