在Vue中如何實作事件響應式進度條元件
這篇文章主要介紹了Vue的事件響應式進度條元件的實例程式碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
寫在前面
找了很多vue進度條元件,都不包含拖曳和點擊事件,input range倒是原生包含input和change事件,但是直接基於input range做進度條的話,樣式部分需要做大量調整和相容性處理。即使做好了,將來需要修改外觀,又是一番折騰。
基於以上兩個原因,做了一個可以回應input和change事件(即一個是拖曳進度條到某處,一個是在進度條某處點擊使其值變為該位置)的p實現的Vue元件,這樣既滿足了進度條事件的需求,也帶來瞭如有需求變動,樣式修改很方便的好處。
效果圖
以上就是可以利用本元件實現的一些效果,他們都能回應input和change兩種事件。
首先是模板部分
認真看上圖,怎麼構造HTML模板還是需要一番考慮的,我也是改了好幾次,最後定的這個結構。首先有一層外包p就不說了。然後外包p下面就一個class = 'progress'的p,這個p內部的p是表示進度條已劃過部分(class="left"),class="left"這個p內部又包含一個表示p來表示我們可以拖曳的滑塊小球。
說一下好處,這樣的結構,做出來的樣式,在頁面檢查元素的時候,能夠清楚地看到每個p和頁面上展示的部分是重合的。
如果你的進度條表示整個長度的p、表示左半部的p、表示滑塊的p不是我這種嵌套結構,而是兄弟節點關係,你就得用樣式做相對定位,讓後兩個兄弟節點上移,這樣,檢查元素的時候,進度條下面的其他組件的盒子就會浸透到進度條的區域。雖然使用者不會檢查元素,但是時間久了之後也不方便程式設計師自己觀察,不是嗎。
也就是說,我們都希望HTML結構表達的元素和檢查元素的時候顯示的每個元素的佔位是一致的。這也算是對你的HTML結構是否構造合理的一個評估指標。
<template> <p class="progress-wrapper" :style="wrapStyle"> <p class="progress" @mousedown="mousedownHandler" @mouseover="mouseoverHandler" @mousemove="mousemoveHandler" @mouseup="mouseupHandler" :style="pBarStyle"> <p class="left" :style="leftStyle"> <p class="ball" :style="ballStyle"></p> </p> <slot></slot> </p> </p> </template>
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'
使用案例:
<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:進度條佔父元件的寬度百分比,傳百分比數值
- height:進度條高度,傳像素值
- #max:進度條最大值
- min:最小值
- value:目前值
#事件
- #pbar-drag: 拖曳進度列時觸發,回傳value值和百分比值
- pbar-drag: 點擊進度條某一位置時觸發,回傳value值和百分比值
以上是在Vue中如何實作事件響應式進度條元件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

在 Vue.js 中引用 JS 文件的方法有三種:直接使用 <script> 標籤指定路徑;利用 mounted() 生命週期鉤子動態導入;通過 Vuex 狀態管理庫進行導入。

可以通過以下步驟為 Vue 按鈕添加函數:將 HTML 模板中的按鈕綁定到一個方法。在 Vue 實例中定義該方法並編寫函數邏輯。

Vue.js 中的 watch 選項允許開發者監聽特定數據的變化。當數據發生變化時,watch 會觸發一個回調函數,用於執行更新視圖或其他任務。其配置選項包括 immediate,用於指定是否立即執行回調,以及 deep,用於指定是否遞歸監聽對像或數組的更改。

在 Vue.js 中使用 Bootstrap 分為五個步驟:安裝 Bootstrap。在 main.js 中導入 Bootstrap。直接在模板中使用 Bootstrap 組件。可選:自定義樣式。可選:使用插件。

Vue.js 返回上一頁有四種方法:$router.go(-1)$router.back()使用 <router-link to="/"> 組件window.history.back(),方法選擇取決於場景。

在 Vue 中實現跑馬燈/文字滾動效果,可以使用 CSS 動畫或第三方庫。本文介紹了使用 CSS 動畫的方法:創建滾動文本,用 <div> 包裹文本。定義 CSS 動畫,設置 overflow: hidden、width 和 animation。定義關鍵幀,設置動畫開始和結束時的 transform: translateX()。調整動畫屬性,如持續時間、滾動速度和方向。

可以通過以下方法查詢 Vue 版本:使用 Vue Devtools 在瀏覽器的控制台中查看“Vue”選項卡。使用 npm 運行“npm list -g vue”命令。在 package.json 文件的“dependencies”對像中查找 Vue 項。對於 Vue CLI 項目,運行“vue --version”命令。檢查 HTML 文件中引用 Vue 文件的 <script> 標籤中的版本信息。

Vue.js 遍歷數組和對像有三種常見方法:v-for 指令用於遍歷每個元素並渲染模板;v-bind 指令可與 v-for 一起使用,為每個元素動態設置屬性值;.map 方法可將數組元素轉換為新數組。
