共计 4137 个字符,预计需要花费 11 分钟才能阅读完成。
导读 | 这篇文章主要为大家详细介绍了 Vue 中使用 js 制作进度条式数据对比动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 |
本文实例为大家分享了 Vue 中使用 js 制作进度条式数据对比动画的具体代码,供大家参考,具体内容如下
实现的效果:(初始化以及浏览器 resize 的时候两侧的条形为向两侧递增的动画,其中两端的数字也是递增的动画)
HTML 部分:
您的投资能力分析
我
平均
{{item.title}}
{{item.score | scoreFilter}}
{{item.average | scoreFilter}}
100
0
100
filters: {scoreFilter (val) {if (!isNaN(val)) {return Number(val)
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)
})
}
以上就是本文的全部内容,希望对大家的学习有所帮助.
正文完
星哥说事-微信公众号
![post-qrcode](https://www.xgss.net/wp-content/uploads/2023/07/二维码-微信公众号256x256.jpg)