成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

基于Vue的事件響應(yīng)式進(jìn)度條組件

renweihub / 3456人閱讀

摘要:事件響應(yīng)式進(jìn)度條的應(yīng)用場(chǎng)景主要是自定義播放器的進(jìn)度條。效果圖以上就是可以利用本組件實(shí)現(xiàn)的一些效果,他們都能響應(yīng)和兩種事件。部分對(duì)現(xiàn)在就有需求使用這個(gè)帶事件的進(jìn)度條的同學(xué)來(lái)說(shuō),看看這部分,可以幫助你自己修改完善它。

寫在前面

找了很多vue進(jìn)度條組件,都不包含拖拽和點(diǎn)擊事件,input range倒是原生包含input和change事件,但是直接基于input range做進(jìn)度條的話,樣式部分需要做大量調(diào)整和兼容性處理。即使做好了,將來(lái)需要修改外觀,又是一番折騰。

基于以上兩個(gè)原因,做了一個(gè)可以響應(yīng)input和change事件(即一個(gè)是拖動(dòng)進(jìn)度條到某處,一個(gè)是在進(jìn)度條某位置點(diǎn)擊使其值變?yōu)樵撐恢茫┑膁iv實(shí)現(xiàn)的Vue組件,這樣既滿足了對(duì)進(jìn)度條事件的需求,也帶來(lái)了如有需求變動(dòng),樣式修改很方便的好處。

事件響應(yīng)式進(jìn)度條的應(yīng)用場(chǎng)景主要是自定義video播放器的進(jìn)度條。

效果圖

以上就是可以利用本組件實(shí)現(xiàn)的一些效果,他們都能響應(yīng)input和change兩種事件。

首先是模板部分

認(rèn)真看一下上圖,怎么構(gòu)造HTML模板還是需要一番考慮的,我也是改了好幾次,最后定的這個(gè)結(jié)構(gòu)。首先有一層外包div就不說(shuō)了。然后外包div下面就一個(gè)class = "progress"的div,這個(gè)div內(nèi)部的div是表示進(jìn)度條已劃過(guò)部分(class="left"),class="left"這個(gè)div內(nèi)部又包含一個(gè)div來(lái)表示我們可以拖動(dòng)的滑塊小球。

說(shuō)一下好處,這樣的結(jié)構(gòu),做出來(lái)的樣式,在頁(yè)面檢查元素的時(shí)候,能夠清晰看到每個(gè)div和頁(yè)面上展示的部分是重合的。

如果你的進(jìn)度條 表示整個(gè)長(zhǎng)度的div、表示左半部分的div、表示滑塊的div這三部分不是我這種嵌套結(jié)構(gòu),而是兄弟節(jié)點(diǎn)關(guān)系,你就得用樣式做相對(duì)定位,讓后兩個(gè)兄弟節(jié)點(diǎn)上移到第一個(gè)兄弟元素的位置,這樣,檢查元素的時(shí)候,進(jìn)度條下面的其他組件的盒子就會(huì)浸透到進(jìn)度條的區(qū)域。雖然用戶不會(huì)檢查元素,但是時(shí)間久了之后也不方便程序員自己觀察,不是嗎。

也就是說(shuō),我們都希望HTML結(jié)構(gòu)表達(dá)的元素和檢查元素的時(shí)候顯示的每個(gè)元素的占位是一致的。這也算是對(duì)你的HTML結(jié)構(gòu)是否構(gòu)造合理的一個(gè)評(píng)價(jià)指標(biāo)。

js部分

對(duì)現(xiàn)在就有需求使用這個(gè)帶事件的進(jìn)度條的同學(xué)來(lái)說(shuō),看看這部分,可以幫助你自己修改、完善它。

而對(duì)于想要先試用該組件的同學(xué),則可以先不看這部分,等你用到發(fā)現(xiàn)該組件功能不足的時(shí)候,再看這部分代碼也不遲。

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){
                    // 修改進(jìn)度條本身
                    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){
                    // 修改進(jìn)度條本身
                    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){
                // 沒有按左鍵進(jìn)入進(jìn)度條
                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ù)驗(yàn)證
            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 + "%";
        },
    }
