当前位置: 首页 > news >正文

Vue3鼠标拖拽生成区域块并选中元素

Vue3鼠标拖拽生成区域块并选中元素,选中的元素则背景高亮(或者其它逻辑)。

在这里插入图片描述

<script setup>
import { ref } from 'vue'// 区域ref
const regionRef = ref(null)// 内容ref
const itemRefs = ref(null)// 是否开启绘画区域
const enable = ref(false)// 鼠标开始位置
const start = ref({x: 0,y: 0
})// 区域块元素配置
const regionConfig = ref({top: '0px',left: '0px',width: '0px',height: '0px'
})// 鼠标点击
const onMousedown = (e) => {const { pageX, pageY } = estart.value.x = pageXstart.value.y = pageYregionConfig.value.top = pageY + 'px'regionConfig.value.left = pageX + 'px'enable.value = true
}// 鼠标弹起
const onMouseup = () => {enable.value = false
}// 鼠标移动
const onMousemove = (e) => {if (!enable.value) return falseconst { pageX, pageY } = e// 当前鼠标移动的位置减开始位置得到区域块宽高const x = pageX - start.value.xconst y = pageY - start.value.yregionConfig.value.width = Math.abs(x) + 'px'regionConfig.value.height = Math.abs(y) + 'px'// 鼠标移动的位置小于开始位置,当前鼠标的位置是区域块的位置if (x < 0) {regionConfig.value.left = pageX + 'px'}if (y < 0) {regionConfig.value.top = pageY + 'px'}// 获取区域块和内容的位置const boxRect = regionRef.value.getBoundingClientRect()itemRefs.value.forEach((item) => {const rect = item.getBoundingClientRect()// 判断区域块包裹内容元素则改变背景颜色if (boxRect.top <= rect.top && boxRect.bottom >= rect.bottom && boxRect.left <= rect.left && boxRect.right >= rect.right) {item.style.backgroundColor = 'rgb(10, 228, 10)'} else {item.style.backgroundColor = '#cbccce'}})
}
</script><template><mainclass="w_h_100 home"@mousedown="onMousedown"@mouseup="onMouseup"@mousemove="onMousemove"><div class="box"><divref="itemRefs"class="item"v-for="item in 10":key="item">{{ item }}</div></div><divref="regionRef"class="region":style="regionConfig"></div></main>
</template><style lang="less">
.home {display: flex;align-items: center;justify-content: center;.box {width: 200px;display: flex;flex-wrap: wrap;}.item {margin-right: 10px;margin-bottom: 10px;width: 30px;height: 30px;color: #fff;text-align: center;line-height: 30px;background-color: #cbccce;user-select: none;}.region {position: fixed;z-index: 10;border: 1px solid #0094ff;background-color: rgba(0, 148, 255, 0.1);}
}
</style>
http://www.lryc.cn/news/241368.html

相关文章:

  • [深度理解] 重启 Splunk Search Head Cluster
  • Python + Docker 还是 Rust + WebAssembly?
  • [汇编实操]DOSBox工具: unable to open input file: 文件名.asm问题解决
  • Windows安装MongoDB
  • HandBrake 1.7 近日发布
  • Vue3的watch使用介绍及场景
  • Java设计原则和设计模式
  • webshell之基于框架免杀
  • QT QJsonObject 插入 QByteArray十六进制数据
  • 概要设计文档案例分享
  • 微服务qiankun通信方式
  • 【Azure 架构师学习笔记】-Azure Storage Account(7)- 权限控制
  • 听GPT 讲Rust源代码--src/tools(2)
  • 【python学习】基础篇-常用模块-collections模块:数据结构,如列表、元组、字典和集合等
  • 【电路笔记】-电源电压
  • kali部署ARL灯塔资产系统及使用教程
  • 一、用户管理
  • Could not publish to the server. java.lang.NullPointerException
  • SpringMVC(三)
  • 打印菱形-第11届蓝桥杯选拔赛Python真题精选
  • 『亚马逊云科技产品测评』活动征文|搭建Squoosh图片在线压缩工具
  • 基于亚马逊云科技大语言模型等服务打造企业知识库
  • FFmpeg 使用
  • NLP的使用
  • Navicat DML 操作
  • Springboot-热部署-IDEA2023
  • 人工智能和AR/VR:AI在AR和VR中扮演什么角色?行业应用有哪些?
  • Linux进程通信之共享内存
  • 接口自动化测试:pytest基础讲解
  • 基于JavaWeb+SpringBoot+Vue医院管理系统小程序的设计和实现