Vue的事件響應(yīng)式進度條組件實例詳解
寫在前面
找了很多vue進度條組件,都不包含拖拽和點擊事件,input range倒是原生包含input和change事件,但是直接基于input range做進度條的話,樣式部分需要做大量調(diào)整和兼容性處理。即使做好了,將來需要修改外觀,又是一番折騰。
基于以上兩個原因,做了一個可以響應(yīng)input和change事件(即一個是拖動進度條到某處,一個是在進度條某位置點擊使其值變?yōu)樵撐恢茫┑膁iv實現(xiàn)的Vue組件,這樣既滿足了對進度條事件的需求,也帶來了如有需求變動,樣式修改很方便的好處。
效果圖

以上就是可以利用本組件實現(xiàn)的一些效果,他們都能響應(yīng)input和change兩種事件。
首先是模板部分
認(rèn)真看一下上圖,怎么構(gòu)造HTML模板還是需要一番考慮的,我也是改了好幾次,最后定的這個結(jié)構(gòu)。首先有一層外包div就不說了。然后外包div下面就一個class = 'progress'的div,這個div內(nèi)部的div是表示進度條已劃過部分(class="left"),class="left"這個div內(nèi)部又包含一個表示div來表示我們可以拖動的滑塊小球。
說一下好處,這樣的結(jié)構(gòu),做出來的樣式,在頁面檢查元素的時候,能夠清晰看到每個div和頁面上展示的部分是重合的。
如果你的進度條 表示整個長度的div、表示左半部分的div、表示滑塊的div不是我這種嵌套結(jié)構(gòu),而是兄弟節(jié)點關(guān)系,你就得用樣式做相對定位,讓后兩個兄弟節(jié)點上移,這樣,檢查元素的時候,進度條下面的其他組件的盒子就會浸透到進度條的區(qū)域。雖然用戶不會檢查元素,但是時間久了之后也不方便程序員自己觀察,不是嗎。
也就是說,我們都希望HTML結(jié)構(gòu)表達的元素和檢查元素的時候顯示的每個元素的占位是一致的。這也算是對你的HTML結(jié)構(gòu)是否構(gòu)造合理的一個評價指標(biāo)。
<template>
<div class="progress-wrapper" :style="wrapStyle">
<div class="progress" @mousedown="mousedownHandler" @mouseover="mouseoverHandler"
@mousemove="mousemoveHandler" @mouseup="mouseupHandler" :style="pBarStyle">
<div class="left" :style="leftStyle">
<div class="ball" :style="ballStyle"></div>
</div>
<slot></slot>
</div>
</div>
</template>
js部分
對現(xiàn)在就有需求使用這個帶事件的進度條的同學(xué)來說,看看這部分,可以幫助你自己修改、完善它。
而對于想要先試用該組件的同學(xué),則可以先不看這部分,等你用到發(fā)現(xiàn)該組件功能不足的時候,再看這部分代碼也不遲。
export default {
name: 'ProgressBar',
props: {
leftBg: String,
bgc: String,
ballBgc: String,
height: String,
width: String,
max: {
type: Number,
default: 100,
},
min: {
type: Number,
default: 0,
},
value: {
type: Number,
default: 36,
},
},
data: function () {
return {
pValue: this.value,
pMax: this.max,
pMin: this.min,
wrapStyle: {
'width': this.width,
},
pBarStyle: {
'backgroundColor': this.bgc,
'height': this.height,
},
leftStyle: {
'width': this.progressPercent + '%',
'background': this.leftBg,
'height': this.height,
},
ballStyle: {
'backgroundColor': this.ballBgc,
'height': this.height,
'width': this.height,
'borderRadius': parseInt(this.height) / 2 + 'px',
'right': - parseInt(this.height) / 2 + 'px',
},
// 標(biāo)記是否按下鼠標(biāo)
isMouseDownOnBall: false,
}
},
computed: {
progressPercent(){
return (this.pValue - this.pMin) / (this.pMax - this.pMin) * 100;
},
progressElement(){
return this.$el.getElementsByClassName('progress')[0];
},
},
methods: {
mousedownHandler(e){
if(e.which === 1){
this.isMouseDownOnBall = true;
}
},
mousemoveHandler(e){
if(this.isMouseDownOnBall === true){
// 修改進度條本身
let decimal = (e.clientX - this.$el.offsetLeft) / this.progressElement.clientWidth;
let percent = decimal * 100;
this.leftStyle.width = percent + '%';
// 修改value
this.pValue = this.pMin + decimal * (this.pMax - this.pMin);
this.$emit('pbar-drag', this.pValue, percent);
}
},
mouseupHandler(e){
if(this.isMouseDownOnBall){
// 修改進度條本身
let decimal = (e.clientX - this.$el.offsetLeft) / this.progressElement.clientWidth;
let percent = decimal * 100;
this.leftStyle.width = percent + '%';
// 修改value
this.pValue = this.pMin + decimal * (this.pMax - this.pMin);
this.$emit('pbar-seek', this.pValue, percent);
this.isMouseDownOnBall = false;
}
},
mouseoverHandler(e){
// 沒有按左鍵進入進度條
if(e.which === 0){
this.isMouseDownOnBall = false;
}
}
},
watch: {
max(cur, old){
this.pMax = cur;
},
min(cur, old){
this.pMin = cur;
},
value(cur, old){
this.pValue = cur;
},
progressPercent(cur, old){
this.leftStyle.width = cur + '%';
}
},
mounted(){
// 數(shù)據(jù)驗證
if(this.max < this.min){
console.error("max can't less than min !");
}
// 初始百分比
this.leftStyle.width = (this.pValue - this.pMin) / (this.pMax - this.pMin) * 100 + '%';
},
}
安裝、使用
地址
代碼庫地址在GitHub
安裝、使用
npm install vue-draggable-progressbar --save import progressBar from 'vue-draggable-progressbar'
用例:
<progress-bar ref="aa"></progress-bar>
<progress-bar width="40%" leftBg="greenyellow" bgc="#ccc" ballBgc="red"></progress-bar>
<progress-bar width="60%" leftBg="linear-gradient(to right, yellow, pink)" bgc="#ccc" ballBgc="red"></progress-bar>
<progress-bar width="80%" leftBg="yellow" bgc="#ccc" ballBgc="red" height="30px"></progress-bar>
<progress-bar leftBg="greenyellow" bgc="#ccc" ballBgc="rgba(255,0,0,0.2)" height="40px"></progress-bar>
<progress-bar leftBg="greenyellow" bgc="#ccc" ballBgc="red" :max="max" :value="value" :min="min"
@pbar-drag="drag" @pbar-seek="seek"></progress-bar>
組件props
- leftBg:進度條已劃過部分背景色
- bgc:進度條還未劃過部分背景色
- ballBgc:滑塊背景色
- width:進度條占父組件的寬度百分比,傳百分比數(shù)值
- height:進度條高度,傳像素值
- max:進度條最大值
- min:最小值
- value:當(dāng)前值
事件
- pbar-drag: 拖動進度條時觸發(fā),回傳value值和百分比值
- pbar-drag: 點擊進度條某一位置時觸發(fā),回傳value值和百分比值
總結(jié)
以上所述是小編給大家介紹的Vue的事件響應(yīng)式進度條組件實例詳解,希望對大家有所幫助,如果大家喲任何疑問歡迎給我留言,小編會及時回復(fù)大家的!
相關(guān)文章
vue.config.js文件devServer字段的常用選項詳解
在?Vue?CLI?生成的?vue.config.js?文件中,devServer?字段用于配置開發(fā)服務(wù)器的選項,本文給大家介紹vue.config.js文件devServer字段的常用選項,感興趣的朋友一起看看吧2023-11-11
解決vue的變量在settimeout內(nèi)部效果失效的問題
今天小編就為大家分享一篇解決vue的變量在settimeout內(nèi)部效果失效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
vue下如何利用canvas實現(xiàn)在線圖片標(biāo)注
這篇文章主要介紹了vue下如何利用canvas實現(xiàn)在線圖片標(biāo)注,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04
vue的index.html中獲取環(huán)境變量和業(yè)務(wù)判斷圖文詳解
這篇文章主要給大家介紹了關(guān)于vue的index.html中獲取環(huán)境變量和業(yè)務(wù)判斷的相關(guān)資料,對vue來說index.html是一個總的入口文件,vue是單頁面應(yīng)用,掛在id為app的div下然后動態(tài)渲染路由模板,需要的朋友可以參考下2023-09-09
vue實現(xiàn)動態(tài)表單動態(tài)渲染組件的方式(2)
這篇文章主要為大家詳細(xì)介紹了vue實現(xiàn)動態(tài)表單動態(tài)渲染組件的方式第二篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04

