摘要:事件響應式進度條的應用場景主要是自定義播放器的進度條。效果圖以上就是可以利用本組件實現的一些效果,他們都能響應和兩種事件。部分對現在就有需求使用這個帶事件的進度條的同學來說,看看這部分,可以幫助你自己修改完善它。
寫在前面
找了很多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部分
對現在就有需求使用這個帶事件的進度條的同學來說,看看這部分,可以幫助你自己修改、完善它。
而對于想要先試用該組件的同學,則可以先不看這部分,等你用到發現該組件功能不足的時候,再看這部分代碼也不遲。
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", }, // 標記是否按下鼠標 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(){ // 數據驗證 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"
用例:
組件props
leftBg:進度條已劃過部分背景色
bgc:進度條還未劃過部分背景色
ballBgc:滑塊背景色
width:進度條占父組件的寬度百分比,傳百分比數值
height:進度條高度,傳像素值
事件pbar-drag: 拖動進度條時觸發,回傳value值和百分比值
pbar-drag: 點擊進度條某一位置時觸發,回傳value值和百分比值
最后如果本文對你有幫助,請不要吝嗇手中的點贊喲。
編程貴在實踐,趕緊行動起來吧!
技術博客 || GitHub || 掘金主頁
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107222.html
摘要:轉載來源包管理器管理著庫,并提供讀取和打包它們的工具。能構建更好應用的客戶端包管理器。一個整合和的最佳思想,使開發者能快速方便地組織和編寫前端代碼的下一代包管理器。很棒的組件集合。隱秘地使用和用戶數據。 轉載來源:https://github.com/jobbole/aw... 包管理器管理著 javascript 庫,并提供讀取和打包它們的工具。?npm – npm 是 javasc...
摘要:轉載來源包管理器管理著庫,并提供讀取和打包它們的工具。能構建更好應用的客戶端包管理器。一個整合和的最佳思想,使開發者能快速方便地組織和編寫前端代碼的下一代包管理器。很棒的組件集合。隱秘地使用和用戶數據。 轉載來源:https://github.com/jobbole/aw... 包管理器管理著 javascript 庫,并提供讀取和打包它們的工具。?npm – npm 是 javasc...
摘要:一個專注于瀏覽器端和兼容的包管理器。一個整合和的最佳思想,使開發者能快速方便地組織和編寫前端代碼的下一代包管理器。完全插件化的工具,能在中識別和記錄模式。健壯的優雅且功能豐富的模板引擎。完整的經過充分測試和記錄數據結構的庫。 【導讀】:GitHub 上有一個 Awesome – XXX 系列的資源整理。awesome-javascript 是 sorrycc 發起維護的 JS 資源列表...
摘要:官網全新的靜態包管理器。官網一個整合和官網的最佳思想,使開發者能快速方便地組織和編寫前端代碼的下一代包管理器。官網小巧的兼容的所見即所得的富文本編輯器。官網富文本編輯器。官網由制作,適用于每天寫作的富文本編輯器。 1. 包管理器 管理著 javascript 庫,并提供讀取和打包它們的工具。 npm:npm 是 javascript 的包管理器。官網 cnpm:cnpm 是 由于國...
閱讀 1006·2019-08-30 15:55
閱讀 3446·2019-08-30 13:10
閱讀 1274·2019-08-29 18:45
閱讀 2352·2019-08-29 16:25
閱讀 2113·2019-08-29 15:13
閱讀 2427·2019-08-29 11:29
閱讀 559·2019-08-26 17:34
閱讀 1490·2019-08-26 13:57