Vue中使用js制作进度条式数据对比动画

Charlotte ·
更新时间:2024-11-01
· 1047 次阅读

本文实例为大家分享了Vue中使用js制作进度条式数据对比动画的具体代码,供大家参考,具体内容如下

实现的效果:(初始化以及浏览器resize的时候两侧的条形为向两侧递增的动画,其中两端的数字也是递增的动画)

HTML部分:

<div class="no-ivatargo-chart-b">   <div class="investment-ability">     <div class="title">       <span>您的投资能力分析</span>     </div>     <div class="investment-ability-picture-outer-container">       <div class="investment-ability-picture-container">         <div class="investment-ability-picture-header"              ref="allLine">           <span>我</span>           <span>平均</span>         </div>         <div class="investment-ability-picture"              v-for="(item, index) in abilityArr"              :key="index">           <div class="investment-ability-picture-top">             <div class="investment-left">               <div class="left-icon-outer">                 <div class="left-icon-inner"></div>               </div>               <span>{{item.title}}</span>             </div>             <div class="investment-right">               <div class="investment-info">                 <span class="my-color">{{item.score | scoreFilter}}</span>                 <div class="all-line">                   <div class="my-line"                        :style="{'width': item.myWidth}"></div>                   <div class="other-line"                        :style="{'width': item.averageWidth}"></div>                 </div>                 <span class="average-color">{{item.average | scoreFilter}}</span>               </div>             </div>           </div>         </div>         <div class="investment-ability-picture-footer">           <span>100</span>           <span>0</span>           <span>100</span>         </div>       </div>     </div>   </div> </div> filters: {   scoreFilter (val) {     if (!isNaN(val)) {       return Number(val) < 10 ? `0${parseInt(val)}` : parseInt(val)     } else {       return ''     }   } }

CSS部分:

.no-ivatargo-chart-b {   width: 100%;   overflow: hidden;   display: flex;   flex-direction: column;   font-size: 14.76px;   color: #bfbfbf;   background-color: #0f1318;   .title {     display: flex;     align-items: center;     font-size: 17.22px;     color: #bfbfbf;     margin-bottom: 15px;   }   .investment-ability-picture-header {     width: 400px;     margin-left: 130px;     display: flex;     align-items: center;     justify-content: space-around;     margin-bottom: 10px;     color: #fff;   }   .investment-ability-picture-outer-container {     display: flex;     justify-content: center;     align-items: center;     height: calc(100% - 50px);     .investment-ability-picture-container {       display: flex;       flex-direction: column;       .investment-ability-picture {         display: flex;         flex-direction: column;         margin-bottom: 10px;         .investment-ability-picture-top {           display: flex;           .investment-left {             font-size: 14.76px;             color: #bfbfbf;             width: 100px;             display: flex;             align-items: center;             .left-icon-outer {               width: 14px;               height: 14px;               background-color: #3fb050;               border-radius: 50%;               position: relative;               margin-right: 5px;               .left-icon-inner {                 position: absolute;                 width: 5px;                 height: 5px;                 top: 50%;                 left: 50%;                 transform: translate(-50%, -50%);                 background-color: #fff;                 border-radius: 50%;               }             }           }           .investment-right {             display: flex;             align-items: center;             justify-content: space-between;             .investment-info {               display: flex;               align-items: center;               justify-content: space-between;               .all-line {                 width: 400px;                 height: 10px;                 background-color: #57606e;                 border-radius: 2px;                 margin-left: 10px;                 margin-right: 10px;                 position: relative;                 .my-line {                   width: 0;                   height: 10px;                   position: absolute;                   top: 0;                   right: 200px;                   background-color: #f5a623;                   border-top-left-radius: 2px;                   border-bottom-left-radius: 2px;                 }                 .other-line {                   width: 0;                   height: 10px;                   position: absolute;                   top: 0;                   left: 200px;                   background-color: #1890ff;                   border-top-right-radius: 2px;                   border-bottom-right-radius: 2px;                 }               }               .my-color {                 width: 20px;                 color: #f5a623;               }               .average-color {                 width: 20px;                 color: #1890ff;               }             }           }         }         .investment-ability-picture-bottom {           display: flex;           flex-direction: column;           background-color: #ccc;           width: 400px;           margin-left: 130px;           padding: 5px;           color: #000;         }       }     }   }   .investment-ability-picture-footer {     width: 400px;     margin-left: 130px;     display: flex;     align-items: center;     justify-content: space-between;     color: #fff;   } }

JS部分:

1.子组件当中

mounted () {   let that = this   window.onresize = () => {     clearTimeout(that.resizeTimer)     that.resizeTimer = setTimeout(() => {       that.handleGetAllWidth()     }, 1000)   }   this.$nextTick(() => {     clearTimeout(this.resizeTimerB)     this.resizeTimerB = setTimeout(() => {       this.handleGetAllWidth()     }, 200)   }) } // methods当中 handleGetAllWidth () {   this.$emit('getAllWidth', this.$refs.allLine.offsetWidth) }

2.父组件当中

getAllLineWidth (data) {   this.allLineWidth = data   this.calculateIvatargo() }, // 给条形图添加计算宽度,并形成动画 calculateIvatargo () {   this.myTimerArr.forEach((value, index) => {     clearInterval(value)   })   this.averageTimerArr.forEach((value, index) => {     clearInterval(value)   })   this.myTimerArr = []   this.averageTimerArr = []   let myVal = []   let averageVal = []   this.myAbilityArr.forEach((value, index) => {     myVal[index] = 0     averageVal[index] = 0     this.myTimerArr[index] = setInterval(() => {       if (myVal[index] > Number(this.allLineWidth) * Number(value.score) / 200 || !value.score) {         clearInterval(this.myTimerArr[index])         value.score ? myVal[index] = Number(this.allLineWidth) * Number(value.score) / 200 : myVal[index] = 0         this.$set(value, 'myWidth', myVal[index] + 'px')         this.$set(value, 'myNum', value.score)       } else {         myVal[index]++         this.$set(value, 'myWidth', myVal[index] + 'px')         this.$set(value, 'myNum', myVal[index] / 2)       }     }, 5)     this.averageTimerArr[index] = setInterval(() => {       if (averageVal[index] > Number(this.allLineWidth) * Number(value.average) / 200 || !value.average) {         clearInterval(this.averageTimerArr[index])         value.average ? averageVal[index] = Number(this.allLineWidth) * Number(value.average) / 200 : averageVal[index] = 0         this.$set(value, 'averageWidth', averageVal[index] + 'px')         this.$set(value, 'averageNum', value.average)       } else {         averageVal[index]++         this.$set(value, 'averageWidth', averageVal[index] + 'px')         this.$set(value, 'averageNum', averageVal[index] / 2)       }     }, 5)   }) }



VUE 进度条 数据 js 动画

需要 登录 后方可回复, 如果你还没有账号请 注册新账号