成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Vue實現圓環進度條的示例

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

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

<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 }, // 進度條厚度 progress: { type: [Number, String], default: 20 }, // 進度條百分比 barColor: { type: String, default: '#1890ff' }, // 進度條顏色 backgroundColor: { type: String, default: 'rgba(0,0,0,0.3)' }, // 背景顏色 isAnimation: { // 是否是動畫效果 type: Boolean, default: true }, isRound: { // 是否是圓形畫筆 type: Boolean, default: true }, id: { // 組件的id,多組件共存時使用 type: [String, Number], default: 1 }, duration: { // 整個動畫時長 type: [String, Number], default: 1000 }, delay: { // 延遲多久執行 type: [String, Number], default: 200 }, timeFunction: { // 動畫緩動函數 type: String, default: 'cubic-bezier(0.99, 0.01, 0.22, 0.94)' }, circleWidth: { //圓環寬度 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() { // 清除舊組件的樣式標簽 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) { // 重復定義判斷 if (document.getElementById(self.idStr)) { console.warn('vue-circle-progress should not have same id style'); document.getElementById(self.idStr).remove(); } // 生成動畫樣式文件 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元素中添加動畫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’' />

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

代碼中有一個防抖動的函數,這里就貼一下這個函數:

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

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

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

作者:小壞

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

