拖拽进度条按钮的代码没看懂

拖拽进度条按钮的代码没看懂

拖拽进度条按钮的代码没看懂

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕慕子 2020-08-04 18:06:28

同学你好,老师针对整体的流程,给同学简单的画图解释一下:

1、ev.clientX返回当事件被触发时鼠标指针向对于浏览器页面水平坐标。

this.offsetLeft返回 元素距离已定位的父元素左侧的距离。

如下绿色表示的就是this.offsetLeft ,紫色表示的是ev.clientX。

http://img1.sycdn.imooc.com//climg/5f29329a09f0d24713140131.jpg

所以l表示的就是如下蓝色区域

http://img1.sycdn.imooc.com//climg/5f2932b209e805e313140090.jpg

2、当鼠标移动时,用鼠标距离浏览器左侧的坐标减去l就是圆点应该设置的left值。

如下图所示:

http://img1.sycdn.imooc.com//climg/5f2932d6090380ba13400124.jpg

红色线就是needX,即圆点到进度条左侧起点的距离 。而CrlNode.style.left 就是为圆点设置left值,即圆点现在的位置:

http://img1.sycdn.imooc.com//climg/5f2932ef0966bfe815470330.jpg

具体可以结合下图注释理解:

//拖拽进度条按钮
        CrlNode.onmousedown = function (e) {
            //是一个兼容性写法,每个事件函数都有一个event对象
            var ev = e || event;
            //offsetLeft是一个元素到父级左边的距离,就是鼠标按住的点到最左边的距离
            //clientX返回当事件被触发时鼠标指针相对于浏览器页面(或客户区)的水平坐标。
            //l是获取crlNode中心点距离页面左侧的距离
            var l = ev.clientX - this.offsetLeft;
            // 当拖拽进度条按钮时暂停视频播放
            VideoNode.pause();
            // 按钮移动事件
            document.onmousemove = function (e) {
                // 获取event事件对象
                var ev = e || event;
                // ev.clientX: 移动过程中鼠标距离最左边的距离
                // l : 鼠标按下时距离页面的位置
                // needX 按钮需要拖拽过程中需要移动的距离
                var needX = ev.clientX - l;
                // 按钮可以移动的最大距离
                var maxX = LoadNode.offsetWidth - 8.5;
                //通过三元运算符判断移动的距离是否超过最大最小值
                needX = needX < -8.5 ? -8.5 : needX;
                needX = needX > maxX ? maxX : needX;
                // 设置按钮的left值,改变按钮的位置
                CrlNode.style.left = needX + 'px';
                // 计算进度条的宽度
                LineNode.style.width = (CrlNode.offsetLeft + 9) / LoadNode.offsetWidth * 100 + '%';


            };
            // 鼠标抬起事件
            document.onmouseup = function () {
                // 清空鼠标移动和鼠标抬起事件,就是鼠标抬起之后,再拖拽就无效了。
                document.onmousemove = document.onmouseup = null;
                // 计算当前视频的时间
                VideoNode.currentTime = VideoNode.duration * (CrlNode.offsetLeft + 9) / LoadNode.offsetWidth;
                //console.log((CrlNode.offsetLeft+9)/LoadNode.offsetWidth);
                //console.log()

                //VideoNode.play();
                //PlayBln = false;
                //className = 'pauseNode';
                // 切换按钮是播放还是暂停状态
                if (PlayBln == false) {
                    //console.log(1);
                    PlayNode.className = 'pauseNode';
                    VideoNode.play();
                }
                else {
                    //console.log(2);
                    PlayNode.className = 'playNode';
                    VideoNode.pause();
                }
            };
            return false;
        };

同学可以回顾视频,结合源码实现效果,帮助同学自己更好的理解

祝学习愉快~

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
3.WebAPP开发与小程序
  • 参与学习           人
  • 提交作业       622    份
  • 解答问题       6815    个

微信带火了小程序,也让前端工程师有了更多的展现机会,本阶段带你从移动基础知识的学习到webAPP开发,及小程序开发,让你PC端与移动端两端通吃。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师