vue封装一个简单的div框选时间的组件的方法


Posted in Javascript onJanuary 06, 2019

前言

新年第一篇文章,记录一下我前段时间封装的一个vue组件吧。技术需要积累,有时间我把我之前写的还不错的组件都开源出来。并尝试vue和react 两种方式的组件封装。今天简单写下鼠标框选div选中效果的封装吧。

div框选实现

div框选效果,其实没有什么好的方法,就是获取鼠标事件,根据鼠标的位置,动态创建一个跟随鼠标的div。【注:这种方式需要依赖position的定位方式,一般鼠标事件位置是针对全局的,所以鼠标框选的div 位置的position最好父级元素是根元素的定位。不然,鼠标框选区域和被框选区域很难保持一致。】

其实总结起来就两步:

  • 鼠标左键按下不放,移动鼠标出现矩形选框;
  • 鼠标左键松开,根据上边出现的矩形选框统计选框范围内的DOM元素;

创建一个跟随鼠标的div,代码如下:

// 创建选框节点
   this.selectBoxDashed = document.createElement('div')
   this.selectBoxDashed.className = 'haorooms-select-box'

   document.body.appendChild(this.selectBoxDashed)
   this.scrollX = document.documentElement.scrollLeft || document.body.scrollLeft
   this.scrollY = document.documentElement.scrollTop || document.body.scrollTop
   // 设置选框的初始位置
   this.startX = e.x + this.scrollX || e.clientX + this.scrollX // e是鼠标事件的event
   this.startY = e.y + this.scrollY || e.clientY + this.scrollY // e是鼠标事件的event
   this.selectBoxDashed.style.cssText = `left:${this.startX}px;top:${this.startY}px`

鼠标移动,获取被选中div列表,增加一个临时class

this.selectBoxDashed.style.display = 'block' // 上面创建的鼠标跟随div出现
   // 根据鼠标移动,设置选框的位置、宽高
   this.initx = e.x + this.scrollX || e.clientX + this.scrollX //鼠标移动的初始位置+滚动轴的位置
   this.inity = e.y + this.scrollY || e.clientY + this.scrollY
   // 暂存选框的位置及宽高,用于将 select-item 选中
   this.left = Math.min(this.initx, this.startX) 
   this.top = Math.min(this.inity, this.startY)
   this.width = Math.abs(this.initx - this.startX)
   this.height = Math.abs(this.inity - this.startY)
   this.selectBoxDashed.style.left = `${this.left}px`
   this.selectBoxDashed.style.top = `${this.top}px`
   this.selectBoxDashed.style.width = `${this.width}px`
   this.selectBoxDashed.style.height = `${this.height}px`
   let fileDivs = document.getElementsByClassName('list') // 获取要选中的div列表
   for (let i = 0; i < fileDivs.length; i++) {
    let itemX_pos = fileDivs[i].offsetWidth + fileDivs[i].offsetLeft
    let itemY_pos = fileDivs[i].offsetHeight + fileDivs[i].offsetTop
    let condition1 = itemX_pos > this.left
    let condition2 = itemY_pos > this.top
    let condition3 = fileDivs[i].offsetLeft < (this.left + this.width)
    let condition4 = fileDivs[i].offsetTop < (this.top + this.height)
    if (condition1 && condition2 && condition3 && condition4) {// 在框选范围之内
     fileDivs[i].classList.add('temp-selected')
    } else {
     fileDivs[i].classList.remove('temp-selected')
    }
   }

鼠标抬起,增加选中class

let selectDom = document.getElementsByClassName('temp-selected');
   [].slice.call(selectDom).forEach(item => {
    if (item.classList.contains('selected')) {
     item.classList.remove('selected')
    } else {
     item.classList.add('selected')
    }
    item.classList.remove('temp-selected')
   })
   if (this.selectBoxDashed) {
    try {
     this.selectBoxDashed.parentNode.removeChild(this.selectBoxDashed)
    } catch (err) {
     // console.log(err)
    }
   }
   let fileDivs = document.getElementsByClassName('list') // 这里是改变数据
   for (let i = 0; i < fileDivs.length; i++) {
    if (fileDivs[i].classList.contains('selected')) {
     this.timeList[i] = '1'
    } else {
     this.timeList[i] = '0'
    }
   }

效果如下如:

vue封装一个简单的div框选时间的组件的方法

代码发布到npm

这个组件,包括我之前写的vue移动端下拉加载下一页数据的组件,都发布到了npm,

