前端js、javascript 鼠标 框选 文件 功能

2023-10-28

一、DEMO

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>selection</title>
  <style>
    * {
      padding: 0px;
      margin: 0px;
      list-style: none;
    }
    html,body { height: 100%; width: 100%; overflow: hidden; }
    #root {
      height: 100%;
      background: #000;
      overflow-y: auto;
      overflow-x: hidden;
    }
    ul li {
      margin: 10px;
      border: #ccc solid 1px;
      display: inline-block;
      width: 200px;
      height: 200px;
      text-align: center;
      line-height: 200px;
      color: #fff;
    }
    /* 框选盒子样式 */
    .tempDiv {
      border:1px dashed #fff;
      background:#fff;
      position:absolute;
      width:0;
      height:0;
      opacity:0.5;
      pointer-events: none;
    }
  </style>
  <script  src="selection.js"></script>
</head>
<body>
  <div id="root">
    <ul class="oul">
    </ul>
  </div>
  <script>
    // 创建 元素
    const oul = document.querySelector('.oul')
    const map = new Map()
    Array(50).fill().forEach((item, index) => {
      const oli = document.createElement('li')
      const key = index + 1
      oli.setAttribute('data-id', key)
      oli.classList.add('target-node')
      oli.innerText = key
      map.set(key + '', oli)
      oul.appendChild(oli)
    })
    // 调用函数
    selection({
      root: document.querySelector('#root'), // 盒子
      target: '.target-node', // 框选元素类名
      dataId: 'data-id', // 框选元素 data-xxx
      callBack: (ids) => { // 框选元素回调 优先 dataId || Element
        ids.forEach(id => {
          const oli = map.get(id)
          oli.style.borderColor = 'red'
        })
      }
    })
  </script>
</body>
</html>

二、selection.js

// 默认配置
const defaults = {
  root: document,
  target: '.target-node',
  dataId: 'data-id'
}

// 事件阻止
function clearEventBubble(evt) { 
  if (evt.stopPropagation) 
    evt.stopPropagation(); 
  else 
    evt.cancelBubble = true; 
  if (evt.preventDefault) 
    evt.preventDefault(); 
  else 
    evt.returnValue = false; 
}

// ---------------- 关键算法 ---------------------
function computed (pos, option) {
  const Rect = option.root.getBoundingClientRect()
  const targetList = Array.from(document.querySelectorAll(option.target))
  const {x,y,w,h} = pos
  let ids = []
  const scrollTop = option.root.scrollTop
  const scrollLeft = option.root.scrollLeft
  targetList.forEach(node => {
    const nodeRect = node.getBoundingClientRect()
    let sleft = nodeRect.left + scrollLeft - Rect.left + node.offsetWidth
    let sTop = nodeRect.top + scrollTop - Rect.top + node.offsetHeight
    let offsetLeft = nodeRect.left - Rect.left + scrollLeft
    let offsetTop = nodeRect.top - Rect.top + scrollTop
    if (sleft > x && sTop > y && offsetLeft < x + w && offsetTop < y + h) {
      ids.push(node.getAttribute(option.dataId) || node)
      return true
    } else {
      return false
    }
  })
  option.callBack && option.callBack(ids)
}
const selection = function (option = {}) {
  for (let key in defaults) {
    if (!option.hasOwnProperty(key)) {
      option[key] = defaults[key]
    }
  }
  const Root = option.root
  Root.onmousedown = function (e) {
    if (e.button !== 0) return false
    const Rect = Root.getBoundingClientRect()
    var posx = e.clientX - Rect.left + Root.scrollLeft
    var posy = e.clientY - Rect.top + Root.scrollTop
    var div = document.createElement('div')
    div.className = 'tempDiv'
    div.style.left = posx + 'px'
    div.style.top = posy + 'px'
    Root.style.position = 'relative'
    Root.appendChild(div);
    clearEventBubble(e)
    Root.onmousemove = function(ev){
      const clientX = ev.clientX - Rect.left
      const clientY = ev.clientY - Rect.top
      const left = Math.min(clientX + Root.scrollLeft, posx)
      const top = Math.min(posy, clientY + Root.scrollTop)
      const width =  Math.abs(posx - clientX + Root.scrollLeft)
      const height = Math.abs(posy - clientY - Root.scrollTop)
      div.style.left = left+ 'px'
      div.style.top = top + 'px'
      div.style.width = width + 'px'
      div.style.height = height + 'px'
      if (width < 5 && height < 5 ) return false
      computed({
        x: left,
        y: top,
        w: width,
        h: height
      }, option)
      clearEventBubble(ev)
    }
    document.onmouseup = function(){
      Array.from(document.querySelectorAll('.tempDiv')).forEach(node => {
        node.remove()
      })
      Root.style.position = ''
      Root.onmousemove = null
      document.onmouseup = null
    }
  }
}

