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 类与静态类的实现(续)
Apr 02 Javascript
JavaScript中使用构造器创建对象无需new的情况说明
Mar 01 Javascript
js改变文章字体大小的实例代码
Nov 27 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
Nov 19 Javascript
AngularJS实现给动态生成的元素绑定事件的方法
Dec 14 Javascript
JS无缝滚动效果实现方法分析
Dec 21 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
Jul 05 Javascript
微信小程序中this.data与this.setData的区别详解
Sep 17 Javascript
Node.js EventEmmitter事件监听器用法实例分析
Jan 07 Javascript
浅谈Vue项目骨架屏注入实践
Aug 05 Javascript
js贪心算法 钱币找零问题代码实例
Sep 11 Javascript
JavaScript中CreateTextFile函数
Aug 30 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
php5 图片验证码实现代码
2009/12/11 PHP
供参考的 php 学习提高路线分享
2011/10/23 PHP
PHP+jQuery翻板抽奖功能实现
2015/10/19 PHP
PHP简单判断字符串是否包含另一个字符串的方法
2016/03/25 PHP
使用Mootools动态添加Css样式表代码,兼容各浏览器
2011/12/12 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
2015/02/24 Javascript
js实现图片左右滚动效果
2017/02/27 Javascript
微信小程序 列表的上拉加载和下拉刷新的实现
2017/04/01 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
2017/06/13 Javascript
详解vue.js的事件处理器v-on:click
2017/06/27 Javascript
详解如何使用webpack+es6开发angular1.x
2017/08/16 Javascript
Angular CLI在Angular项目中如何使用scss详解
2018/04/10 Javascript
JS实现json对象数组按对象属性排序操作示例
2018/05/18 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
微信小程序实现tab左右切换效果
2020/11/15 Javascript
小程序实现左右来回滚动字幕效果
2018/12/28 Javascript
python 获取et和excel的版本号
2009/04/09 Python
python3写爬取B站视频弹幕功能
2017/12/22 Python
python实现AES加密和解密
2019/03/27 Python
Django rstful登陆认证并检查session是否过期代码实例
2019/08/13 Python
Python threading.local代码实例及原理解析
2020/03/16 Python
django rest framework serializer返回时间自动格式化方法
2020/03/31 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
2020/07/31 Python
农村婚礼证婚词
2014/01/08 职场文书
教师节商场活动方案
2014/02/13 职场文书
优良学风班申请材料
2014/02/13 职场文书
《春天来了》教学反思
2014/04/07 职场文书
课外科技活动总结
2014/08/27 职场文书
社区个人对照检查材料(群众路线)
2014/09/26 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
党员个人剖析材料2014
2014/10/08 职场文书
2014年企业员工工作总结
2014/12/09 职场文书
计划生育汇报材料
2014/12/26 职场文书
《和时间赛跑》读后感3篇
2019/12/16 职场文书
Python基础之tkinter图形化界面学习
2021/04/29 Python
Python学习之包与模块详解
2022/03/19 Python