需要实现拖拽和点击进度条的功能,但是很多插件都只实现拖拽事件,基于以上两个原因,自己封装了一个可以响应input和change事件(即一个是拖动进度条到某处,一个是在进度条某位置点击使其值变为该位置)的div实现的Vue组件。
目前该组件只实现了拖拽功能,点击事件后续慢慢更新出来
父组件

<Progress :min=0 :max=100 v-model="data.per"></Progress>
data() {return {data: {per: 0}}}

进度条组件

css

mixin文件是前辈封装好的方法,此为实例:
.mixin-size(@width, @height, @boxSizing: border-box) {box-sizing: @boxSizing;width: @width;height: @height;
}
.mixin-abs-item(@left: auto, @top: auto, @right: auto, @bottom: auto) {position: absolute;left: @left;top: @top;right: @right;bottom: @bottom;
}
使用:
.slider{position:relative;.mixin-size(260px, 2px);margin:20px 0;background:#D8D8D8;cursor:pointer;.process{.mixin-abs-item(0, 0);}.thunk{.mixin-abs-item(0, -5px);.mixin-size(12px,12px);}.block{position: absolute;z-index: 2;.mixin-size(12px,12px);background:#2C69F9;border:3px solid #D8E3FF;border-radius:50%;transition:.2s all}.space { &-1 {.mixin-step(0);    }&-2 {.mixin-step(52px);}&-3 {.mixin-step(104px);}&-4 {.mixin-step(156px);}&-5 {.mixin-step(208px);}&-6 {.mixin-step(260px);}}}

html

<template><div class="slider" ref="slider"><div class="process" :style="{width}"></div><div class="thunk" ref="trunk" :style="{left}"><div class="block"></div></div>//可以点击小球 进度条变化<div class="space" @click="clickhandler($event)"><div class="space-1"></div><div class="space-2"></div><div class="space-3"></div><div class="space-4"></div><div class="space-5"></div><div class="space-6"></div></div></div>
</template>

js

/** min 进度条最小值* max 进度条最大值* v-model 对当前值进行双向绑定实时显示拖拽进度
* */
export default {props: ['min', 'max', 'value'],data() {return {module_space: 1,//滚动条DOM元素slider: null,//拖拽DOM元素        thunk: null,//当前值per: this.value}},//渲染到页面的时候mounted() {this.mousedownhandler()},methods: {...mapActions(['setExtra']),// 点击事件clickhandler(e) {let  spaceWitch = e.clientX - this.$refs.trunk.offsetWidthvar scales = spaceWitch / this.$refs.slider.offsetWidth - 0.35this.per = Math.ceil((this.max - this.min) * scales + this.min)this.updateDataStore()},// 存储数据updateDataStore() {this.per = Math.max(this.per, this.min)this.per = Math.min(this.per, this.max)if (this.per === 0) {//设置间距 可根据实际需求 调整this.module_space = 0.5} else {this.module_space = this.per * 1.5}let data = {   module_space: this.module_space}this.setExtra({...this.Extra,...data    })},mousedownhandler() {this.slider = this.$refs.sliderthis.thunk = this.$refs.trunkvar _this = thisthis.thunk.onmousedown = function(e) {var width = parseInt(_this.width, 10)var disX = e.clientXdocument.onmousemove = function(ev) {// value, left, width// 当value变化的时候,会通过计算属性修改left,width// 拖拽的时候获取的新widthvar newWidth = ev.clientX - disX + widthvar scale = newWidth / _this.slider.offsetWidth_this.per = Math.ceil((_this.max - _this.min) * scale + _this.min)_this.updateData2Store()}document.onmouseup = function() {document.onmousemove = document.onmouseup = null}return false}}},computed: {...mapGetters({Extra: 'getExtra'}),// 设置一个百分比,提供计算slider进度宽度和trunk的left值// 对应公式为  当前值-最小值/最大值-最小值 = slider进度width / slider总width// trunk left =  slider进度width + trunk宽度/2scale() {return (this.per - this.min) / (this.max - this.min)},width() {if (this.slider) {return this.slider.offsetWidth * this.scale + 'px'} else {return 0 + 'px'}},left() {if (this.slider) {return this.slider.offsetWidth * this.scale -  this.thunk.offsetWidth / 2  + 'px'} else {return 0 + 'px'}}}}

在做的过程中会遇到很多问题 现总结如下:

1 ‘document.body.addEventLitener is not a function’

当时看到的时候,很粗心,第一个想法是百度查资料,可查到的都是:当监听某个节点事件的时候,可能是因为选择器没有正确选择元素对象
document.getElementsByClassName(…)捕捉到的是该类名元素的数组
正确的访问方式应该是:
document.getElementsByClassName(…)[0].addEventListener…
没有第一时间检查单词拼写错误 ,后来才发现问题所在

2 mousedownhandler事件没有执行

点击拖动的时候,事件没有执行,后来才发现在@mousedown="mousedownhandler(event)中绑定方法不对,vue中mousedown事件要加event) 中绑定方法不对,vue中mousedown事件要加event)中绑定方法不对,vue中mousedown事件要加$符号,而不是mousedownhandler(e)

在vue中 最好不要直接操作dom元素

参考链接

vue开发拖拽进度条滑动组件

vue点击拖动进度条相关推荐

  1. gsyVideoPlayer点击/拖动进度条播放视频会回退

    解决办法:https://github.com/CarGuo/GSYVideoPlayer/blob/master/doc/QUESTION.md 第六点 6.为什么拖动视屏会弹回来,因为ijk的FF ...

  2. 带锚点进度条android,Axure:实现可拖动进度条

    原标题:Axure:实现可拖动进度条 怎样用Axure实现拖动进度条?一起来看下吧~ 可拖动进度条的应用场景,例如调节APP屏幕亮度,音乐播放器的音量等. 效果如下(●ˇ∀ˇ●) 准备4个元件,如下所 ...

  3. vue-video-player 拖动进度条触发暂停移动端展示倍速菜单

    一.安装 npm install vue-video-player --save 二. 组件内引入 import { videoPlayer } from 'vue-video-player' imp ...

  4. 【网页上视频无法拖动进度条,如何进行加速播放操作以及网页失焦后如何可继续播放】

    面对网页视频无法加速时如何进行加速播放 遇到一 zhengzhi 刷题任务时 ,发现无法拖动进度条,也没有加速播放并且鼠标一失焦就会自动暂停时,让我乖乖看完是不可能,因此找了一个解决方案快速完成该任务 ...

  5. python 视频播放 拖动_视频画中画效果,拖动进度条可以seek到相应视频帧显示

    在视频开发中,我们常常看到这样的效果,拖动进度条时,或是在进度条上方或是在屏幕中间,显示拖动进度条位置时刻的某一帧画面. 这个需求,如果是你,你会如何做? 通常一个需求,不仅要考虑实现,还有考虑一些是 ...

  6. 【Android FFMPEG 开发】FFMPEG 视频播放进度控制 ( 显示播放进度 | 拖动进度条播放 )

    文章目录 I . FFMPEG 播放进度控制 II . FFMPEG 播放视频 ( 效果展示 ) III . FFMPEG 获取视频时长 IV . FFMPEG 视频播放进度获取 V . FFMPEG ...

  7. 异常:谷歌浏览器video标签播放视频不能拖动进度条

    谷歌浏览器video标签播放视频不能拖动进度条 当前端video的src不是直接使用视频文件的地址,而是通过后台下载接口返回文件流时,后台返回流因为没为response的header设置一些参数,会在 ...

  8. 关于前端video标签视频无法拖动进度条快进问题(Django)

    因为后端返回的是视频的文件流,并不是视频文件地址.后端返回流的时候要为header设置一些参数,否则部分浏览器会出现问题(如Google Chrome...). django中常用返回文件流写法: c ...

  9. uniapp实现video视频禁止拖拽快进功能,禁止拖动进度条快进

    之前写了一篇文章 , 禁止快进的 , 但刚刚发现在uni-app中实现不了 , 所以又上网找别的方法,话不多说, 上代码 一 , template中 <video id="myVide ...

最新文章

  1. 中国10大最震撼的无人工厂,你吃的用的都是这么来的!
  2. 人们需要更美观的数据中心
  3. F5发布最新文件虚拟化存储产品ARX 4000
  4. 第五章 MongoDb索引优化 5.4
  5. c语言中ndigit用法,求C语言中头文件及函数的含意的总分类
  6. APP提示框设计模板|UI设计师灵感好帮手
  7. [原创] Jenkins slave agent 分布式构建
  8. 各种开源Android 系统定制
  9. Activity及Dialog的全透明
  10. python json详解
  11. Angular和Vue.js 深度对比
  12. 无源三端口器件特性分析-《微波工程》
  13. 简单20行python代码_就这么简单!20行Python代码爬取腾讯视频
  14. RS232RS485基本简介
  15. jq基础文档手册3.0
  16. rs232读取智能电表_智能电表防窃电原理 偷电为什么会被发现
  17. 【信号类型识别】基于高阶累积量和GRNN神经网络的WIFI与3G/4G信号的识别
  18. 只要有心,学好Linux并非难事
  19. 运维体系 - IT Service CMM - IT 服务能力成熟度模型
  20. Verilog 实现 UART RX 接收器

热门文章

  1. 中基鸿业个人理财注意事项
  2. 象棋小游戏(pygame)棋子随机摆布
  3. 极光一键登录PHP方法
  4. 拼多多pdd电商api接口
  5. JAVA多线程实现和应用总结
  6. 【设计方案分享】基于单片机温度监测监控报警系统设计-基于单片机钞票自动智能识别系统设计-基于单片机乒乓球游戏机控制系统设计-基于单片机温度监测监控报警系统设计-基于单片机矩阵键盘的电子密码锁设计
  7. 西门子200PLC不工作了,所有灯都灭了
  8. Cocos2Dx之调度器-欧阳左至
  9. 数字图像处理与Python实现-颜色空间转换-RGB颜色空间与HSV颜色空间转换
  10. 微信小程序从零开始(零)-Hello World