以上就是Vue實現圓環進度條的示例的詳細內容,更多關于Vue 實現圓環進度條的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品99久久久久久久vr| 在线一区视频| 中国成人亚色综合网站| 亚洲国产高清aⅴ视频| 97精品久久久久中文字幕 | 一区二区三区中文字幕精品精品| 欧美日韩精品综合| 久久综合成人精品亚洲另类欧美 | 伊人久久大香线蕉av超碰演员| 国产丝袜美腿一区二区三区| 99久久精品久久久久久清纯| 欧美α欧美αv大片| 成人少妇影院yyyy| 日韩精品影音先锋| 成人午夜在线播放| 亚洲精品在线一区二区| 成人黄色国产精品网站大全在线免费观看| 欧美喷潮久久久xxxxx| 激情综合色综合久久| 91国模大尺度私拍在线视频| 毛片av中文字幕一区二区| 欧美色偷偷大香| 国产精品原创巨作av| 91精品国产一区二区| 成人午夜激情片| 精品国产乱码久久久久久免费| 成人av网址在线| 国产亚洲一区字幕| 欧美精品免费观看二区| 国产精品欧美久久久久无广告 | 美女爽到高潮91| 欧美精品三级日韩久久| 国产成人免费视频网站| 欧美精品一区二区在线观看| 欧美日韩一区二区视频在线观看 | 亚洲一级二级三级在线免费观看| 国产农村妇女毛片精品久久莱园子| 亚洲成av人片在线观看无码| 色94色欧美sute亚洲线路一ni| 久久99热狠狠色一区二区| 欧美精品九九99久久| 波多野结衣视频一区| 久久久精品国产99久久精品芒果| 国产字幕视频一区二区| 亚洲精品水蜜桃| 色八戒一区二区三区| 国产高清亚洲一区| 国产欧美视频一区二区三区| 亚洲国产免费| 日韩精品电影在线观看| 制服丝袜av成人在线看| 91麻豆成人久久精品二区三区| 中文字幕不卡的av| 国产精品亚洲不卡a| 日韩在线a电影| 欧美高清视频在线高清观看mv色露露十八 | 欧美日韩在线观看一区二区| 福利电影一区二区三区| 国产精品私人自拍| 老鸭窝毛片一区二区三区| 久久国产精品99久久人人澡| 日韩视频免费观看高清完整版| 欧美日韩高清免费| 亚洲图片欧美一区| 91精选在线观看| 国内精品福利| 奇米四色…亚洲| 日韩欧美国产综合一区 | 国产一区二区三区四区老人| 亚洲国产美女搞黄色| 欧美人体做爰大胆视频| 91免费精品国自产拍在线不卡| 一区二区三区欧美日韩| 91精品国产一区二区| 亚洲国产高清一区二区三区| 狂野欧美性猛交blacked| 久久久久国色av免费看影院| 性久久久久久| 成人黄色av网站在线| 亚洲一二三四区不卡| 91精品在线免费| 亚洲午夜av| 免播放器亚洲一区| 久久精品在这里| 美女黄色成人网| 不卡区在线中文字幕| 亚洲图片欧美视频| 精品人伦一区二区色婷婷| 亚洲一区日韩| 成人综合在线观看| 亚洲精品成a人| 日韩精品一区二区三区在线播放 | 国内精品写真在线观看| 国产精品天干天干在线综合| 欧美日韩中文字幕一区| 欧美午夜不卡影院在线观看完整版免费| 日日摸夜夜添夜夜添亚洲女人| 欧美哺乳videos| 久久精品中文| 欧美理论在线| 国产综合色视频| 亚洲码国产岛国毛片在线| 欧美二区乱c少妇| 亚洲精选久久| 国产盗摄女厕一区二区三区| 亚洲一区在线免费观看| www国产成人| 91黄色免费网站| 激情一区二区| 国产98色在线|日韩| 亚洲bt欧美bt精品| 国产精品无人区| 91精品中文字幕一区二区三区| 国产乱码精品一区二区三区不卡| youjizz国产精品| 秋霞电影一区二区| 亚洲欧美一区二区三区极速播放| 欧美一区二区精品在线| 国产精品一国产精品k频道56| 99久久婷婷国产综合精品电影| 免费成人在线网站| 亚洲精品欧美专区| 久久久欧美精品sm网站| 欧美色爱综合网| 国产乱人伦精品一区二区| 欧美日本国产精品| 国产成人av电影在线播放| 日韩精品免费视频人成| 亚洲欧美日韩国产手机在线| www亚洲一区| 91麻豆精品国产自产在线观看一区| 亚洲欧美日韩国产综合精品二区| 欧美日韩亚洲一区二区三区在线观看 | www.亚洲人| 国产美女av一区二区三区| 亚洲国产日韩a在线播放| 国产精品久久久久久久久图文区 | 中文字幕制服丝袜一区二区三区| 日韩精品一区二区三区中文精品| 欧美在线观看一区| 国产午夜精品在线| 伊人精品在线| 欧美激情第8页| gogo大胆日本视频一区| 国产黄色精品网站| 精品在线免费观看| 91久久久一线二线三线品牌| 牛人盗摄一区二区三区视频| 国产成人亚洲综合色影视| 日本aⅴ免费视频一区二区三区| 亚洲欧洲综合另类| 中文字幕国产一区| 国产亚洲一区二区三区| 欧美电视剧免费全集观看| 欧美精品v国产精品v日韩精品| 欧美在线观看视频一区二区| 色婷婷狠狠综合| 久久精彩视频| 国产一区二区三区免费不卡| 伊人久久婷婷| 亚洲午夜视频| 国产伊人精品| 一区在线免费| 狠狠色狠狠色综合人人| 欧美日韩精品免费观看视一区二区 | 国产亚洲激情| 亚洲激情一区| 亚洲国产精选| 亚洲黄色大片| 亚洲全部视频| 亚洲国产国产亚洲一二三| 亚洲二区精品| 一区二区三区视频在线播放| 99riav1国产精品视频| 亚洲毛片视频| 亚洲免费观看| 亚洲综合不卡| 久久一区免费| 91黄色免费网站| 欧美在线一二三| 欧美日本韩国一区二区三区视频 | 一区福利视频| 9国产精品视频| 亚洲综合欧美日韩| 久久综合狠狠| 色综合久久久久久久| 91国产精品成人| 欧美蜜桃一区二区三区| 欧美一区二区三区免费| 欧美不卡视频一区| 国产三级欧美三级| 国产精品久久久久久久久晋中 | 国产乱码精品1区2区3区| 国产99久久久精品| 成人短视频下载| 欧美阿v一级看视频| 亚洲激情自拍| 色婷婷综合激情| 91精品中文字幕一区二区三区 | 免费视频一区二区|