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 相关文章推荐
基于Jquery的开发个代阴影的对话框效果代码
Jul 28 Javascript
jquery简单的拖动效果实现原理及示例
Jul 26 Javascript
jquery validate demo 基础
Oct 29 Javascript
跟我学习javascript的最新标准ES6
Nov 20 Javascript
谈谈我对JavaScript DOM事件的理解
Dec 18 Javascript
JavaScript实现带播放列表的音乐播放器实例分享
Mar 07 Javascript
原生的强大DOM选择器querySelector介绍
Dec 21 Javascript
Bootstrap进度条实现代码解析
Mar 07 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
Mar 30 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
Feb 08 Javascript
seajs下require书写约定实例分析
May 16 Javascript
Auto.js自动收取自己和好友蚂蚁森林能量脚本
Jun 28 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 Opcache安装和配置方法介绍
2015/05/28 PHP
php遍历替换目录下文件指定内容的方法
2016/11/10 PHP
jQuery之排序组件的深入解析
2013/06/19 Javascript
JavaScript中for-in遍历方式示例介绍
2014/02/11 Javascript
提取jquery的ready()方法单独使用示例
2014/03/25 Javascript
nodejs调用cmd命令实现复制目录
2015/05/04 NodeJs
JavaScript中使用自然对数ln的方法
2015/06/14 Javascript
AngularJS入门心得之directive和controller通信过程
2016/01/25 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
2016/07/05 Javascript
利用Angularjs和Bootstrap前端开发案例实战
2016/08/27 Javascript
jQuery实现背景滑动菜单
2016/12/02 Javascript
两种简单的跨域方法(jsonp、php)
2017/01/02 Javascript
Vue实现导出excel表格功能
2018/03/30 Javascript
微信小程序实现跑马灯效果完整代码(附效果图)
2018/05/30 Javascript
vue父组件异步获取数据传给子组件的方法
2018/07/26 Javascript
浅析vue中的MVVM实现原理
2019/03/04 Javascript
vue element-ui之怎么封装一个自己的组件的详解
2019/05/20 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
2019/08/21 Javascript
JavaScript函数Call、Apply原理实例解析
2020/02/17 Javascript
微信小程序实现打卡签到页面
2020/09/21 Javascript
一分钟学会JavaScript中的try-catch
2020/12/14 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
python中xrange用法分析
2015/04/15 Python
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
英国羊皮鞋类领先品牌:Just Sheepskin
2019/12/12 全球购物
美术专业个人自我评价
2014/01/18 职场文书
医学专业职业生涯规划范文
2014/02/05 职场文书
《歌唱二小放牛郎》教学反思
2014/04/19 职场文书
学习礼仪心得体会
2014/09/01 职场文书
三严三实对照检查材料
2014/09/22 职场文书
单独二胎证明
2015/06/24 职场文书
2015年公路路政个人工作总结
2015/07/24 职场文书
2016优秀大学生个人事迹材料范文
2016/03/01 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书
Java Spring Lifecycle的使用
2022/05/06 Java/Android