【十】環(huán)形進(jìn)度條組件

關(guān)于專題【vue開發(fā)音樂App】

本篇介紹底部快捷控件的環(huán)形進(jìn)度條的實(shí)現(xiàn)方法:通過svg繪制兩個(gè)環(huán)帝簇,線條模糊的環(huán)作為背景、線條明亮的環(huán)根據(jù)傳入的百分比繪制相應(yīng)長度(即進(jìn)度)残揉。該組件同樣屬于基礎(chǔ)組件芋浮,在src/base/progress-circle/目錄下新建progress-circle.vue

樣式部分

<style lang="stylus" rel="stylesheet/stylus">
  // variable.styl傳送門:https://wy310.cn/2020/01/11/vue-build-basic-style-structure/
  @import "~common/stylus/variable"

  .progress-circle
    position: relative
    circle
      stroke-width: 8px
      transform-origin: center
      &.progress-bg
        transform: scale(0.9)
        stroke: $color-theme-d
      &.progress-bar
        transform: scale(0.9) rotate(-90deg)
        stroke: $color-theme
</style>
  • 這里先貼出樣式代碼纸巷,circle統(tǒng)一設(shè)置了描邊寬度為8px(這里的8px會根據(jù)后面介紹的svg的寬高動態(tài)變化,不是絕對的8像素長度瘤旨,而是8%),背景圓的描邊顏色為$color-theme-d(rgba(255, 205, 49, 0.5))因宇,進(jìn)度圓的描邊顏色為$color-theme(#ffcd32)祟偷,另外,還讓進(jìn)度圓環(huán)逆時(shí)針旋轉(zhuǎn)90度杭棵,以讓它的起始點(diǎn)在最高處(旋轉(zhuǎn)之前起始點(diǎn)在最右側(cè)),以實(shí)現(xiàn)歌曲環(huán)形進(jìn)度條以頂部為起點(diǎn)順時(shí)針旋轉(zhuǎn)的業(yè)務(wù)需求先舷。

DOM部分

<template>
  <div class="progress-circle">
    <svg :width="length" :height="length" viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg">
      <!--背景圓環(huán):線條模糊-->
      <circle class="progress-bg" r="50" cx="50" cy="50" fill="transparent"></circle>
      <!--進(jìn)度圓環(huán):線條明亮-->
      <circle class="progress-bar" r="50" cx="50" cy="50" fill="transparent" :stroke-dasharray="dasharray" :stroke-dashoffset="dashoffset"></circle>
    </svg>
  </div>
</template>
  • svg標(biāo)簽的viewBox的四個(gè)參數(shù)分別表示:最小橫坐標(biāo)值蒋川、最小縱坐標(biāo)值撩笆、寬度、高度夕冲。前面兩個(gè)參數(shù)歹鱼,個(gè)人覺得除非對svg的內(nèi)部做整體偏移,否則一般都是“0, 0”弥姻,即svg的左上角(為起點(diǎn));后面兩個(gè)參數(shù)疼进,我們暫時(shí)把它們理解成比例或者等份秧廉,“100, 100”代表寬和高都設(shè)置成100等份,注意它們的單位不是px,為什么這么說呢诞外?因?yàn)槲覀儼l(fā)現(xiàn),svg標(biāo)簽上還又兩個(gè)屬性:width和height茫虽,它們的單位才是px(length變量將在后面的代碼中被賦予80)既们,也是真正決定svg寬高的屬性(即svg真實(shí)寬高其實(shí)是length個(gè)像素的長度,也就是80px)号杏,那么viewBox后兩個(gè)參數(shù)中的一份就表示length / 100個(gè)像素的長度(length為50,一份就等于0.5px主经;為80庭惜,就是0.8px;為100护赊,就是1px……)骏啰。所以一般為了方便計(jì)算,我們都會設(shè)置一個(gè)整數(shù)值器一,如100(等份),而不會是一個(gè)不能被任何數(shù)整除的質(zhì)數(shù)渺贤,如123(等份)请毛;
  • circle標(biāo)簽的rcx固棚、cy分別表示半徑仙蚜、圓心橫坐標(biāo)、圓心縱坐標(biāo)呜师。它們的單位也都不是px贾节,而是和viewBox一樣(以及之后的stroke-dasharraystroke-dashoffset單位也是如此)知牌。100等份中的50份斤程,表示該圓的圓心就在svg的中心,它的半徑就是svg邊長的一半袭厂,也就是說該圓是svg正方形的內(nèi)切圓;
  • stroke-dasharray的數(shù)值我們設(shè)置成該圓的周長纹磺,也就是2πr橄杨,即Math.PI * 100,現(xiàn)在這個(gè)淺黃色的背景圓環(huán)就能顯示出來了式矫;
  • stroke-dashoffset稍微有點(diǎn)不一樣,舉幾個(gè)測試?yán)訋椭蠹依斫猓荷厦嫣岬皆搱A的周長約等于314聪廉,那么我們把stroke-dashoffset先后設(shè)置成0故慈、100200干签、314之后看看效果(如下圖)拆撼,似乎與我們的預(yù)期相反:0是滿的,314卻是空的……所以竭贩,我們發(fā)現(xiàn)使用314 - x倒是符合需求莺禁,于是引出下面的js部分。

JS部分

<script>
  export default {
    name: 'progress-circle',
    data () {
      return {
        dasharray: Math.PI * 100
      }
    },
    props: {
      // svg邊長
      length: {
        type: Number,
        default: 80
      },
      percent: {
        type: Number,
        default: 0
      }
    },
    computed: {
      dashoffset () {
        return (1 - this.percent) * this.dasharray
      }
    }
  }
</script>
  • 對外暴露一個(gè)百分比props:percent(0到1的小數(shù))寝凌,調(diào)用組件時(shí)需要傳入一個(gè)小數(shù),就像這樣:<progress-circle :percent="percent"></progress-circle>红符;
  • 傳入百分比,計(jì)算屬性dashoffset函數(shù)會計(jì)算出該persent對應(yīng)的進(jìn)度偏移量预侯,然后賦值到DOM上的stroke-dashoffset萎馅,完成進(jìn)度條渲染。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末飒货,一起剝皮案震驚了整個(gè)濱河市峭竣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扣墩,老刑警劉巖扛吞,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蟆融,居然都是意外死亡守呜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門弥喉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來由境,“玉大人蓖议,你說我怎么就攤上這事±障海” “怎么了修然?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵质况,是天一觀的道長玻靡。 經(jīng)常有香客問我,道長臼朗,這世上最難降的妖魔是什么蝎土? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任瘟则,我火速辦了婚禮,結(jié)果婚禮上慷嗜,老公的妹妹穿的比我還像新娘丹壕。我一直安慰自己,他們只是感情好菌赖,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布琉用。 她就那樣靜靜地躺著,像睡著了一般奴紧。 火紅的嫁衣襯著肌膚如雪晶丘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天沫浆,我揣著相機(jī)與錄音滚秩,去河邊找鬼。 笑死他炊,一個(gè)胖子當(dāng)著我的面吹牛已艰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凿叠,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼嚼吞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了炒刁?” 一聲冷哼從身側(cè)響起誊稚,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤里伯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后脖镀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狼电,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腾务。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖启昧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情握爷,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布追城,位于F島的核電站燥撞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏色洞。R本人自食惡果不足惜冠胯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一荠察、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧割粮,春花似錦、人聲如沸廷雅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芥玉。三九已至备图,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抠藕,已是汗流浹背蒋困。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留零院,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓撰茎,卻偏偏與公主長得像玄妈,于是被迫代替她去往敵國和親髓梅。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容