npm地址:https://www.npmjs.com/package/timedivselect

使用:

npm install timedivselect -S

import timeDivSelect from 'timedivselect'

使用例子:

https://github.com/confidence68/timeDivselect/blob/master/src/App.vue

顺便说说npm发布遇到的一个小问题吧

之前我npm也发布过一些,关于如何发布npm包,我博客之前虽然没有写,但是网上很多。

第一次用的时候一般是:

npm adduser
// 输入用户名,密码等【npm 网站要提前注册,npm网站的用户名和密码】

不是第一次

npm login

发布、删除等

npm publish // 发布
npm unpublish 包名 // 撤销删除

回到正题,我今天遇到的问题是npm: no_perms Private mode enable, only admin can publish this module

之前发布都是好好的,为啥突然这次发布会有这个错误信息呢?原来是因为我指定了npm的淘宝镜像。

目前推荐使用NRM

sudo npm install -g nrm

查看源列表

nrm ls

使用某个源

nrm use npm

这样再发布既可以了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript入门教程(7) History历史对象
Jan 31 Javascript
jQuery Select(单选) 模拟插件 V1.3.62 改进版
Jul 17 Javascript
jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
Dec 02 Javascript
动态加载js、css等文件跨iframe实现
Feb 24 Javascript
用jquery仿做发微博功能示例
Apr 18 Javascript
jquery.mousewheel实现整屏翻屏效果
Aug 30 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
Dec 15 Javascript
jquery easyui dataGrid动态改变排序字段名的方法
Mar 02 Javascript
使用jQuery卸载全部事件的思路详解
Apr 03 jQuery
详解Vue中使用v-for语句抛出错误的解决方案
May 04 Javascript
Angular4 Select选择改变事件的方法
Oct 09 Javascript
基于Element封装一个表格组件tableList的使用方法
Jun 29 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
Jan 06 #Javascript
浅谈在Vue.js中如何实现时间转换指令
Jan 06 #Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
Jan 06 #Javascript
react-router4按需加载(踩坑填坑)
Jan 06 #Javascript
React 实现拖拽功能的示例代码
Jan 06 #Javascript
Next.js实现react服务器端渲染的方法示例
Jan 06 #Javascript
vue.js引入外部CSS样式和外部JS文件的方法
Jan 06 #Javascript
You might like
php 连接mssql数据库 初学php笔记
2010/03/01 PHP
ZF框架实现发送邮件的方法
2015/12/03 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
js实现顶部可折叠的菜单工具栏效果实例
2015/05/09 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
javascript移动开发中touch触摸事件详解
2016/03/18 Javascript
bootstrap flask登录页面编写实例
2016/11/01 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
详解Jquery Easyui的验证扩展
2017/01/09 Javascript
jquery Ajax 全局调用封装实例详解
2017/01/16 Javascript
Node.JS利用PhantomJs抓取网页入门教程
2017/05/19 Javascript
基于vue2.0实现的级联选择器
2017/06/09 Javascript
详解JavaScript 中 if / if...else...替换方式
2018/07/15 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
微信小程序实现列表的横向滑动方式
2020/07/15 Javascript
Python基于matplotlib绘制栈式直方图的方法示例
2017/08/09 Python
python将秒数转化为时间格式的实例
2018/09/16 Python
Python Pandas中根据列的值选取多行数据
2019/07/08 Python
利用Python校准本地时间的方法教程
2019/10/31 Python
使用Pytorch来拟合函数方式
2020/01/14 Python
django日志默认打印request请求信息的方法示例
2020/05/17 Python
如何向scrapy中的spider传递参数的几种方法
2020/11/18 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
html5 canvas实现给图片添加平铺水印
2019/08/20 HTML / CSS
中邮全球便购:中国邮政速递物流
2017/03/04 全球购物
青春无悔演讲稿
2014/05/08 职场文书
村抢险救灾方案
2014/05/09 职场文书
财务部会计岗位职责
2015/02/03 职场文书
自我推荐信怎么写
2015/03/24 职场文书
2015年度残疾人工作总结
2015/05/14 职场文书
演讲开场白和结束语
2015/05/29 职场文书
安全生产标语口号
2015/12/26 职场文书
详解MySQL InnoDB存储引擎的内存管理
2021/04/08 MySQL
python实现进度条的多种实现
2021/04/29 Python
MySQL 原理与优化之Update 优化
2022/08/14 MySQL