安裝、使用 地址

代碼庫(kù)地址在GitHub

安裝、使用
npm install vue-draggable-progressbar --save

import progressBar from "vue-draggable-progressbar"

用例:












組件props

leftBg:進(jìn)度條已劃過(guò)部分背景色

bgc:進(jìn)度條還未劃過(guò)部分背景色

ballBgc:滑塊背景色

width:進(jìn)度條占父組件的寬度百分比,傳百分比數(shù)值

height:進(jìn)度條高度,傳像素值

事件

pbar-drag: 拖動(dòng)進(jìn)度條時(shí)觸發(fā),回傳value值和百分比值

pbar-drag: 點(diǎn)擊進(jìn)度條某一位置時(shí)觸發(fā),回傳value值和百分比值

最后

如果本文對(duì)你有幫助,請(qǐng)不要吝嗇手中的點(diǎn)贊喲。
編程貴在實(shí)踐,趕緊行動(dòng)起來(lái)吧!

關(guān)于作者

技術(shù)博客 || GitHub || 掘金主頁(yè)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/107222.html

相關(guān)文章

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

    摘要:轉(zhuǎn)載來(lái)源包管理器管理著庫(kù),并提供讀取和打包它們的工具。能構(gòu)建更好應(yīng)用的客戶端包管理器。一個(gè)整合和的最佳思想,使開發(fā)者能快速方便地組織和編寫前端代碼的下一代包管理器。很棒的組件集合。隱秘地使用和用戶數(shù)據(jù)。 轉(zhuǎn)載來(lái)源:https://github.com/jobbole/aw... 包管理器管理著 javascript 庫(kù),并提供讀取和打包它們的工具。?npm – npm 是 javasc...

    netmou 評(píng)論0 收藏0
  • javascript功能插件大集合 前端常用插件 js常用插件

    摘要:轉(zhuǎn)載來(lái)源包管理器管理著庫(kù),并提供讀取和打包它們的工具。能構(gòu)建更好應(yīng)用的客戶端包管理器。一個(gè)整合和的最佳思想,使開發(fā)者能快速方便地組織和編寫前端代碼的下一代包管理器。很棒的組件集合。隱秘地使用和用戶數(shù)據(jù)。 轉(zhuǎn)載來(lái)源:https://github.com/jobbole/aw... 包管理器管理著 javascript 庫(kù),并提供讀取和打包它們的工具。?npm – npm 是 javasc...

    Hydrogen 評(píng)論0 收藏0
  • javascript功能插件大集合,寫前端親們記得收藏

    摘要:一個(gè)專注于瀏覽器端和兼容的包管理器。一個(gè)整合和的最佳思想,使開發(fā)者能快速方便地組織和編寫前端代碼的下一代包管理器。完全插件化的工具,能在中識(shí)別和記錄模式。健壯的優(yōu)雅且功能豐富的模板引擎。完整的經(jīng)過(guò)充分測(cè)試和記錄數(shù)據(jù)結(jié)構(gòu)的庫(kù)。 【導(dǎo)讀】:GitHub 上有一個(gè) Awesome – XXX 系列的資源整理。awesome-javascript 是 sorrycc 發(fā)起維護(hù)的 JS 資源列表...

    cfanr 評(píng)論0 收藏0
  • JavaScript 資源大全中文版

    摘要:官網(wǎng)全新的靜態(tài)包管理器。官網(wǎng)一個(gè)整合和官網(wǎng)的最佳思想,使開發(fā)者能快速方便地組織和編寫前端代碼的下一代包管理器。官網(wǎng)小巧的兼容的所見即所得的富文本編輯器。官網(wǎng)富文本編輯器。官網(wǎng)由制作,適用于每天寫作的富文本編輯器。 1. 包管理器 管理著 javascript 庫(kù),并提供讀取和打包它們的工具。 npm:npm 是 javascript 的包管理器。官網(wǎng) cnpm:cnpm 是 由于國(guó)...

    jzman 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

renweihub

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<