JS实现鼠标框选效果完整实例

下面是详细的“JS实现鼠标框选效果完整实例”的完整攻略,包含两条示例说明。

概述

鼠标框选效果是一种常见的 Web 应用程序 UI 设计。具体来说,通过 JavaScript 实现鼠标框选效果,可以让用户在多个元素中选择他们想要的元素。

实现鼠标框选效果的核心在于:鼠标按下之后从鼠标按下位置到鼠标移动位置之间的所有元素会被高亮标记,鼠标释放后,所有被标记的元素应该被选中。

实现步骤

  1. 添加一个鼠标按下事件监听器
    • 当鼠标按下时,需要记录开始选取的起点位置
    • 开始选取后可以清除所有的选中状态
  2. 添加一个鼠标移动事件监听器
    • 记录当前移动位置
    • 计算选择框的位置和大小
    • 找到位于选择框内的所有元素
    • 将这些元素标记为选中状态
  3. 添加一个鼠标释放事件监听器
    • 清除所有选择框和选择状态

代码实现

下面,我们提供一个完整的例子来演示如何使用 JavaScript 实现鼠标框选效果的实战应用。

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>JS 实现鼠标框选效果</title>
    <style>
        .box {
            width: 100px;
            height: 50px;
            background-color: #ccc;
            border: 1px solid #000;
            margin: 10px;
            float: left;
            position: relative;
        }

        .box.selected {
            background-color: #f00;
        }
    </style>
</head>

<body>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>

    <script>
        var isMouseDown = false;
        var isMouseMove = false;
        var container = document.body;
        var selection = document.createElement('div');
        var oriX, oriY;
        var curX, curY;
        var offsetX = container.offsetLeft,
            offsetY = container.offsetTop;
        var boxes = document.querySelectorAll('.box');

        selection.style.cssText = 'border: 1px dashed #000; position: absolute; background-color: #eee; opacity: 0.5; z-index: 1000;';

        container.addEventListener('mousedown', function (e) {
            isMouseDown = true;
            isMouseMove = false;
            oriX = e.clientX - offsetX;
            oriY = e.clientY - offsetY;

            selection.style.left = oriX + 'px';
            selection.style.top = oriY + 'px';
            selection.style.width = '0px';
            selection.style.height = '0px';
            container.appendChild(selection);

            boxes.forEach(function (item) {
                item.classList.remove('selected');
            });
        });

        container.addEventListener('mousemove', function (e) {
            if (!isMouseDown) {
                return false;
            } else {
                isMouseMove = true;
                curX = e.clientX - offsetX;
                curY = e.clientY - offsetY;

                var minWidth = Math.min(oriX, curX);
                var minHeight = Math.min(oriY, curY);
                var maxWidth = Math.abs(curX - oriX);
                var maxHeight = Math.abs(curY - oriY);

                selection.style.left = minWidth + 'px';
                selection.style.top = minHeight + 'px';
                selection.style.width = maxWidth + 'px';
                selection.style.height = maxHeight + 'px';

                for (var i = 0; i < boxes.length; i++) {
                    var boxX = boxes[i].offsetLeft + boxes[i].offsetWidth,
                        boxY = boxes[i].offsetTop + boxes[i].offsetHeight;
                    if (boxX > minWidth && boxY > minHeight && boxes[i].offsetLeft < (minWidth + maxWidth) && boxes[i].offsetTop < (minHeight + maxHeight)) {
                        boxes[i].classList.add('selected');
                    } else {
                        boxes[i].classList.remove('selected');
                    }
                }
            }
        });

        container.addEventListener('mouseup', function (e) {
            isMouseDown = false;
            if (selection.parentNode === container) {
                container.removeChild(selection);
            }
            if (isMouseMove === false) {
                boxes.forEach(function (item) {
                    item.classList.remove('selected');
                });
            }
        });
    </script>
</body>

</html>