// export default selection

三、CSS

.tempDiv {
      border:1px dashed #fff;
      background:#fff;
      position:absolute;
      width:0;
      height:0;
      opacity:0.5;
      pointer-events: none;
    }

四、使用 

selection({
      root: document.querySelector('#root'), // 盒子
      target: '.target-node', // 框选元素类名
      dataId: 'data-id', // 框选元素 data-xxx
      callBack: (ids) => { // 框选元素回调 优先 dataId || Element
        ids.forEach(id => {
          const oli = map.get(id)
          oli.style.borderColor = 'red'
        })
      }
    })

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端js、javascript 鼠标 框选 文件 功能 的相关文章

  • 如何在react-bootstrap中禁用表单提交的

    在下面的代码片段中 我有许多文本类型的输入表单 如果用户点击 我似乎会得到相同的合成事件 就像他们按下提交按钮一样 我想忽略作为表单提交 只允许一个人按下 提交 按钮 我删除了一些表单组以减少示例 在所有情况下 按钮或 ENTER 键 e
  • 如何使用javascript将大图像转换为十六进制?

    如果我尝试将图像转换为十六进制 无论我使用哪个函数 我都会收到此错误消息 该图像的大小为 7 MB 19812 毫秒 清理 1401 2 1455 0 gt 1401 2 1455 0 MB 9 9 0 ms 自上次 GC 以来 8 3 m
  • 如何格式化 Highcharts 的 (x,y) 对数据的日期时间

    我的序列化方法会产生如下所示的日期时间字符串 2014 07 09T12 30 41Z 为什么下面的代码不起作用 function container highcharts xAxis type datetime series data x
  • 带有淘汰赛js的隐形recaptcha

    我正在完成隐形验证码 但我在实现它时遇到问题 谷歌开发人员页面中的代码显示它应该是这样的
  • 可以在初始 DOM 解析期间/之前修改 DOM 吗?

    是否可以在初始 DOM 解析期间或之前修改 DOM 或者我是否必须等到 DOM 被解析和构建之后才能与其交互 更具体地说 是否有可能阻止 DOM 中的脚本元素使用用户脚本 内容脚本或 Chrome 或 Firefox 中的类似脚本运行 在解
  • 引导程序提前输入未填充承诺的响应

    我的引导程序预输入如下
  • React-Redux:state.setIn() 和 state.set() 有什么区别?

    我见过使用setIn and set 在一些react redux代码中 state setIn state set 我在这里找到了一些文档https facebook github io immutable js https facebo
  • Bootstrap按钮加载+Ajax

    我正在使用 Twitter Bootstrap 的按钮加载状态 http twitter github com bootstrap javascript html buttons http twitter github com bootst
  • 尝试将数据存储在点击器网站中

    我正在尝试存储一个名为的变量score无论何时刷新 您都会一次又一次地使用它 我不明白的是它的代码是什么 我尝试了一些方法 但似乎都不起作用 这是我的答题器网站 但是当我尝试使用 JavaScript 来存储它时 它不起作用window o
  • 网站的主体和元素固定在 980px 宽度上,不会缩小

    我试图在 Rails 应用程序顶部启动前端 仅 HTML CSS 页面 但在使用 320px 视口时遇到问题 有些元素不会按比例缩小 我不明白为什么 我已经完成了检查元素 为各种元素提供了max width 100 and or width
  • DataTables row.add 到特定索引

    我正在替换这样的行项目 var targetRow entity row dataTable targetRow closest table dataTable DataTable dataTable row targetRow remov
  • Vuejs 2:去抖动不适用于手表选项

    当我在 VueJs 中反跳此函数时 如果我提供毫秒数作为原语 它就可以正常工作 但是 如果我将其提供为对 prop 的引用 它会忽略它 这是道具的缩写版本 props debounce type Number default 500 这是不
  • 可以设置标题样式吗? (并且使用CSS或js?)[重复]

    这个问题在这里已经有答案了 我想知道是否可以设计一个title a href title This is a title Hello a 样式问题有两个方面 文本格式 编码 我猜这是可能的 所以在问题中这样做 工具提示样式 你能把它弄大一点
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va
  • 在 Shopify 商店中嵌入 Vue 组件

    在产品页面中 我尝试显示自定义 Vue 组件 为简洁起见 该组件根据给定的产品 ID 显示 Firebase 数据库中的一些信息 我最初尝试将其制作为 Shopify 应用程序 以便我可以访问他们的 API 我实现了 OAuth 并且可以检
  • 带参数的事件监听器

    我想将参数传递给 JavaScript 中的事件侦听器 我已经找到了解决方案 但我无法理解它们为什么或如何工作以及为什么其他解决方案不起作用 我有 C C 背景 但是 Javascript 函数的执行有很大不同 您能否帮助我理解以下示例如何
  • 用于交互式图形绘制的轻量级 JavaScript 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有兴趣了解用于绘制交互式图表的最轻量级 javascript 库 我掌握的数据主要是与海洋研究相关的科学数据 我知道一些 jquery
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • 在 CKEditor 中设置字体大小和字体系列

    我正在使用 ckeditor 我想问一下这个插件如何设置font family和font size 我尝试过使用 CKEDITOR config font defaultLabel Arial CKEDITOR config fontSiz
  • JavaScript 相对路径

    在第一个 html 文件中 我使用了一个变量类别链接 var categoryLinks Career prospects http localhost Landa DirectManagers 511 HelenaChechik Dim0

