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

vue 封装一个鼠标拖动选择时间段功能

 

 

<template><div class="timeRange"><div class="calendar"><table><thead><tr><th rowspan="6" class="weekRow"><b>周/时间</b></th><th colspan="24"><b>00:00 - 12:00</b></th><th colspan="24"><b>12:00 - 24:00</b></th></tr><tr><td colspan="2" v-for="index in 24" :key="index">{{ index - 1 }}</td></tr></thead><tbody @mousemove.prevent="handleMouseMove"><tr v-for="(item, index) in weekDate" :key="index"><td>{{ item }}</td><td class="calendar-atom-time" v-for="i in 48" :key="index + '-' + i":class="{ 'active': selectCells[`${index}_${i}`] }" @mousedown.prevent="handleMouseDown(index, i, $event)"@mouseup.prevent="handleMouseUp(index, i)"></td></tr><div id="box" v-show="moveStartEvent"></div></tbody></table><div class="table-core"><div class="clearfix"><span class="pull-left tip-text">可拖动鼠标选择时间段</span><button class="clearBtn" @click="handleClear">清除所有</button></div><ul><li v-for="(item, index) in selectDate" :key="index" v-if="item.data && item.data.length"><label>{{ item.label }}</label><span v-for="o in item.data" :key="o">{{ o[0] }}~{{ o[1] }}</span></li></ul></div></div></div>
</template><script>
export default {name: 'timeRange',data () {return {// 表列weekDate: ['一', '二', '三', '四', '五', '六', '日'],// 所选格子selectCells: {},// 所选时间数据(做提交时使用)selectDate: {},// 记录鼠标位置moveStartEvent: false,moveStartColumn: 0, // 列moveStarRow: 0, // 行moveStartX: 0,moveStartY: 0}},created () {},mounted () {},methods: {// 初始init (data) {if (data && data instanceof Object) {this.selectCells = data} else {this.selectCells = {}}this.getSelectDate()},// 按下handleMouseDown (column, row, e) {this.moveStartEvent = truethis.moveStartColumn = columnthis.moveStarRow = rowthis.moveStartX = e.layerXthis.moveStartY = e.layerY},// 松开handleMouseUp (column, row) {if (this.moveStartEvent) {this.moveStartEvent = falseconst X = row - this.moveStarRowconst Y = column - this.moveStartColumnconst checked = !this.selectCells[`${column}_${row}`]if (X > -1 && Y > -1) {const obj = this.clone(this.selectCells)for (let i = this.moveStartColumn; i <= column; i++) {for (let j = this.moveStarRow; j <= row; j++) {var key = `${i}_${j}`if (checked) {obj[key] = checked} else if (obj[key]) {delete obj[key]}}}this.selectCells = objthis.$forceUpdate()this.getSelectDate()}}this.moveStartDay = 0this.moveStarTime = 0},// 滑动中handleMouseMove (e) {if (this.moveStartEvent) {const dom = this.$el.querySelector('#box')const X = e.layerX - this.moveStartXconst Y = e.layerY - this.moveStartYif (X >= 0 && Y >= 0) {dom.style.left = this.moveStartX + 'px'dom.style.top = this.moveStartY + 'px'dom.style.width = X + 'px'dom.style.height = Y + 'px'}}},// 组合时间数据getSelectDate () {const arr = []this.weekDate.forEach((item, index) => {arr.push({label: item,data: []})for (var i = 1; i <= 48; i++) {var o = this.selectCells[`${index}_${i}`]if (o) {var endTime = i / 2var startTime = endTime - 0.5if (startTime < 10) {startTime = '0' + startTime}if (endTime < 10) {endTime = '0' + endTime}startTime += ''endTime += ''if (startTime.indexOf('.5') > -1) {startTime = startTime.replace('.5', ':30')} else {endTime = endTime.replace('.5', ':30')}if (startTime.indexOf(':30') < 0) {startTime += ':00'} else {endTime += ':00'}arr[index].data.push([startTime, endTime])}}})arr.forEach(item => {for (var i = 0; i < item.data.length; i++) {var o = item.dataif (o[i + 1] && o[i][1] === o[i + 1][0]) {o[i + 1][0] = o[i][0]item.data.splice(i, 1)i--}}})this.selectDate = arr},// 清除选择handleClear () {this.selectCells = {}this.getSelectDate()this.$forceUpdate()},// 获取数据getData () {return this.selectDate}}
}
</script><style lang="less" scoped>
.timeRange {user-select: none;position: relative;padding: 10px 0;.calendar {display: inline-block;}table {width: 100%;border-radius: 4px;border-spacing: 0;table-layout: fixed;border-collapse: collapse;thead {th,td {height: 30px;}th {padding: 5px 0;}.weekRow {width: 100px;min-width: 100px;padding: 20px 0}}td,th {outline: 0;border: 1px solid #E3E3E3;font-size: 12px;text-align: center;min-width: 11px;line-height: 1.6em;min-width: 24px;}tbody {position: relative;overflow: hidden;td {height: 20px !important;}}td.active {background: #F60457;}}.table-core {line-height: 2.4em;border: 1px solid #E3E3E3;border-top: 0;overflow: hidden;padding: 10px;.clearfix {color: #8A8A8A;text-align: left;height: 22px;line-height: 22px;margin: 8px 0;display: flex;font-size: 12px;.clearBtn {cursor: pointer;color: #5775F9;font-size: 14px;margin-left: auto;}}ul {li {line-height: 22px;margin-bottom: 5px;label {display: inline-block;min-width: 60px;color: #8A8A8A;text-align: left;}span {font-size: 12px;&::after {content: "、"}&:last-child::after {display: none;}}}}}#box {background: rgba(241, 1, 85, 0.4);pointer-events: none;position: absolute;top: 0;left: 0;}
}
</style>

相关文章:

vue 封装一个鼠标拖动选择时间段功能

<template><div class"timeRange"><div class"calendar"><table><thead><tr><th rowspan"6" class"weekRow"><b>周/时间</b></th><th colspan"24"><…...

ubuntu22.0安装Barrier局域网共享鼠标键盘

ubuntu22.0安装Barrier局域网共享鼠标键盘 参考网站安装步骤客户端一直开启中解决 参考网站 https://idroot.us/install-barrier-ubuntu-22-04/ 安装步骤 sudo apt update sudo apt upgrade sudo apt install wget apt-transport-https gnupg2 software-properties-common s…...

ffmpeg常用功能博客导航

FFmpeg 是一个处理视频和音频内容的开源工具库&#xff0c;可以实现编码、解码、转码、流媒体和后处理等服务。 推荐博客&#xff1a; 常见命令和使用案例 用ffmpeg转mov为mp4格式 FFmpeg 常用命令 FFmpeg 常用命令编辑音/视频&#xff08;转换格式、压缩、裁剪、截图、切分合…...

shopee,lazada,etsy店群如何高效安全的管理

对于电商卖家来说&#xff0c;要经营多个店铺&#xff0c;管理多个账号是非常常见的操作。为了避免账号关联被平台识别出来&#xff0c;需要使用防关联的浏览器来进行操作 ​1、支持多平台 支持同时管理多个电商平台店铺&#xff0c;Shopee、Lazada、etsy、poshmark、vinted等&…...

【计算复杂性理论】证明复杂性(八):命题鸽巢原理(Propositional Pigeonhole Principle)的指数级归结下界

往期文章&#xff1a; 【计算复杂性理论】证明复杂性&#xff08;Proof Complexity&#xff09;&#xff08;一&#xff09;&#xff1a;简介 【计算复杂性理论】证明复杂性&#xff08;二&#xff09;&#xff1a;归结&#xff08;Resolution&#xff09;与扩展归结&#xff…...

使用DataX实现mysql与hive数据互相导入导出

一、概论 1.1 什么是DataX DataX 是阿里巴巴开源的一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等各种异构数据源之间稳定高效的数据同步功能。 1.2 DataX 的设计 为了解决异构数据源同步问题&#xf…...

语音转录成文本:AI Transcription for mac

AI Transcription是一种人工智能技术&#xff0c;它可以将音频和视频文件转换成文本格式。这种技术可以帮助用户快速地将大量的音频和视频内容转换成文本格式&#xff0c;方便用户进行文本分析、搜索和编辑等操作。 以下是AI Transcription的几个特点&#xff1a; 高效性。AI …...

[nlp] TF-IDF算法介绍

&#xff08;1&#xff09;TF是词频(Term Frequency) 词频是文档中词出现的概率。 &#xff08;2&#xff09; IDF是逆向文件频率(Inverse Document Frequency) 包含词条的文档越少&#xff0c;IDF越大。...

一些感想,写在8月之前

最近换工作了&#xff0c;离开了一个奋斗了4年多的公司&#xff0c;现在在新公司&#xff0c;还在培训中&#xff0c;不那么忙了&#xff0c;就写写最近的想法吧。 因为最近一直在研究框架和搭项目框架&#xff0c;所以就想把一些工作上的过程记录下来&#xff0c;以备不时之需…...

推动数字经济高质量发展需破解三大挑战

随着信息技术的飞速发展&#xff0c;数字经济已成为全球经济发展的重要驱动力。数字经济以其高效、便捷、创新的特点&#xff0c;深刻改变着传统产业和商业模式&#xff0c;为经济发展带来新的活力和动力。然而&#xff0c;要实现数字经济的高质量发展&#xff0c;仍然面临着三…...

Pycharm工具Python开发自动添加注释(详细)

方法自动添加参数注释 定义了一个函数&#xff0c;在函数下面敲入了三个双引号后&#xff0c;enter回车并没有自动出现注释&#xff0c;如图&#xff1a; 解决办法 Pycharm中依次打开File —> Settings —> Tools —> Python Integrated Tools&#xff0c;如图&…...

RUST 有哪些整型?

在Rust中&#xff0c;有以下几种整型数据类型&#xff1a; i8 &#xff1a;有符号8位整型&#xff0c;取值范围为-128到127。u8 &#xff1a;无符号8位整型&#xff0c;取值范围为0到255。i16 &#xff1a;有符号16位整型&#xff0c;取值范围为-32768到32767。u16 &#xff1…...

【Python 实战】---- 批量识别图片中的文字,存入excel中【使用百度的通用文字识别】

分析 1. 获取信息图片示例 2. 运行实例 3. 运行结果 4. 各个文件的位置 实现 1. 需求分析 识别图片中的文字【采用百度的通用文字识别】;文字筛选,按照分类获取对应的文本;采用 openpyxl 实现将数据存入 excel 中。2. 获取 access_token 获取本地缓存的...

探索前端图片如何携带token进行验证

前言 图片在前端开发中扮演了重要的角色&#xff0c;它们不仅仅是美观的元素&#xff0c;还可以传递信息和激发用户的兴趣。随着应用场景的增多&#xff0c;前端开发人员就需要在图片加载过程中携带验证的信息。如 token&#xff0c;用于身份验证、权限控制等方面。通过在图片的…...

飞桨AI Studio可以玩多模态了?MiniGPT4实战演练!

MiniGPT4是基于GPT3的改进版本&#xff0c;它的参数量比GPT3少了一个数量级&#xff0c;但是在多项自然语言处理任务上的表现却不逊于GPT3。项目作者以MiniGPT4-7B作为实战演练项目。 创作者&#xff1a;衍哲 体验链接&#xff1a; https://aistudio.baidu.com/aistudio/proj…...

C++笔记之++i和i++是原子操作吗?

C笔记之i和i是原子操作吗&#xff1f; code review! 文章目录 C笔记之i和i是原子操作吗&#xff1f;1.i是原子操作吗&#xff1f;2.i是原子操作吗&#xff1f;3.前置递增和后置递增 1.i是原子操作吗&#xff1f; 2.i是原子操作吗&#xff1f; 3.前置递增和后置递增...

Pytest+Allure+Excel接口自动化测试框架实战

1. Allure 简介 简介 Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具&#xff0c;它不仅以 Web 的方式展示了简介的测试结果&#xff0c;而且允许参与开发过程的每个人可以从日常执行的测试中&#xff0c;最大限度地提取有用信息。 Allure 是由 Java 语言开发…...

阿里云国际版账号注册常见问题汇总

公司现与阿里云国际站达成战略合作&#xff0c;为客户提供高品质、高性能、高可用的阿里云产品与服务&#xff0c;助力客户用云服务创造更多价值&#xff0c;达成业务转型、加速和创新&#xff0c;全面提升业务竞争力。助企业在各种业务场景中充分利用混合云基础设施进行优化。…...

Flowable基础

简介 Flowable 是 BPMN 的一个基于 java 的软件实现&#xff0c;不过 Flowable 不仅仅包括 BPMN &#xff0c;还有 DMN 决策表和 CMMN Case 管理引擎&#xff0c;并且有自己的用户管理、微服务 API 等一系列功能&#xff0c; 是一个服务平台。 官方手册&#xff1a; https://…...

力扣热门100题之合并区间【中等】

题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;interv…...

GanttProject终极指南:免费开源的项目管理工具完全攻略

GanttProject终极指南&#xff1a;免费开源的项目管理工具完全攻略 【免费下载链接】ganttproject Official GanttProject repository. 项目地址: https://gitcode.com/gh_mirrors/ga/ganttproject GanttProject是一款功能强大的免费开源项目管理软件&#xff0c;通过直…...

【深度解析】从 Antigravity 2.0 看 AI Agent 的产品化演进:动态子代理、项目工作区与多模型编排实战

摘要&#xff1a; Google Antigravity 2.0 的核心变化&#xff0c;不只是功能增加&#xff0c;而是把 AI Agent 从“对话工具”推进到“可编排的执行系统”。本文解析动态子代理、项目级工作区、后台任务与工具链设计&#xff0c;并给出基于 OpenAI 兼容接口的 Python 实战代码…...

不用写代码,也能做学生画像分析?用助睿BI完成考勤高危群体可视化实战

一、前言&#xff1a;为什么要做学生考勤画像分析&#xff1f; 在校园管理场景中&#xff0c;学生考勤数据并不只是简单的“迟到、早退、请假、校服违规”记录。如果能够对这些数据进行系统化分析&#xff0c;就可以进一步发现不同学生群体的行为特征&#xff0c;例如哪些学生…...

工业三防灯干货科普:核心参数、选型逻辑及应用场景全解析

在工业照明领域&#xff0c;三防灯是适配恶劣环境的核心照明设备&#xff0c;广泛应用于车间、仓库、隧道、冷链、食品加工等多场景。不同于民用照明灯具&#xff0c;工业级三防灯需具备防尘、防水、防腐蚀的核心能力&#xff0c;其性能直接决定照明稳定性、使用寿命及后期运维…...

外泌体检测推荐公司

外泌体检测推荐公司 核心优势&#xff1a;外泌体领域一站式技术龙头&#xff0c;搭建从外泌体提取、鉴定到分子检测的完整技术体系&#xff0c;可提供包括样本处理、分离纯化、表征分析、核酸 / 蛋白标志物检测等全链条科研服务&#xff0c;实验体系成熟、整合度高、交付顺畅。…...

如何用Python快速接入Taotoken平台调用多款大模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 如何用Python快速接入Taotoken平台调用多款大模型 对于希望便捷使用多种大语言模型的开发者而言&#xff0c;逐一对接不同厂商的AP…...

TrafficMonitor插件宝典:打造你的全能桌面监控中心

TrafficMonitor插件宝典&#xff1a;打造你的全能桌面监控中心 【免费下载链接】TrafficMonitorPlugins 用于TrafficMonitor的插件 项目地址: https://gitcode.com/gh_mirrors/tr/TrafficMonitorPlugins 想要在桌面上实时监控股票行情、硬件状态、天气信息&#xff0c;却…...

告别踩坑!手把手教你用Cobalt Strike 4.7在Kali Linux上快速搭建团队服务器并上线第一台主机

Kali Linux环境下Cobalt Strike 4.7团队服务器部署与主机上线实战指南 在渗透测试和红队演练中&#xff0c;Cobalt Strike作为一款成熟的商业框架&#xff0c;其团队协作功能和丰富的攻击模拟能力备受安全从业者青睐。本文将基于Kali Linux系统&#xff0c;详细解析Cobalt Stri…...

毛发质感始终“塑料感”?5类生物毛发纹理映射表,含真实显微扫描数据+对应--s、--style、--stylize配置

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;毛发质感生成的核心困境与突破路径 毛发渲染在影视特效、实时游戏与数字人建模中长期面临物理真实性与计算效率的双重挑战。其核心困境源于微观几何结构的多尺度耦合特性——单根毛发具有弯曲、扭转、分叉、鳞…...

Codex 适配国产信创环境完整部署指南(深度技术篇)

摘要随着国内信创产业全面落地推进&#xff0c;基于大代码模型的智能编码助手 Codex&#xff0c;在国产化服务器、操作系统、CPU 架构环境下的适配、编译、部署、调优成为企业数字化转型过程中的刚需技术痛点。本文从架构原理、国产硬件适配、操作系统兼容、依赖编译、容器化部…...