以上代码用纯 JavaScript 实现了简单的鼠标框选效果,用户可以在网页上单击鼠标左键并拖动,就可以选择指定区域内的元素。同时,在本例中,还实现了鼠标框选状态切换的功能,即当用户框选一块区域,框选区域中包含的元素会被添加选中状态,并且选取出来进行高亮标记。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS实现鼠标框选效果完整实例 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 数组Array的一些方法(总结)

    下面是“数组Array的一些方法(总结)”的完整攻略: 一、数组Array的创建 1.1 声明一个空数组 let arr = []; 1.2 声明一个有初始元素的数组 let arr = [1, 2, 3]; 1.3 声明一个指定长度的数组 let arr = new Array(3); 1.4 声明一个指定长度并且有初始元素的数组 let arr = ne…

    JavaScript 2023年5月27日
    00
  • Chrome扩展页面动态绑定JS事件提示错误

    Chrome扩展开发中,我们经常需要在选项页面或者弹窗页面中动态绑定JS事件。但是在实际开发的过程中,发现有时候动态绑定事件会出现错误,需要我们进行排查。下面是一个完整攻略,帮助开发人员解决这个问题。 1. 确认目标事件是否正确绑定 在进行动态绑定事件时,我们需要确认目标事件是否正确绑定。例如,我们在页面中找到一个按钮,需要在按钮上动态绑定click事件,如…

    JavaScript 2023年6月10日
    00
  • javascript如何实现create方法

    当我们在 JavaScript 中使用面向对象编程时,有时需要创建一个对象模板,并基于该模板创建许多对象实例。JavaScript 的原型继承机制允许我们通过创建一个构造函数模板并向其原型对象添加方法和属性来实现这一目的。在这个过程中,我们可以使用 JavaScript 中的 create 方法,其允许我们基于一个现有对象创建一个新对象。 下面是使用 cre…

    JavaScript 2023年5月27日
    00
  • 解决JS内存泄露之js对象和dom对象互相引用问题

    解决JS内存泄露(memory leak)之js对象和dom对象互相引用问题需要我们重视,因为它可能导致页面性能下降以及系统崩溃等问题。本文将通过以下几个方面来探讨此问题的解决方案: 什么是JS内存泄露问题? 为什么JS对象和DOM对象互相引用会造成内存泄露? 如何解决JS对象和DOM对象互相引用的问题? 1. 什么是JS内存泄露问题? JavaScript…

    JavaScript 2023年6月10日
    00
  • vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)

    vue+axios 前端实现登录拦截的两种方式 在使用Vue开发前端项目时,通常会使用axios进行后端接口调用,而在实现用户登录后,我们通常需要对未登录的用户进行拦截,以保护系统的安全性。接下来将讲解如何使用Vue+axios实现前端登录拦截的两种方式:路由拦截和http拦截。 方式一:路由拦截 步骤一:创建全局路由守卫 在Vue项目主入口文件中,通过Vu…

    JavaScript 2023年6月11日
    00
  • JS利用 clip-path 实现动态区域裁剪功能

    我会为您提供详细的“JS利用 clip-path 实现动态区域裁剪功能”的攻略,以下是具体步骤: 步骤1:了解 clip-path 属性 clip-path 属性可以用来裁剪任何元素的视觉外观(裁剪作用是基于矢量路径)。通过定义一个有规律或不规律的形状,在视觉上裁剪页面元素。可以定义多种形状:矩形、椭圆、多边形和其他基本形状。也可以通过引用 SVG 的 路径…

    JavaScript 2023年6月11日
    00
  • 使用mixins实现elementUI表单全局验证的解决方法

    使用mixins实现elementUI表单全局验证的解决方法 什么是mixins? 在Vue中,mixins是一种可复用功能的方式,其本质是一个对象,在Vue组件中通过mixins属性将其引入,可以让组件具备该对象的属性和方法。 elementUI表单全局验证的需求 在使用elementUI的表单组件时,我们往往需要对表单进行全局验证,例如输入框不能为空、手…

    JavaScript 2023年6月10日
    00
  • JS实现环形进度条(从0到100%)效果

    JS实现环形进度条(从0到100%)效果 简介 环形进度条是一种常用的进度展示方式,它以环形的形式展示出进度的百分比。在这个攻略中,我们将通过JS实现一个从0到100%的环形进度条,并提供两个示例说明。 实现 HTML结构 首先,我们需要在HTML中创建一个div元素,该元素包含两个子元素,用于实现环形进度条的效果。 <div class="…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部