随机推荐

  • 2022全国大学生数学建模竞赛C题思路模型

    1 比赛报名与思路解析 持续更新750967193 2 比赛时间 2022年9月15日18点到2022年9月18日20点 如下为C题思路 C 题 古代玻璃制品的成分分析与鉴别 丝绸之路是古代中西方文化交流的通道 其中玻璃是早期贸易往来的宝贵
  • Java异常, 性能有多差

    在 Java 中 异常通常被认为是成本昂贵的 不应该用于控制控制 本文将证明这个观点的正确性 并验证导致性能问题的原因 Java微基准测试框架 在编写代码评估Java异常的性能成本之前 我们需要搭建一个基准测试环境 测量异常的成本开销 并不
  • 04C++11多线程编程之创建多个线程和数据共享问题分析

    04C 11多线程编程之创建多个线程和数据共享问题分析 1 thread循环创建多个子线程 思想就是使用容器创建多个线程 推荐 以后工作中会使用到 具有实际意义 方便统一管理线程 include
  • Staple 跟踪: Complementary Learners for Real-Time Tracking

    目标跟踪算法 Staple Complementary Learners for Real Time Tracking 小小菜鸟一只 2017 03 25 09 26 42 15110 收藏 14 分类专栏 目标跟踪 版权 文章下载链接 文
  • 辨析Java与Javascript

    首先 它们是两个公司开发的不同的两个产品 Java是SUN公司推出的新一代面向对象的程序设计语言 特别适合于Internet应用程序开发 而JavaScript是Netscape公司的产品 其目的是为了扩展Netscape Navigato
  • 人才供应链(17年12月)

    库克来中国访问时说 高质量的人才是Apple公司最需要的 而苹果商店的开发者中 中国有200万开发者在支持应用商店 其中大部分是在广州 苹果的供应链也在中国 配套的零部件 面对高要求和近似到极限的品质要求 只有在中国才能满足 IT行业的人才
  • 压缩/减小VirtualBox虚拟硬盘文件占用空间

    文章目录 网上的做法 导出虚拟电脑 再导入 网上的做法 网上有两种压缩空间的做法 1 在虚拟机中 使用 SDelete 例如 sdelete c z 经本人实测 不仅不能压缩 因为SDelete 扫描了整个c 盘 而 VirtualBox
  • 【多模态】7、DINO

    文章目录 一 背景 二 方法 2 1 Contrastive DeNoising Training 2 3 Mixed Query Selection 2 4 Look Forward Twice 三 效果 论文 DINO DETR wit
  • 联想E450c下vmware安装ubuntu " Intel VT-x 处于禁用状态"

    实验环境 lenovo E450c 报错信息 解决办法 按F12进入BIOS 选择Security下的Virtualization 在Intel R 的行 设置Enabled 按F10保存 重新打开虚拟机 参考链接 vmware安装ubun
  • linux 挂载以及初始化硬盘

    linux 挂载以及初始化硬盘 简述 过多的赘述就不说了 一般使用linux完成一些像iscsi服务存储配置啥的 都需要用到硬盘的挂载来扩充服务器的存储空间 这里就简简单单给大家讲一下linux如何挂载初始化新的硬盘 我这里使用的是linu
  • CRC编码计算方法及C语言实现

    CRC编码计算方法及C语言实现 CRC Cyclic Redundancy Check 是一种常用的错误校验码 用于检测和纠正传输过程中的错误 在数据通信和存储中 CRC编码被广泛应用 因为它能够高效地检测错误 并且实现简便 CRC编码计算
  • V神·以太坊上的分片

    译者序 本文是我应以太坊中文社区 Ethfans org 之邀做的翻译稿 原文取自以太坊社区的Github https github com ethereum sharding blob develop docs doc md 原文最后更新
  • Flamingo

    基于已有的图像模型和文本模型构建多模态模型 最终模型的输入是图像 视频和文本 输出是文本 Vision encoder来自预训练的NormalizerFree ResNet NFNet 之后经过图文对比损失进一步学习 图片经过Vision
  • antd中Tabs切换控制其他地方的标签显隐(react)

    antd中Tabs切换控制其他地方的标签的显示与隐藏 过程如下 tab的回调函数 拿到key值之后就离成功不远了 然后在右边的标签下还有内容 也需要根据tab切换去控制显隐 和上面是一个道理 可以直接给里面的每个div类名 根据key值 去
  • Java写一个excel工具类_Java操作Excel工具类(poi)

    1 importorg apache commons lang3 exception ExceptionUtils 2 importorg apache poi hssf usermodel HSSFDataFormat 3 importo
  • STM32传感器外设集 -- 蓝牙(HC-05)+超声波(hc-sr04)

    前言 前言 蓝牙外设还没有给大家安排上 今天我就给大家安排上使用蓝牙传输超声波距离的例程 会给大家附带蓝牙的上位机的测试APP 一 模块介绍 1 连接图 蓝牙模块 引脚 超声波传感器 引脚 GND GND GND GND VCC 3 3 V
  • 基础IO(文件输入输出、标准IO接口、文件描述符和文件流指针)

    目录 基础IO 文件的输入输出操作 FILE fopen char filename char mode 文件名称 打开方式 size t fread char buf size t block size size t block coun
  • leetcode 1833 雪糕的最大数量 第一眼想到的是dp,其实只能排序加贪心

    夏日炎炎 小男孩 Tony 想买一些雪糕消消暑 商店中新到 n 支雪糕 用长度为 n 的数组 costs 表示雪糕的定价 其中 costs i 表示第 i 支雪糕的现金价格 Tony 一共有 coins 现金可以用于消费 他想要买尽可能多的
  • ioctl()函数

    include
  • 前端js、javascript 鼠标 框选 文件 功能

    一 DEMO