百度网盘文件夹框选功能

孙闿
• 阅读 2735

百度网盘文件夹框选功能

案例说明:
使用原生 JS 完成桌面操作级应用,对于原生 JS 的掌握情况而言,是一个较为全面的综合型案例。本次课从事件(event)相关的功能入手,给大家带来详细的分享。

案例相关知识点学习

原生DOM操作 >> https://study.miaov.com/study...

原生Event事件 >> https://study.miaov.com/study...

ES6相关语法 >> https://study.miaov.com/study...

案例思路流程
页面基本结构及样式
html:

百度网盘文件夹框选功能

css:

百度网盘文件夹框选功能

创建文件夹
点击 createBtn 时,创建一个新的 .file 放入 #box 中

百度网盘文件夹框选功能

文件的鼠标移入移出及选中操作
文件本身是动态创建的,所以在页面加载完成之后去添加事件的话页面上并没有相关元素,但是在文件创建之后在添加事件的话,就需要每次创建完都添加一次事件,为了提高程序的性能,这里我们使用事件代理,把事件统一代理在box上处理
鼠标移入处理: 在鼠标移入之后,判断如果是 .file 就直接 改变 .file 的样式,如果 .file 的子级 就先找到父级 .file 然后再改变样式

百度网盘文件夹框选功能

点击改变选中状态: 点击时判断是否点击的是 i 标签(模拟的复选框) 是的话,就切换选中状态

百度网盘文件夹框选功能

鼠标移出:跟鼠标移入一样先找到 .file ,然后找到 .file 下的复选框,判断复选框是否选中,没有选中时,还原 .file 样式

百度网盘文件夹框选功能

文件的全选和全不选
全选复选框的状态发生改变时,根据复选框状态选中或不选中文件

百度网盘文件夹框选功能

创建判断是否全选的的函数,在 .file 的 checked 状态改变时,调用这个函数,判断当前是否全选

百度网盘文件夹框选功能

每次创建文件时,肯定不在是全选了,所以在创建文件后,取消全选状态

百度网盘文件夹框选功能

文件夹框选操作
鼠标按下时,创建 selection,鼠标移动时改变 selection 大小,鼠标抬起时删除 selection

百度网盘文件夹框选功能

碰撞检测:获取两个元素的可视区坐标,对比坐标,排除所有不可能碰撞的情况剩下的就是碰撞

百度网盘文件夹框选功能

鼠标在移动的时候,找到所有 file 依次和 selection 进行碰撞检测,如果碰撞就添加选中状态,否则取消选中状态,然后调用 setCheckedAll() 方法判断是否全选

百度网盘文件夹框选功能

总结
按照上边步骤我们就可以把网盘的这些基本功能给实现出来,当然在这里边有些点我们可以把它总结出来,也都是常用的一些思路或处理方式
1)事件委托的使用,事件委托可以极大的提高我们的代码性能,尤其是在一些需要频繁更新的视图上, 事件委托不只可以提高性能,也可以精简我们的代码逻辑
2)碰撞检测的思路,碰撞检测这里我们使用了一种排除思路,排除了所有不可能之后,唯一剩余的就碰撞的情况
3)拖拽的思路,用当前位置 - 初始位置得到手指移动距离,另外拖拽在 PC 端最好加给最顶层,否则滑动过快,容易甩掉元素

更多素材在这里哟~~https://study.miaov.com/bbs?c...

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Chase620 Chase620
5年前
【Electron】electron-vue 借助 element-ui UI 库助力桌面应用开发
前面文章我们讲过electron让可以用HTML、JS、CSS开发桌面应用程序。而electronvue是一个结合了electron与vue的套件。这样我们就能方便地使用vue快速开发桌面应用。但是,vue只是在js这层面做了大量的便捷的操作。对UI并未过多涉及。此时如果您在开发过程中自己实现一套统一主题的UI视觉效果
java一生之敌 java一生之敌
3年前
JVM的内存模型和优化方式
一、JVM的内存模型1.!图片(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/52b2220f04010eb329efbef966f9fa40.png)其中s0,s1为幸
梦
5年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Stella981 Stella981
4年前
JavaScript八张思维导图
!(https://oscimg.oschina.net/oscnet/17104907a0f04b40ac9d9c40d9b13157.jpg)目录JS基本概念JS操作符JS基本语句JS数组用法Date用法JS
Stella981 Stella981
4年前
Node.js实现WebSocket聊天室的例子
对于聊天室,大家应该都不陌生,笔者也写过很多关于聊天室的例子。本节,我们将演示如何通过Node.js来实现一个WebSocket聊天服务器的例子。使用ws创建WebSokcet服务器Node.js原生API并未提供WebSocket的支持,因此,需要安装第三方包才能使用WebSocket功能。对于WebSoc
Stella981 Stella981
4年前
DCloud
ylbtechDCloudMUI:HellomuiMUI最接近原生App体验的前端框架1.返回顶部1、MUI最接近原生App体验的前端框架极小100k的js文件,60k的css文件。原生编写,不依赖任何三方框架极强xcode和Androidstudio里所有原生控件都具备高
Wesley13 Wesley13
4年前
JS原生示例 案例 学习
写在前面原生JS是原理,框架是迎合业务需求的重要关键工具本文是整理工作及学习中理解的基础和难点,便于多方位理解功能模块整合和使用不定期更新行文仓促,文中有错误在所难免,欢迎诸位指正transform实现图片旋转木马3D功能代码摘自网络TODO:目前还未能
Wesley13 Wesley13
4年前
JS和CSS加载(渲染)机制不同
一、结论CSS可以在页面加载完成后随时渲染。举个例子:通过js给某个元素加一个id或者css,只要这个id或者css有对应的样式,此元素的样式就会自动生效。JS不可以在页面加载完成后生效。最明显的例子就是使用EasyUI的时候,iframe中哪些样式无效(EasyUi是依靠JS进行样式处理的,所以无法运行JS,那么样式也就无法设置。简单点说
达里尔 达里尔
2年前
layui复选框取消父级子级的关联
layui项目中需要个需求,layui树形结构组件tree,复选框选中的时候不能影响子级和父级,现在是复选框选中的时候父级多选会被选中,子级也会被选中有个参数,tree.js源码里有一个参数可以解决,但是现在layui的文档里没有渲染树形结构的时候加个参数
孙闿
孙闿
Lv1
没有期待的日子反而顺顺利利。
文章
3
粉丝
0
获赞
0