- 「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!」
前言
- 做前端开发这么久,你对
JavaScript的原生事件了解多少呢?播放视频的全屏/退出全屏、文件的拖拽上传、可调整宽度高度的容器、调整左右容器宽度等功能是怎么实现的呢?下面我就针对上述的几个功能做一个简单的介绍,不足之处还望指出。 - 相关源码 detanx github
全屏/退出全屏
- 一些情况下,由于页面内容较多,我们只想看某一部分的内容时,我们就可以给该部分添加一个全屏的按钮,只显示该部分的内容。
- 注:全屏的事件是在
document.documentElement对象上,而退出全屏的事件是在document对象上。
- 设置不同状态下的样式(不限于宽高)时,我们可以通过修改不同的
class来控制,在Vue、React等中我们也可以控制变量来改变元素在不同状态下的class。 - 如何记住这几个事件名:
- 全屏事件
来源:document.documentElement;
方法名称:标准方法 -:requestFullscreen,其他方法 -: 大写标准方法requestFullscreen的第一个字母并加前缀(webkit、moz、ms)。 - 退出全屏事件
来源:document;
方法名称:标准方法 -:exitFullscreen,IE-: 大写标准方法exitFullscreen的第一个字母并加前缀ms;Chrome( webkit )、Firefox( moz )-: 使用CancelFullScreen加相应内核前缀。
- 全屏事件
文件拖拽上传
- 文件上传在很多地方都会用到,一半会是点击某个按钮或者区域去选择文件上传,但也有地方会使用拖拽文件上传的方式,或者两者都有既可以点击也可以拖到指定区域。
拖拽事件
- 在文件拖拽上传中,我们会用到
ondragover、ondragenter、ondragleave、ondrop这几个事件。
具体实现
- 创建接受文件的拖拽区域及读取文件进度条
2. 对网页监听拖拽事件并显示相应的文件需要被拖到的区域,如果拖拽的区域一直是显示的,可以直接将事件绑到对应的区域元素上。
3. 当拖拽文件已经进入拖拽区域时会触发
ondragenter。
4. 当拖拽文件离开拖拽区域时会触发
ondragleave。
5. 当拖拽文件在拖拽区域松开鼠标,会触发
ondrop 事件,当拖拽的文件不是一些无法读取的内容(例:文件夹等)时,我们可以通过 内置的 FileReader 对象处理,通过 FileReader 实例的一些方法,我们可以做一些自己的处理。
拖拽改变 div 大小
- 在某些项目中,可能会有这样的需求,页面有一个容器我们可以按住容器边缘,拖动鼠标可以改变容器的高度(类似于
textarea标签的resize属性);当然我们肯定不止这么简单的功能,当页面存在左右两个div时,我们可以拖动两个div中间,使得两个div的宽度一个增加另一个减少,但始终保持总的宽度不变。
创建容器
监听鼠标移动事件
- 获取鼠标的位置,判断是否在容器内部,在内部时判断所在容器的位置。
resizeable:鼠标按下的区域是否是我们定义的可以改变容器大小的区域;clientX、clientY:记录鼠标按下的坐标,也是用来存放鼠标上一次的坐标;minW、minH、direc:容器的最小宽高及改变的方向。
CSS的cursor属性可以设置鼠标在容器的不同位置时,显示不同的表现样式,告知用户当前容器可执行的操作。
监听鼠标按下事件
- 鼠标按下事件应添加到容器上,避免在非容器区域也触发相应事件。
监听鼠标松开事件
- 松开事件应绑定在整个文档对象上,如果绑定到容器上,当鼠标在容器上按下后,我们移动鼠标肯定会移动到容器之外,那松开鼠标后就不会出发对应的鼠标松开事件。
双列可变容器
- 通过
flex布局,我们添加一个两列,并在中间设置一个可以点击改版两边容器宽度的区域,鼠标按下该区域后,通过获取鼠标的位置去改变左右容器的宽度。 - 具体实现如下:
-
创建所需容器结构
-
通过
CSS调整相应的布局 -
添加拖拽事件改变大小
- 根据容器的所在位置,容器内的可变
div的大小计算可能也有些不同,例如容器存在padding值,那么也需要减去相应的px大小等等。 - 在鼠标按下后的拖拽过程中,鼠标可能会移出点击拖拽区域,所以鼠标的松开事件 (
onmouseup)需要绑定到document上。
往期精彩
- JavaScript 判断优雅写法
- 从0搭建Vite + Vue3 + Element-Plus + Vue-Router + ESLint + husky + lint-staged
- 「前端进阶」JavaScript手写方法/使用技巧自查
- JavaScript设计模式之简介及创建型模式
- 公众号打开小程序最佳解决方案(Vue)
- Axios你可能不知道使用方式
「点赞、收藏和评论」
❤️关注+点赞+收藏+评论+转发❤️,创作不易,鼓励笔者创作更好的文章,谢谢🙏大家。