资讯专栏INFORMATION COLUMN

基于Vue的事件响应式进度条组件

renweihub / 3528人阅读

摘要:事件响应式进度条的应用场景主要是自定义播放器的进度条。效果图以上就是可以利用本组件实现的一些效果,他们都能响应和两种事件。部分对现在就有需求使用这个带事件的进度条的同学来说,看看这部分,可以帮助你自己修改完善它。

写在前面

找了很多vue进度条组件,都不包含拖拽和点击事件,input range倒是原生包含input和change事件,但是直接基于input range做进度条的话,样式部分需要做大量调整和兼容性处理。即使做好了,将来需要修改外观,又是一番折腾。

基于以上两个原因,做了一个可以响应input和change事件(即一个是拖动进度条到某处,一个是在进度条某位置点击使其值变为该位置)的div实现的Vue组件,这样既满足了对进度条事件的需求,也带来了如有需求变动,样式修改很方便的好处。

事件响应式进度条的应用场景主要是自定义video播放器的进度条。

效果图

以上就是可以利用本组件实现的一些效果,他们都能响应input和change两种事件。

首先是模板部分

认真看一下上图,怎么构造HTML模板还是需要一番考虑的,我也是改了好几次,最后定的这个结构。首先有一层外包div就不说了。然后外包div下面就一个class = "progress"的div,这个div内部的div是表示进度条已划过部分(class="left"),class="left"这个div内部又包含一个div来表示我们可以拖动的滑块小球。

说一下好处,这样的结构,做出来的样式,在页面检查元素的时候,能够清晰看到每个div和页面上展示的部分是重合的。

如果你的进度条 表示整个长度的div、表示左半部分的div、表示滑块的div这三部分不是我这种嵌套结构,而是兄弟节点关系,你就得用样式做相对定位,让后两个兄弟节点上移到第一个兄弟元素的位置,这样,检查元素的时候,进度条下面的其他组件的盒子就会浸透到进度条的区域。虽然用户不会检查元素,但是时间久了之后也不方便程序员自己观察,不是吗。

也就是说,我们都希望HTML结构表达的元素和检查元素的时候显示的每个元素的占位是一致的。这也算是对你的HTML结构是否构造合理的一个评价指标

</>复制代码

js部分

对现在就有需求使用这个带事件的进度条的同学来说,看看这部分,可以帮助你自己修改、完善它。

而对于想要先试用该组件的同学,则可以先不看这部分,等你用到发现该组件功能不足的时候,再看这部分代码也不迟。

