日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Vue實(shí)現(xiàn)圓環(huán)進(jìn)度條的示例

瀏覽:26日期:2022-10-06 16:00:28

數(shù)據(jù)展示,一直是各行各業(yè)樂此不疲的需求,具體到前端開發(fā)行業(yè),則是各種各種圖表數(shù)據(jù)展示,各種表格數(shù)據(jù)展示,煩不勝煩(繁不勝繁)!前幾天剛做了折線圖、柱狀圖、餅狀圖之類的圖表數(shù)據(jù)展示效果,今天又碰到了類似圓環(huán)進(jìn)度條的展示效果。天天跟數(shù)據(jù)打交道,天天跟接口打交道,項(xiàng)目做了不少,菜逼還是菜逼,都是淚啊!其實(shí)說白了,是自己對(duì)canvas不熟,對(duì)CSS3不熟,所以就找了一個(gè)現(xiàn)成的輪子:

<template> <div ref='box'> <svg : : xmlns='http://www.w3.org/2000/svg'> <circle :r='(width-radius)/2' :cy='width/2' :cx='width/2' :stroke- :stroke='backgroundColor' fill='none' /> <circle ref='$bar' :r='(width-radius)/2' :cy='width/2' :cx='width/2' :stroke='barColor' :stroke- :stroke-linecap='isRound ? ’round’ : ’square’' :stroke-dasharray='(width-radius)*3.14' :stroke-dashoffset='isAnimation ? (width-radius) * 3.14 : (width - radius) * 3.14 * (100 - progress) / 100' fill='none' /> </svg> <div :style='{color, fontSize}'> <p v-if='!$slots.default' class='title'>{{progress}}%</p> <slot></slot> </div> </div></template><script>export default { props: { radius: { type: [Number, String], default: 20 }, // 進(jìn)度條厚度 progress: { type: [Number, String], default: 20 }, // 進(jìn)度條百分比 barColor: { type: String, default: '#1890ff' }, // 進(jìn)度條顏色 backgroundColor: { type: String, default: 'rgba(0,0,0,0.3)' }, // 背景顏色 isAnimation: { // 是否是動(dòng)畫效果 type: Boolean, default: true }, isRound: { // 是否是圓形畫筆 type: Boolean, default: true }, id: { // 組件的id,多組件共存時(shí)使用 type: [String, Number], default: 1 }, duration: { // 整個(gè)動(dòng)畫時(shí)長(zhǎng) type: [String, Number], default: 1000 }, delay: { // 延遲多久執(zhí)行 type: [String, Number], default: 200 }, timeFunction: { // 動(dòng)畫緩動(dòng)函數(shù) type: String, default: 'cubic-bezier(0.99, 0.01, 0.22, 0.94)' }, circleWidth: { //圓環(huán)寬度 type: Number, default: 100, }, color: { //文字顏色 type: String, default: ’#000’ }, fontSize: { //文字大小 type: String, default: ’18px’ } }, data() { return { width: this.circleWidth, idStr: `circle_progress_keyframes_${this.id}` }; }, beforeDestroy() { // 清除舊組件的樣式標(biāo)簽 document.getElementById(this.idStr) && document.getElementById(this.idStr).remove(); window.addEventListener(() => {}); }, mounted() { let self = this; this.setCircleWidth(); this.setAnimation(); // 此處不能使用window.onresize window.addEventListener( 'resize', debounce(function() { self.setCircleWidth(); self.setAnimation(self); }, 300) ); }, methods: { setCircleWidth() { let box = this.$refs.box; let width = box.clientWidth; let height = box.clientHeight; let cW = width > height ? height : width; this.width = cW; }, setAnimation() { let self = this; if (self.isAnimation) { // 重復(fù)定義判斷 if (document.getElementById(self.idStr)) { console.warn('vue-circle-progress should not have same id style'); document.getElementById(self.idStr).remove(); } // 生成動(dòng)畫樣式文件 let style = document.createElement('style'); style.id = self.idStr; style.type = 'text/css'; style.innerHTML = ` @keyframes circle_progress_keyframes_name_${self.id} { from {stroke-dashoffset: ${(self.width - self.radius) * 3.14}px;} to {stroke-dashoffset: ${((self.width - self.radius) * 3.14 * (100 - self.progress)) / 100}px;}} .circle_progress_bar${ self.id } {animation: circle_progress_keyframes_name_${self.id} ${ self.duration }ms ${self.delay}ms ${self.timeFunction} forwards;}`; // 添加新樣式文件 document.getElementsByTagName('head')[0].appendChild(style); // 往svg元素中添加動(dòng)畫class self.$refs.$bar.classList.add(`circle_progress_bar${self.id}`); } } }};</script><style scoped>.content {height:100%;display:flex;justify-content:center;align-items: center;}.center_text {position:absolute;}</style>

使用方法:

<CircleProgress : :circleWidth='40' :radius='7' :progress='30' :isAnimation='true' :backgroundColor='’#E9E9E9’' :barColor='’#FF4F4F’' /><CircleProgress : :circleWidth='40' :radius='7' :progress='50' :isAnimation='true' :backgroundColor='’#E9E9E9’' :barColor='’#FF902A’' /><CircleProgress : :circleWidth='40' :radius='7' :progress='89' :isAnimation='true' :backgroundColor='’#E9E9E9’' :barColor='’#FFDB4F’' /><CircleProgress : :circleWidth='40' :radius='7' :progress='25' :isAnimation='true' :backgroundColor='’#E9E9E9’' :barColor='’#B8D87E’' />

使用時(shí)需要注意一下,如果你的頁面中同時(shí)使用了超過兩個(gè)以上的這種圓環(huán)進(jìn)度條,就需要給每個(gè)圓環(huán)進(jìn)度條設(shè)置不同的id,否則,所有圓環(huán)最終展示的數(shù)據(jù)都會(huì)是最后一個(gè)圓環(huán)的數(shù)據(jù)。

代碼中有一個(gè)防抖動(dòng)的函數(shù),這里就貼一下這個(gè)函數(shù):

function debounce(func, wait, immediate) { let timeout, args, context, timestamp, result const later = function () { // 據(jù)上一次觸發(fā)時(shí)間間隔 const last = +new Date() - timestamp // 上次被包裝函數(shù)被調(diào)用時(shí)間間隔last小于設(shè)定時(shí)間間隔wait if (last < wait && last > 0) { timeout = setTimeout(later, wait - last) } else { timeout = null // 如果設(shè)定為immediate===true,因?yàn)殚_始邊界已經(jīng)調(diào)用過了此處無需調(diào)用 if (!immediate) { result = func.apply(context, args) if (!timeout) context = args = null } } }

本文參考的是npm上的一個(gè)圓環(huán)進(jìn)度條的插件vue-circleprogressbar,之所以沒有在項(xiàng)目中直接安裝并使用這個(gè)插件,是因?yàn)檫@個(gè)插件有點(diǎn)不太符合我們開發(fā)的需求,比如這個(gè)插件不能設(shè)置圓環(huán)的寬度,不能設(shè)置文字的顏色,不能設(shè)置文字的大小,再比如這個(gè)插件僅僅為了防抖而依賴了lodash(這個(gè)lodash的體積還是很大的)。

至于這個(gè)組件在react中的使用,按照react的生命周期,或者react hooks的語法,或者dva模式的語法,稍微改巴改巴就可以使用了,很簡(jiǎn)單,就不再展開了。

作者:小壞

出處:http://tnnyang.cnblogs.com

以上就是Vue實(shí)現(xiàn)圓環(huán)進(jìn)度條的示例的詳細(xì)內(nèi)容,更多關(guān)于Vue 實(shí)現(xiàn)圓環(huán)進(jìn)度條的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲午夜一级| 亚洲性视频在线| 亚洲另类黄色| 亚洲第一区色| 国产精品xxx| 久久久久亚洲精品中文字幕| 日本va欧美va精品| 亚洲永久精品唐人导航网址| 激情欧美日韩一区| 日韩88av| 卡一精品卡二卡三网站乱码| 国产欧美精品| 国产日韩亚洲| 国产精品精品国产一区二区| 麻豆精品新av中文字幕| 国产精品一区免费在线| 国产精品一区二区99| 91麻豆精品激情在线观看最新| 免费美女久久99| av不卡在线看| 国产日韩综合| 日韩精品一二三区| 在线免费观看亚洲| 亚洲aa在线| 日韩精品视频中文字幕| 欧美偷窥清纯综合图区| 91欧美精品| 美女在线视频一区| 久久婷婷激情| 99香蕉国产精品偷在线观看 | 在线视频亚洲| 免费不卡在线视频| 亚洲制服一区| 日韩国产在线观看一区| 亚洲精品影视| 美女在线视频一区| 精品久久亚洲| 日韩久久一区二区三区| 日韩精品久久理论片| 国产精品宾馆| 91视频一区| 午夜免费一区| 日韩成人午夜精品| 欧美成a人片免费观看久久五月天| 日本久久精品| 黄色在线一区| 日韩欧美三区| 欧美激情aⅴ一区二区三区| 亚洲成人三区| 日本成人手机在线| 精品美女久久| 99视频精品全国免费| 一区三区视频| 五月婷婷亚洲| 国产精品夜夜夜| 久久精品资源| 亚洲福利国产| 偷拍亚洲精品| 国际精品欧美精品| 久久久久久久久久久9不雅视频| 综合欧美亚洲| 福利一区二区免费视频| 久久精品国语| 国产一卡不卡| 欧洲精品一区二区三区| 亚洲经典在线| 国产精品一区二区av日韩在线 | 日本视频一区二区| 国内不卡的一区二区三区中文字幕| 亚洲伦乱视频| 欧美精品影院| 日韩中文字幕高清在线观看| 日韩一级网站| 九九久久国产| 亚洲综合色婷婷在线观看| 麻豆久久久久久久| 国产一区日韩欧美| 美女视频免费精品| 黄色精品网站| 麻豆精品蜜桃视频网站| 日韩视频不卡| 国产在线看片免费视频在线观看| 美女网站久久| аⅴ资源天堂资源库在线| 日本成人在线不卡视频| 欧美激情另类| 一本综合精品| 高清不卡亚洲| 国产精品视频一区二区三区四蜜臂 | 麻豆成全视频免费观看在线看| 亚洲一区二区三区高清| 国产精品亚洲二区| 日本成人中文字幕| av亚洲在线观看| 久久精品国产99国产| 男人的天堂久久精品| 国产综合激情| 久久精品国产免费| 亚洲精品成a人ⅴ香蕉片| 黄色亚洲免费| 国产a久久精品一区二区三区| 香蕉久久夜色精品国产| 精品美女在线视频| 欧美精品观看| 久久亚洲色图| 岛国av免费在线观看| 亚洲一区二区网站| 欧美特黄一区| 热久久久久久| 亚洲欧美日韩一区在线观看| 日韩av三区| 国产麻豆综合| 一区二区三区午夜视频| 亚洲女同中文字幕| 日韩精品欧美精品| 欧美激情99| 每日更新成人在线视频| 麻豆mv在线观看| 国产欧美日韩精品一区二区免费| 国产视频一区欧美| 午夜在线精品偷拍| 欧美日韩一二三四| 亚洲精品三级| 91久久亚洲| 黄色成人91| 久久福利一区| 亚洲色图综合| 日韩动漫一区| 国产精品中文字幕制服诱惑| 国产精品调教视频| 麻豆视频久久| 久久精品五月| 欧美男人天堂| 久久婷婷一区| 亚洲综合日本| 免费在线观看视频一区| 综合激情一区| 欧美日本精品| 久久亚洲国产精品尤物| 国产va在线视频| 国产99亚洲| 在线日韩成人| 国产精品久久久久久模特| 国产在线一区不卡| 亚洲91久久| 老司机精品久久| 亚洲精品免费观看| 婷婷综合在线| 日韩av免费| 久久久久久久久久久9不雅视频| 在线国产日韩| 先锋影音国产一区| 麻豆精品国产91久久久久久| 精品成av人一区二区三区| 国产精品毛片久久| 激情婷婷欧美| 亚洲精选91| 精品一区二区三区中文字幕视频| 蜜臀国产一区| 国产精品日韩| 国产欧美日韩一级| 久久精品国产网站| 久久亚洲成人| 婷婷精品在线| 韩国女主播一区二区三区| 999视频精品| 亚洲精品黄色| 国产精品成人a在线观看| 亚洲黄色影院| 国产精选久久| 激情久久久久久| 欧美另类中文字幕 | 精品日本视频| 欧美日韩视频一区二区三区| 日韩激情精品| 日韩欧美二区| 婷婷亚洲成人| 国产资源在线观看入口av| 免费精品视频| 欧美黄色一区二区| 天堂网在线观看国产精品| 五月亚洲婷婷 | 国产精品伦一区二区| 久久一级电影| 国产午夜一区| 欧美日韩日本国产亚洲在线| 五月天久久网站| 国产精品二区不卡| 精品久久久久中文字幕小说| 欧美日韩午夜电影网| 国产乱码精品一区二区亚洲| 精品久久精品| 午夜久久中文| 伊人久久大香伊蕉在人线观看热v| 狠狠躁少妇一区二区三区| 亚洲欧美日韩在线观看a三区| 国产精品一区二区三区四区在线观看| 日产精品一区二区| 日本不卡不码高清免费观看 | 国产精品毛片aⅴ一区二区三区|