需求:鼠标按下后,显示div用于放置所有的li;当鼠标框选住li,并抬起鼠标时,所有的li放进div中
-
先移动鼠标生成画框;
-
将生成的画框和已有的li进行碰撞,如果碰到了,就设置active,没有就清除active;
-
在鼠标放开时,找到所有为active的li,将其appendChild进div中
-
不能直接碰撞时,直接appendChild到div中,会将后面的li全部添加进去div
-
必须给没有碰到的清除active。否则当操作时,先往前拉,后往后拉,会给往前拉的所有li都加上active,这样再往后拉后会全部加到div里
<!DOCTYPE html>
<html lang="en">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
#bucket {
border: 1px solid black;
height: 240px;
display: block;
width: 100px;
height: 100px;
background: yellow;
border: 1px solid black;
list-style: none;
float: left;
margin: 10px;
.box {
border: 1px solid peru;
position: absolute;
background: rgba(0,0,255,.4);
.active {
background: green;
</style>
</head>
<ul id="bucket"></ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
<li>11</li>
<li>12</li>
<li>13</li>
<script>
//需求:鼠标按下后,显示div用于放置所有的li;当鼠标框选住li,并抬起鼠标时,所有的li放进div中
//获取/设置元素的样式
function css(el,attr,val){
if(arguments.length == 3){
el.style[attr] = val+'px';
}else{
return parseInt(getComputedStyle(el)[attr]);
//元素碰撞
let isConcat = (el1,el2) =>{
//判断是否碰撞
let div1Dis = el1.getBoundingClientRect();
let div2Dis = el2.getBoundingClientRect();
if(div1Dis.right > div2Dis.left &&
div1Dis.bottom > div2Dis.top &&
div1Dis.left < div2Dis.right &&
div1Dis.top < div2Dis.bottom){
el2.classList.add("active");
return el2;
}else{
//注意:必须给没有碰到的清除active。否则当操作时,先往前拉,后往后拉,会给往前拉的所有li都加上active,这样再往后拉后会全部加到div里
el2.classList.remove("active");
document.addEventListener("mousedown",function(e){
let div = document.createElement("div");
let startPos = {};
startPos.x = e.clientX;
startPos.y = e.clientY;
let li = null;
function move(e){
let curPos = {};
curPos.x = e.clientX;
curPos.y = e.clientY;
//移动时画框
div.classList.add("box");
//设置div的宽高及top/left
css(div,"width",Math.abs(curPos.x-startPos.x));
css(div,"height",Math.abs(curPos.y-startPos.y));
css(div,"left",Math.min(curPos.x,startPos.x));
css(div,"top",Math.min(curPos.y,startPos.y));
document.body.appendChild(div);
let lis = document.querySelectorAll("ul li");
//将框住的li放进div中(div和多个元素碰撞)
lis.forEach(item=>{
// 将每个li和div进行碰撞测试,如果碰到了,就设置active
//注意:不能直接碰撞时,直接appendChild到div中,会将后面的li全部添加进去
isConcat(div,item);
//获取鼠标移动时位置
document.addEventListener("mousemove",move);
document.addEventListener("mouseup",function(){
document.removeEventListener("mousemove",move);
let bucket = document.querySelector("#bucket");
//获取到所有样式为active的li
let lis = document.querySelectorAll("ul .active");
lis.forEach(item=>{
item.classList.remove("active");
bucket.appendChild(item);
//鼠标放下时清除上一个div
div.remove();//使用removeChild有可能还未创建div
once:true
e.preventDefault();
</script>
</body>
</html>
需求:鼠标按下后,显示div用于放置所有的li;当鼠标框选住li,并抬起鼠标时,所有的li放进div中思路:先移动鼠标生成画框; 将生成的画框和已有的li进行碰撞,如果碰到了,就设置active,没有就清除active; 在鼠标放开时,找到所有为active的li,将其appendChild进div中问题:不能直接碰撞时,直接appendChild到div中,会将后面的li全部添...
一个轻量级的,经过全面测试的(单元和e2e测试),TypeScript'd,React库(1个组件和1个挂钩!),使您能够使用光标
拖动
并选择多个项目。
该库的底层逻辑是从启发而来的。
该项目是通过引导的。
没有选定的状态管理-与[React Drag to Select]( ,如果选择了某个项目,则不会管理此组件。这取决于您来处理。只有当项目变为
选中
触发钩。
支持深度嵌套的项-与[React Drag to Select]( ,您尝试选择的项不必是父HOC的直接子项。只要它们内部具有useSelectableByDragging ,并且
支持虚拟化-与[React Drag to Select]( ,我们的库也可以支持虚拟化列表!
拖动
选择
这是 ,用于创建
拖动
并将
拖动
层绘制到屏幕上。
它没有道具/配置。
< DragSelection>
本例是在vue中实现的
拖动
功能,但是基本思想是一样的。主要是根据mousedown、mousemove、mouseup三个事件,结合元素的offsetLeft和el.style.left属性实现。
顺便记录一下两者的区别:
1. offsetLeft总的来说是获取当前元素距父元素左侧的值 ,具体分两种情况:
如果当前元素仍在普通流中(即position值为static或者relative),...
这是用两个大的
div
进行测试,第一个
div
中有两个小的
div
,当点击某个小的
div
的时候,传递点击的
div
复制到另一个大的
div
中。并保留之前的
div
。
(如果不想保留之前的可以搜索 “appendChild()”的方法 )
点击时候是不刷新的
<!DOCTYPE html>
<html lang="en">
<meta charset="UTF-8">
<title>
</title>
<
div
style="border-radius:10px" @mouseover="mouseOver" :style="active" @mouseleave="mouseLeave">
</
div
>
data(){
return{
active:""
methods(){
mouseOver(){
//改变样式
this.active = 'background-color: rg.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
...
div
的left和top:如果
鼠标
当前位置>
鼠标
起始位置,则为
鼠标
起始位置(
鼠标
往右拉);如果
鼠标
当前位置<
鼠标
起始位置,则为
鼠标
当前位置(
鼠标
往左拉);
通过当前坐标x/y-
鼠标
起始坐标x/y得到要生成的
div
的宽度 ,如果往左拉,
鼠标
当前坐标-起始坐标可能为负数,所以,需要使用绝对值函数Math.abs();
鼠标
按下移动时动态获...
<head>
鼠标
点选功能</head>
<style>
body{padding-top:50px;padding-left:100px;padding-right:150px;}
.file
Div
{float:left;width:100px;height:100px;text-align:center;line-h...
<
div
style="position: absolute; width: 600px; border: 1px solid red">
<
div
id="title" class="top" style="background-color: #1f2222; height: 40px;color:
使用js实现
鼠标
点击
div
实现拖拽
效果
,物体跟随
鼠标
进行移动
功能
效果
要点:
鼠标
在物体内按下不松之后,
鼠标
移动,物体跟随
鼠标
位置发生移动,实现
鼠标
拖拽
效果
,下方代码实现的是拖拽图片进行移动的
效果
;
**如果是图片,需要清除一下图片标签在浏览器中的默认事件**
```javascript
var o = document.getElementById('box');//移动的物体
var vH=document.documentElement.clientHeight;/
"chuyuhuntou": ["chuyuhuntou.jpg","luodibao.jpg"]这个列表有两个图片,做一个
画框
的函数,
鼠标
左键
拖动
画框
,
鼠标
右键结束
画框
# 创建
画框
的回调函数
def draw_rectangle(event, x, y, flags, param):
global drawing, top_left_pt, bottom_right_pt
if event == cv2.EVENT_LBUTTONDOWN: #
鼠标
左键按下
drawing = True
top_left_pt = (x, y)
elif event == cv2.EVENT_LBUTTONUP: #
鼠标
左键释放
drawing = False
bottom_right_pt = (x, y)
cv2.rectangle(img, top_left_pt, bottom_right_pt, (0, 255, 0), 2)
cv2.imshow('image', img)
elif event == cv2.EVENT_RBUTTONDOWN: #
鼠标
右键按下
drawing = False
# 图片列表
image_list = ["chuyuhuntou.jpg", "luodibao.jpg"]
for image_path in image_list:
# 读取图片
img = cv2.imread(image_path)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_rectangle)
drawing = False
top_left_pt, bottom_right_pt = (-1, -1), (-1, -1)
while True:
cv2.imshow('image', img)
# 按下ESC键退出当前图片,按下'q'键退出程序
key = cv2.waitKey(1)
if key == 27: # ESC键
break
elif key == ord('q'):
exit()
cv2.destroyAllWindows()
该代码会循环遍历图片列表中的每张图片,然后在每张图片上实现
画框
的功能。你可以使用
鼠标
左键
拖动
来
画框
,使用
鼠标
右键结束绘制。绘制的框会以绿色边框显示在窗口中。按下ESC键可以退出当前图片的绘制,按下'q'键可以退出程序。
请确保将图片文件(chuyuhuntou.jpg和luodibao.jpg)与代码文件放在同一目录下或者提供正确的图片路径。
希望这个例子对你有帮助!如果还有其他问题,请随时提问。