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

 更新时间:2022年03月27日 14:10:20   作者:doit_damao  
这篇文章主要为大家详细介绍了Vue中使用js制作进度条式数据对比动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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)
  })
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • cdn模式下vue的基本用法详解

    cdn模式下vue的基本用法详解

    这篇文章主要介绍了cdn模式下vue的基本用法,本文通过图文并茂的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-10-10
  • vue+Element-ui实现分页效果实例代码详解

    vue+Element-ui实现分页效果实例代码详解

    这篇文章主要介绍了vue+Element-ui实现分页效果 ,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-12-12
  • vue基本使用--refs获取组件或元素的实例

    vue基本使用--refs获取组件或元素的实例

    今天小编就为大家分享一篇vue基本使用--refs获取组件或元素的实例,具有很好的参考价值,希望对大家有所帮助。一起个跟随小编过来看看吧
    2019-11-11
  • 在Vue3.x中实现类似React.lazy效果的方法详解

    在Vue3.x中实现类似React.lazy效果的方法详解

    React 的 React.lazy 功能为组件懒加载提供了原生支持,允许开发者将组件渲染推迟到实际需要时再进行,虽然 Vue3.x 没有一个直接对应的 lazy 函数,但我们可以通过动态导入和 defineAsyncComponent 方法来实现类似的效果,需要的朋友可以参考下
    2024-03-03
  • vue2 中二级路由高亮问题及配置方法

    vue2 中二级路由高亮问题及配置方法

    这篇文章主要介绍了vue2 中二级路由 高亮问题,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • Vue + ElementUI表格内实现图片点击放大效果的两种实现方式

    Vue + ElementUI表格内实现图片点击放大效果的两种实现方式

    这篇文章主要介绍了Vue + ElementUI表格内实现图片点击放大效果的两种实现方式,第一种使用el-popover弹出框来实现而第二种使用v-viewer插件实现,需要的朋友可以参考下
    2024-08-08
  • Vue如何使用Element-ui表单发送数据与多张图片到后端详解

    Vue如何使用Element-ui表单发送数据与多张图片到后端详解

    在做项目的时候遇到一个问题,前端需要上传表单到后端,表单数据包括文本内容和图片,这篇文章主要给大家介绍了关于Vue如何使用Element-ui表单发送数据与多张图片到后端的相关资料,需要的朋友可以参考下
    2022-04-04
  • 浅析vue中$nextTick的作用与原理

    浅析vue中$nextTick的作用与原理

    这篇文章主要为大家详细介绍一下Vue中$nextTick的作用于原理,这也是面试中常常考到的问题,文中的示例代码讲解详细,对我们深入了解Vue有一定的帮助,需要的小伙伴可以参考一下
    2023-10-10
  • vue的滚动条插件实现代码

    vue的滚动条插件实现代码

    这篇文章主要介绍了vue的滚动条插件实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • element表格数据部分模糊的实现代码

    element表格数据部分模糊的实现代码

    这篇文章给大家介绍了element表格数据模糊的实现代码,文中有详细的效果展示和实现代码供大家参考,具有一定的参考价值,需要的朋友可以参考下
    2024-01-01

最新评论