亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Vue的事件響應式進度條組件實例詳解

2019-11-19 14:25:08
字體:
來源:轉載
供稿:網友

寫在前面

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

基于以上兩個原因,做了一個可以響應input和change事件(即一個是拖動進度條到某處,一個是在進度條某位置點擊使其值變為該位置)的div實現的Vue組件,這樣既滿足了對進度條事件的需求,也帶來了如有需求變動,樣式修改很方便的好處。

效果圖


以上就是可以利用本組件實現的一些效果,他們都能響應input和change兩種事件。

首先是模板部分

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

說一下好處,這樣的結構,做出來的樣式,在頁面檢查元素的時候,能夠清晰看到每個div和頁面上展示的部分是重合的。

如果你的進度條 表示整個長度的div、表示左半部分的div、表示滑塊的div不是我這種嵌套結構,而是兄弟節點關系,你就得用樣式做相對定位,讓后兩個兄弟節點上移,這樣,檢查元素的時候,進度條下面的其他組件的盒子就會浸透到進度條的區域。雖然用戶不會檢查元素,但是時間久了之后也不方便程序員自己觀察,不是嗎。

也就是說,我們都希望HTML結構表達的元素和檢查元素的時候顯示的每個元素的占位是一致的。這也算是對你的HTML結構是否構造合理的一個評價指標。

<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部分

對現在就有需求使用這個帶事件的進度條的同學來說,看看這部分,可以幫助你自己修改、完善它。

而對于想要先試用該組件的同學,則可以先不看這部分,等你用到發現該組件功能不足的時候,再看這部分代碼也不遲。

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 --saveimport 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的事件響應式進度條組件實例詳解,希望對大家有所幫助,如果大家喲任何疑問歡迎給我留言,小編會及時回復大家的!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性极品少妇精品网站| 欧美极品第一页| 欧美日产国产成人免费图片| 57pao国产成人免费| 久久久亚洲网站| 国产精品久久久久av免费| 亚洲国产小视频在线观看| 色婷婷综合成人| 久久久女女女女999久久| 欧美激情一级二级| 国产日韩在线播放| 日韩电影免费观看在线观看| 97在线视频国产| 日本成人黄色片| 日韩电影网在线| 91久久精品一区| 日韩中文字幕视频在线观看| 日韩在线观看网站| 久久精品国产亚洲一区二区| 国产一区二区三区视频免费| 97碰在线观看| 国产成人精品久久二区二区91| 国产精品第3页| 国产精品都在这里| 欧美国产一区二区三区| 欧美主播福利视频| 国产成人精品免费视频| 精品福利在线观看| 欧美日本高清视频| 日韩欧美视频一区二区三区| 亚洲美女精品久久| 亚洲欧美制服丝袜| 成人激情视频网| 69**夜色精品国产69乱| 欧美激情三级免费| 欧美激情亚洲精品| zzijzzij亚洲日本成熟少妇| 亚洲精品电影在线观看| 最近中文字幕mv在线一区二区三区四区| 欧美在线免费观看| 国产情人节一区| 国产精品老女人视频| 欧美一级电影在线| 国产日韩换脸av一区在线观看| 欧美日韩国产一区二区三区| 成人网在线观看| 国产日产欧美a一级在线| 日韩电影中文字幕一区| 日韩欧美国产免费播放| 国产成人综合av| 国产精品自产拍在线观看中文| 国产欧洲精品视频| 久久九九热免费视频| 91九色综合久久| 中日韩美女免费视频网址在线观看| 欧美成人第一页| 波霸ol色综合久久| 中文字幕久热精品视频在线| 久久综合九色九九| 91国自产精品中文字幕亚洲| 久久人人97超碰精品888| 欧美性极品少妇精品网站| 影音先锋日韩有码| 97国产在线观看| 欧美成人精品激情在线观看| 日韩在线观看网址| 超薄丝袜一区二区| 国产精品精品一区二区三区午夜版| 色婷婷久久av| 欧美日韩成人网| 91精品国产成人www| 91在线直播亚洲| 日韩中文字幕不卡视频| 日韩在线观看免费高清| 久久久噜噜噜久久| 欧美一级成年大片在线观看| 国产精品高潮呻吟久久av无限| 美女精品久久久| 国产精品自拍偷拍| 美女扒开尿口让男人操亚洲视频网站| 亚洲福利在线观看| 亚洲视频专区在线| 国产不卡一区二区在线播放| 国内精品小视频| 欧美亚洲成人免费| 91网在线免费观看| 日韩中文av在线| 亚洲天堂2020| 欧美日韩另类视频| 日韩精品亚洲元码| 精品福利视频导航| 欧美激情小视频| 国语对白做受69| 国产精品第10页| 国产精品www| 久久久成人的性感天堂| 米奇精品一区二区三区在线观看| 国产精品高精视频免费| 久久网福利资源网站| 成人精品网站在线观看| 777777777亚洲妇女| 欧美成年人视频| 国产日产亚洲精品| 久久在线精品视频| 久久久久久国产精品美女| 亚州成人av在线| 91在线播放国产| 国产欧美精品在线| 精品国产拍在线观看| 亚洲曰本av电影| 国产成人精品免高潮费视频| 亚洲男人天堂2024| 久久综合久久美利坚合众国| 91探花福利精品国产自产在线| 久久人人看视频| 国产美女久久精品香蕉69| 亚洲视频综合网| 在线视频日韩精品| 亚洲欧洲日产国产网站| 色www亚洲国产张柏芝| 欧美黄色片视频| 国产精品99蜜臀久久不卡二区| 久久综合88中文色鬼| 九九久久久久久久久激情| 一区二区三区美女xx视频| 欧美日韩成人在线视频| 欧美另类在线观看| 理论片在线不卡免费观看| 亚洲人成77777在线观看网| 亚洲一区二区免费| 中文字幕亚洲欧美日韩在线不卡| 久久久久久成人精品| 韩日精品中文字幕| 欧美性生交xxxxxdddd| 深夜精品寂寞黄网站在线观看| 国产精品久久91| 亚洲国产精彩中文乱码av在线播放| 欧美精品成人91久久久久久久| 国内精品模特av私拍在线观看| 日本一区二三区好的精华液| 精品人伦一区二区三区蜜桃网站| 在线观看亚洲区| 久久成人这里只有精品| 午夜精品三级视频福利| 欧美大全免费观看电视剧大泉洋| 欧美高清理论片| 国产精品海角社区在线观看| 欧美视频一区二区三区…| 成人在线激情视频| 日韩精品在线免费| 黄色精品在线看| 97久久超碰福利国产精品…| 日韩精品视频在线播放| 欧美日韩亚洲视频一区| 日本19禁啪啪免费观看www| 一区二区三区天堂av| 久久久久久久999| 国产一区玩具在线观看| 国产美女精品免费电影| 国产精品18久久久久久首页狼| 亚洲女人天堂色在线7777| 精品一区二区电影| 日韩在线视频播放| 国产亚洲福利一区|