</>复制代码

  1. export default {
  2. name: "ProgressBar",
  3. props: {
  4. leftBg: String,
  5. bgc: String,
  6. ballBgc: String,
  7. height: String,
  8. width: String,
  9. max: {
  10. type: Number,
  11. default: 100,
  12. },
  13. min: {
  14. type: Number,
  15. default: 0,
  16. },
  17. value: {
  18. type: Number,
  19. default: 36,
  20. },
  21. },
  22. data: function () {
  23. return {
  24. pValue: this.value,
  25. pMax: this.max,
  26. pMin: this.min,
  27. wrapStyle: {
  28. "width": this.width,
  29. },
  30. pBarStyle: {
  31. "backgroundColor": this.bgc,
  32. "height": this.height,
  33. },
  34. leftStyle: {
  35. "width": this.progressPercent + "%",
  36. "background": this.leftBg,
  37. "height": this.height,
  38. },
  39. ballStyle: {
  40. "backgroundColor": this.ballBgc,
  41. "height": this.height,
  42. "width": this.height,
  43. "borderRadius": parseInt(this.height) / 2 + "px",
  44. "right": - parseInt(this.height) / 2 + "px",
  45. },
  46. // 标记是否按下鼠标
  47. isMouseDownOnBall: false,
  48. }
  49. },
  50. computed: {
  51. progressPercent(){
  52. return (this.pValue - this.pMin) / (this.pMax - this.pMin) * 100;
  53. },
  54. progressElement(){
  55. return this.$el.getElementsByClassName("progress")[0];
  56. },
  57. },
  58. methods: {
  59. mousedownHandler(e){
  60. if(e.which === 1){
  61. this.isMouseDownOnBall = true;
  62. }
  63. },
  64. mousemoveHandler(e){
  65. if(this.isMouseDownOnBall === true){
  66. // 修改进度条本身
  67. let decimal = (e.clientX - this.$el.offsetLeft) / this.progressElement.clientWidth;
  68. let percent = decimal * 100;
  69. this.leftStyle.width = percent + "%";
  70. // 修改value
  71. this.pValue = this.pMin + decimal * (this.pMax - this.pMin);
  72. this.$emit("pbar-drag", this.pValue, percent);
  73. }
  74. },
  75. mouseupHandler(e){
  76. if(this.isMouseDownOnBall){
  77. // 修改进度条本身
  78. let decimal = (e.clientX - this.$el.offsetLeft) / this.progressElement.clientWidth;
  79. let percent = decimal * 100;
  80. this.leftStyle.width = percent + "%";
  81. // 修改value
  82. this.pValue = this.pMin + decimal * (this.pMax - this.pMin);
  83. this.$emit("pbar-seek", this.pValue, percent);
  84. this.isMouseDownOnBall = false;
  85. }
  86. },
  87. mouseoverHandler(e){
  88. // 没有按左键进入进度条
  89. if(e.which === 0){
  90. this.isMouseDownOnBall = false;
  91. }
  92. }
  93. },
  94. watch: {
  95. max(cur, old){
  96. this.pMax = cur;
  97. },
  98. min(cur, old){
  99. this.pMin = cur;
  100. },
  101. value(cur, old){
  102. this.pValue = cur;
  103. },
  104. progressPercent(cur, old){
  105. this.leftStyle.width = cur + "%";
  106. }
  107. },
  108. mounted(){
  109. // 数据验证
  110. if(this.max < this.min){
  111. console.error("max can"t less than min !");
  112. }
  113. // 初始百分比
  114. this.leftStyle.width = (this.pValue - this.pMin) / (this.pMax - this.pMin) * 100 + "%";
  115. },
  116. }
安装、使用 地址

代码库地址在GitHub

安装、使用

</>复制代码

  1. npm install vue-draggable-progressbar --save
  2. import progressBar from "vue-draggable-progressbar"

用例:

</>复制代码

组件props

leftBg:进度条已划过部分背景色

bgc:进度条还未划过部分背景色

ballBgc:滑块背景色

width:进度条占父组件的宽度百分比,传百分比数值

height:进度条高度,传像素值

事件

pbar-drag: 拖动进度条时触发,回传value值和百分比值

pbar-drag: 点击进度条某一位置时触发,回传value值和百分比值

最后

如果本文对你有帮助,请不要吝啬手中的点赞哟。
编程贵在实践,赶紧行动起来吧!

关于作者

技术博客 || GitHub || 掘金主页

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107222.html

相关文章

  • javascript功能插件大集合 前端常用插件 js常用插件

    摘要:转载来源包管理器管理着库,并提供读取和打包它们的工具。能构建更好应用的客户端包管理器。一个整合和的最佳思想,使开发者能快速方便地组织和编写前端代码的下一代包管理器。很棒的组件集合。隐秘地使用和用户数据。 转载来源:https://github.com/jobbole/aw... 包管理器管理着 javascript 库,并提供读取和打包它们的工具。•npm – npm 是 javasc...

    netmou 评论0 收藏0
  • javascript功能插件大集合 前端常用插件 js常用插件

    摘要:转载来源包管理器管理着库,并提供读取和打包它们的工具。能构建更好应用的客户端包管理器。一个整合和的最佳思想,使开发者能快速方便地组织和编写前端代码的下一代包管理器。很棒的组件集合。隐秘地使用和用户数据。 转载来源:https://github.com/jobbole/aw... 包管理器管理着 javascript 库,并提供读取和打包它们的工具。•npm – npm 是 javasc...

    Hydrogen 评论0 收藏0
  • javascript功能插件大集合,写前端亲们记得收藏

    摘要:一个专注于浏览器端和兼容的包管理器。一个整合和的最佳思想,使开发者能快速方便地组织和编写前端代码的下一代包管理器。完全插件化的工具,能在中识别和记录模式。健壮的优雅且功能丰富的模板引擎。完整的经过充分测试和记录数据结构的库。 【导读】:GitHub 上有一个 Awesome – XXX 系列的资源整理。awesome-javascript 是 sorrycc 发起维护的 JS 资源列表...

    cfanr 评论0 收藏0
  • JavaScript 资源大全中文版

    摘要:官网全新的静态包管理器。官网一个整合和官网的最佳思想,使开发者能快速方便地组织和编写前端代码的下一代包管理器。官网小巧的兼容的所见即所得的富文本编辑器。官网富文本编辑器。官网由制作,适用于每天写作的富文本编辑器。 1. 包管理器 管理着 javascript 库,并提供读取和打包它们的工具。 npm:npm 是 javascript 的包管理器。官网 cnpm:cnpm 是 由于国...

    jzman 评论0 收藏0

发表评论

0条评论

renweihub

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<