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

yizhihongxing

下面是详细的“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日

相关文章

  • 详解vite+ts快速搭建vue3项目以及介绍相关特性

    详解vite+ts快速搭建vue3项目以及介绍相关特性 概述 在本篇教程中,我们将详细讲解使用vite和typescript快速搭建Vue3项目的步骤,并介绍Vue3的相关特性。 准备工作 在开始之前,需要确保你已经安装了node.js和npm包管理器。如果你没安装,可以前往官网下载安装程序。 创建项目 步骤如下:1. 打开终端,进入你想要创建项目的目录。2…

    JavaScript 2023年6月11日
    00
  • JavaScript手机振动API

    JavaScript手机振动API可以在移动设备上实现震动控制,让手机产生震动效果。本攻略将详细介绍如何使用JavaScript实现手机振动。 导入API 要使用JavaScript的手机振动API,需要使用Vibration API,该API基于Promise对象,包含两个方法:vibrate()和cancelVibration()。 要使用Vibrati…

    JavaScript 2023年6月11日
    00
  • 详解Python中logging日志模块在多进程环境下的使用

    1. 概述 logging是Python官方提供的通用日志模块,可以帮助开发者轻松实现对程序的日志记录和管理。在多进程环境下,要想实现多个进程共同使用同一个日志文件,需要使用logging模块的多进程支持。 本文主要介绍如何使用logging模块在多进程环境下进行日志记录。 2. 配置多进程支持 在使用logging模块时,需要先对其进行配置。在多进程环境下…

    JavaScript 2023年5月28日
    00
  • js类中获取外部函数名的方法

    获取外部函数名指的是在类中获取调用当前类的函数的名称。在JavaScript中,可以通过arguments.callee.caller来获取调用函数的信息,进而获取函数名。 具体步骤如下: 定义类,并在其中定义一个属性名为callerName的函数。代码如下: class Test { constructor() { this.callerName = th…

    JavaScript 2023年5月27日
    00
  • ES6中字符串string常用的新增方法小结

    ES6中字符串string常用的新增方法有很多,本文将对其中常用的方法进行小结,帮助读者更好地理解和使用ES6字符串方法。 1. 字符串模板(Template) 字符串模板(Template)在ES6中是一项非常重要的新功能,它使我们可以更加方便地处理字符串拼接。 1.1 语法 模板字符串使用反引号(“`)包裹字符串,可以在字符串中插入变量或表达式: le…

    JavaScript 2023年5月28日
    00
  • JavaScript判断变量是否为数组的方法(Array)

    JavaScript提供了多种方法来判断一个变量是否为数组。下面是两种常见的方式: 1. 使用Array.isArray()方法 Array.isArray()是ES5中添加的一个方法,用于判断一个变量是否为数组类型。它接受一个参数,该参数可以是任何类型的变量,如果是数组,则返回true;否则返回false。 var arr = [1, 2, 3]; con…

    JavaScript 2023年5月27日
    00
  • javascript demo 基本技巧

    首先,我们要了解何谓 JavaScript Demo,这其实是一种基于 JavaScript 语言开发的小型互动演示,它可以运行在浏览器端或 Node.js 等环境中,用于展示和演示某项特定功能或效果。 下面,我将分享一些 JavaScript Demo 开发的基本技巧,帮助大家更好地开发出功能强大且易维护的演示程序。 好的 JavaScript Demo …

    JavaScript 2023年5月27日
    00
  • anime.js 实现带有描边动画效果的复选框(推荐)

    Anime.js 实现带有描边动画效果的复选框攻略 简介 Anime.js 是一个轻量级的 JavaScript 动画库,可以用来快速的创建各种各样的动画效果。本攻略将介绍如何通过 Anime.js 实现带有描边动画效果的复选框。 步骤 1. 安装 Anime.js 我们首先需要安装 Anime.js,可以通过 npm 或者直接下载源码安装。 npm ins…

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