java鼠标左键按下后拖动实现多选_鼠标拖拽多选功能

鼠标拖拽多选功能

*{

box-sizing:border-box;

}

ul{

width:500px;

height:auto;

margin:0;

padding:20px;

font-size: 0;

/*需设置定位*/

position:relative;

}

li{

width:70px;

height:70px;

margin:10px;

padding:0;

display:inline-block;

vertical-align: top;

font-size: 13px;

border:1px solid #d9d9d9;

}

#moveSelected{

position:absolute;

background-color: blue;

opacity:0.3;

border:1px dashed #d9d9d9;

top:0;

left:0;

}

.selected{

background-color: pink;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

$(document).ready(function(){

let moveSelected=$('#moveSelected')[0];

let flag=false;//是搜开启拖拽的标志

let oldLeft=0;//鼠标按下时的left,top

let oldTop=0;

let selectedList=[];//拖拽多选选中的块集合

// 鼠标按下时开启拖拽多选,将遮罩定位并展现

$(".list").mousedown(function(event) {

flag=true;

moveSelected.style.top=event.pageY+'px';

moveSelected.style.left=event.pageX+'px';

oldLeft=event.pageX;

oldTop=event.pageY;

event.preventDefault(); // 阻止默认行为

event.stopPropagation(); // 阻止事件冒泡

});

// 鼠标移动时计算遮罩的位置,宽 高

$(".list").mousemove(function(event) {

if(!flag) return;//只有开启了拖拽,才进行mouseover操作

if(event.pageX

moveSelected.style.left=event.pageX+'px';

moveSelected.style.width=(oldLeft-event.pageX)+'px';

}else{

moveSelected.style.width=(event.pageX-oldLeft)+'px';

}

if(event.pageY

moveSelected.style.top=event.pageY+'px';

moveSelected.style.height=(oldTop-event.pageY)+'px';

}else{

moveSelected.style.height=(event.pageY-oldTop)+'px';

}

event.preventDefault(); // 阻止默认行为

event.stopPropagation(); // 阻止事件冒泡

});

//鼠标抬起时计算遮罩的right 和 bottom,找出遮罩覆盖的块,关闭拖拽选中开关,清除遮罩数据

$(".list").mouseup(function(event) {

moveSelected.style.bottom=Number(moveSelected.style.top.split('px')[0])+Number(moveSelected.style.height.split('px')[0]) + 'px';

moveSelected.style.right=Number(moveSelected.style.left.split('px')[0])+Number(moveSelected.style.width.split('px')[0])+'px';

findSelected();

flag=false;

clearDragData();

event.preventDefault(); // 阻止默认行为

event.stopPropagation(); // 阻止事件冒泡

});

$(".list").mouseleave(function(event) {

flag=false;

moveSelected.style.width=0;

moveSelected.style.height=0;

moveSelected.style.top=0;

moveSelected.style.left=0;

event.preventDefault(); // 阻止默认行为

event.stopPropagation(); // 阻止事件冒泡

});

function findSelected(){

let blockList=$('.list').find('li');

for(let i=0;i

//计算每个块的定位信息

let left=$(blockList[i]).offset().left;

let right=$(blockList[i]).width()+left;

let top=$(blockList[i]).offset().top;

let bottom=$(blockList[i]).height()+top;

//判断每个块是否被遮罩盖住(即选中)

let leftFlag=moveSelected.style.left.split('px')[0]<=left && left<=moveSelected.style.right.split('px')[0];

let rightFlag=moveSelected.style.left.split('px')[0]<=right && right<=moveSelected.style.right.split('px')[0];

let topFlag=moveSelected.style.top.split('px')[0]<=top && top<=moveSelected.style.bottom.split('px')[0];

let bottomFlag=moveSelected.style.top.split('px')[0]<=bottom && bottom<=moveSelected.style.bottom.split('px')[0];

if((leftFlag || rightFlag) && (topFlag || bottomFlag)){

selectedList.push(blockList[i]);

$(blockList[i]).addClass('selected');

}

}

console.log(selectedList);

}

function clearDragData(){

moveSelected.style.width=0;

moveSelected.style.height=0;

moveSelected.style.top=0;

moveSelected.style.left=0;

moveSelected.style.bottom=0;

moveSelected.style.right=0;

}

});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340512.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python epoll多路复用技术_python IO 多路复用 epoll简单模型

IO多路复用就是我们说的select poll epoll通过一种机制使一个进程能同时等待多个文件描述符&#xff0c;而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态&#xff0c;epoll()函数就可以返回。所以&#xff0c;IO多路复用&#xff0c;本质上不会有并发的功能&#…

python3多线程协程_python3-----多进程、多线程、多协程

目前计算机程序一般会遇到两类I/O&#xff1a;硬盘I/O和网络I/O。我就针对网络I/O的场景分析下python3下进程、线程、协程效率的对比。进程采用multiprocessing.Pool进程池&#xff0c;线程是自己封装的进程池&#xff0c;协程采用gevent的库。用python3自带的urlllib.request和…

Apache CXF 3.0:CDI 1.1支持替代Spring

几周前刚刚发布了Apache CXF 3.0 &#xff0c;该项目又迈出了满足JAX-RS 2.0规范要求的又一个重要步骤&#xff1a;与CDI 1.1集成。 在此博客文章中&#xff0c;我们将看几个有关Apache CXF 3.0和Apache CXF 3.0如何协同工作的示例。 从3.0版开始&#xff0c; Apache CXF包含一…

java varbinary_SQL 中存放 varbinary型数据

使用带有 BULK 选项的 OPENROWSET以下 Transact-SQL 增强功能支持 OPENROWSET(BULK...)函数&#xff1a;与 SELECT 一起使用的 FROM 子句可以调用 OPENROWSET(BULK...)而非表名&#xff0c;同时可以实现完整的 SELECT 功能。带有 BULK 选项的 OPENROWSET 在 FROM 子句中需要有一…

python矩阵左除_matlab学习笔记

Matlab学习笔记运算&#xff1a;1. 算术运算(在矩阵意义下进行):要求矩阵同型,对应元素相加减&#xff0c;如果用标量和矩阵相加减&#xff0c;不同型就凉凉提示错误&#xff0c;那就将矩阵每个元素和数字相加减-&#xff1a;同上*&#xff1a;A*B要求左行右列&#xff0c;…

只读副本和Spring Data第1部分:配置数据库

这是有关我们为利用只读副本来提高应用程序性能而寻求的一系列博客文章。 对于这个项目&#xff0c;我们的目标是建立我们的spring数据应用程序&#xff0c;并使用read仓库进行写操作&#xff0c;并基于read副本进行读操作。 为了模拟这种环境&#xff0c;我们将通过Docker使…

java结构体系_java io结构体系

Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点:1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系2. 原始处理器(适配器)与链接流处理器(装饰器)其结构图如下:Reader-Writer体系1. 基类…

python turtle应用实例_turtle库应用实例2-六芒星的绘制

‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬描述使用turtle库绘制一个六角形&#xff0c;效果如下&#xff1a;‪…

java按钮改变窗口大小_布局似乎有问题,JButton在调整窗口大小时显示出意外的行为。...

很好的例子的问题可能与平台有关&#xff0c;但我可以提供一些观察&#xff1a;您没有添加或删除组件&#xff0c;所以您不需要revalidate().由于背景色是按钮的绑定属性&#xff0c;因此不需要后续调用repaint().你&#xff0c;你们做需要repaint()在你的习惯里DrawingArea&am…

JUnit 5和Selenium –使用Selenium内置的`PageFactory`实现页面对象模式

Selenium是一组支持浏览器自动化的工具和库&#xff0c;主要用于Web应用程序测试。 Selenium的组件之一是Selenium WebDriver&#xff0c;它提供客户端库&#xff0c;JSON有线协议&#xff08;与浏览器驱动程序进行通信的协议&#xff09;和浏览器驱动程序。 Selenium WebDrive…

python 配置文件中密码不能是明文_配置文件中明文密码改为密文密码的方法

我们用java链接数据库&#xff0c;不管是web项目还是小程序&#xff0c;都需要把数据库密码写在配置文件中(当然你要写死在程序里也没有办法)&#xff0c;或者数据库中&#xff0c;通常源代码漏洞扫描都会告诉你不能有明文密码&#xff0c;那么有什么办法可以变为密文呢&#x…

java.lang 源码剖析_java.lang.Void类源码解析

在一次源码查看ThreadGroup的时候&#xff0c;看到一段代码&#xff0c;为以下&#xff1a;/** throws NullPointerException if the parent argument is {code null}* throws SecurityException if the current thread cannot create a* thread in the specified thread group…

vant按需引入没样式_vue vant-ui样式出不来的问题

第一步&#xff1a;安装vantnpm i vant -S // 或 yarn add vant第二步&#xff1a;配置按需引入// 在 babel.config.js 中配置 module.exports {plugins: [[import, {libraryName: vant,libraryDirectory: es,style: true}, vant]] };第三步&#xff1a;配置vue.config.js&…

javaserver_如何在JavaServer Pages中使用Salesforce REST API

javaserver摘要&#xff1a;本教程提供了一个JSP示例以及如何将其与Salesforce REST API集成。 我们将逐步完成创建外部客户端以使用Force.com &#xff08;同时使用HTTP&#xff08;S&#xff09;和JSON&#xff09;管理数据的分步过程。 在此示例中&#xff0c;我将Mac OS X…

jmeter线程数并发数区别_如何确定Kafka的分区数、key和consumer线程数、以及不消费问题解决...

在Kafak中国社区的qq群中&#xff0c;这个问题被提及的比例是相当高的&#xff0c;这也是Kafka用户最常碰到的问题之一。本文结合Kafka源码试图对该问题相关的因素进行探讨。希望对大家有所帮助。怎么确定分区数&#xff1f;“我应该选择几个分区&#xff1f;”——如果你在Kaf…

简述java规范要注意哪些问题_JAVA学习:JAVA基础面试题(经典)

第一阶段题库基础知识部分&#xff1a;1. JDK是什么&#xff1f;JRE是什么&#xff1f;a) 答&#xff1a;JDK&#xff1a;java开发工具包。JRE&#xff1a;java运行时环境。2. 什么是java的平台无关性&#xff1f;a) 答&#xff1a;Java源文件被编译成字节码的形式&#xff0c;…

我可以/应该在事务上下文中使用并行流吗?

介绍 长话短说&#xff0c;您不应在并行流中使用事务。 这是因为并行流中的每个线程都有其自己的名称&#xff0c;因此它确实参与了事务。 Streams API旨在在某些准则下正常工作。 实际上&#xff0c;为了受益于并行性&#xff0c;不允许每个操作更改共享对象的状态&#xff0…

插入排序java_「Java」各类排序算法

排序大的分类可以分为两种&#xff1a;内排序和外排序。在排序过程中&#xff0c;全部记录存放在内存&#xff0c;则称为内排序&#xff0c;如果排序过程中需要使用外存&#xff0c;则称为外排序。下面讲的排序都是属于内排序。内排序有可以分为以下几类&#xff1a;(1) 插入排…

java object... arguments_Java面试之基础题---对象Object

参数传递&#xff1a;Java支持两种数据类型&#xff1a;基本数据类型和引用数据类型。原始数据类型是一个简单的数据结构&#xff0c;它只有一个与之相关的值。引用数据类型是一个复杂的数据结构&#xff0c;它表示一个对象。原始数据类型的变量将该值直接存储在其存储器地址处…

华为光伏usb适配器_华为系列原装充电器拆解第三弹:比亚迪版华为10W充电器

在对华为18W充电器的比亚迪版和赛尔康版进行拆解之后&#xff0c;充电头网今天继续为大家带来华为10W充电器的比亚迪版和达宏版的拆解。这两种10W规格的华为充电器外观延续了华为原装充电器的风格&#xff0c;而且型号也是一样的。那么&#xff0c;我们先一起来看看比亚迪版华为…