zoukankan      html  css  js  c++  java
  • vue项目使用scss生成多个同心圆环按不同速度转动的效果实现

     

    如上,实现多个同心不同宽度的圆环以不同的速度转动的特效。

    本例所取项目采用了vue+vant+scss+mockjs,其中圆环采用vant的环形进度条组件,圆环的宽度、直径大小、线条的长度等采用mockjs的随机数按一定规则进行设置,圆环的循环滚动采用css3的animation动画,动画的随机频率由css的var()函数从html的style属性中获取。

    相关技术说明文档如下:Circle 环形进度条CSS的var函数mockjs生成随机数

    示例代码:

    circle.vue

     1 <template>
     2   <div class="page tc w100 h100">
     3     <section class="circleProcess pRelative">
     4       <van-circle class="circle pAbsolute" :class="'circle'+index" v-for="(item,index) in circleProcessData" :key="index"
     5         :style="{'top':(initSize-item.size)/2+'px','left':0-item.size/2+'px','--speed':item.speed/10+'s'}" v-model="currentRate[index]"
     6         :rate="item.rate" :speed="item.speed" :size="item.size" :stroke-width="item['stroke-width']" :color="gradientColor" />
     7     </section>
     8   </div>
     9 </template>
    10 <script>
    11   import {
    12     Circle
    13   } from 'vant';
    14   export default {
    15     name: "Circle",
    16     components: {
    17       'van-circle': Circle
    18     },
    19     data() {
    20       return {
    21         currentRate: [], //圆环初始进度
    22         gradientColor: {
    23           '0%': '#3fecff',
    24           '100%': '#6149f6',
    25         },
    26         circleProcessData: '',
    27         initSize: 200
    28       }
    29     },
    30     created() {
    31       //圆环初始进度,每个圆环相互独立,使用一个七点会造成所有圆环闪动
    32       for (var i = 0; i < 5; i++) {
    33         this.currentRate.push(0)
    34       }
    35       //动态获取圆环相关数据
    36       this.http.get("/service/circleProcess", {
    37         size: this.initSize
    38       }).then(data => {
    39         this.circleProcessData = data.d.circleProcessData
    40         console.log(JSON.stringify(this.circleProcessData))
    41       })
    42     }
    43   }
    44 </script>
    45 <style lang="scss" scoped>
    46   .circleProcess {
    47     margin: 30% 50%;
    48 
    49     @for $i from 0 to 5 {
    50       .circle#{$i} {
    51         //动画频率由html的style属性传过来,使用css的var()函数获取(该变量不可计算,所以需要直接传递完整的样式值)
    52         animation: turn var(--speed) linear infinite;
    53       }
    54     }
    55 
    56     @keyframes turn {
    57       @for $i from 0 to 5 {
    58         #{$i*25}% {
    59           -webkit-transform: rotate($i*90+deg);
    60         }
    61       }
    62     }
    63   }
    64 </style>

    mock.js——项目需要,本地开发使用mock.js拦截http请求,如果不需要可直接使用js的随机数函数。

     1 const Mock = require('mockjs')
     2 // 获取 mock.Random 对象
     3 const Random = Mock.Random;
     4 module.exports = {
     5   getCircleProcessData:(req,res)=>{
     6     let circleProcessData=[];
     7     let size=utils.getParamsFromRequest('size',req)||200;
     8     let initSize=size/5;
     9     for(var i=0;i<5;i++){
    10         circleProcessData.push({
    11           rate:i==4?80:Random.integer(50, 90),
    12           //圆环直径大小以第一个初始值累加一定随机数
    13           size:i>0?(circleProcessData[i-1].size+Random.integer(50, 80)):initSize,
    14           speed:Random.integer(20, 50),
    15           'stroke-width':Random.integer(20, 40)
    16         })
    17     }
    18     return {
    19       s: "0",
    20       m: "发送成功",
    21       d: {
    22         circleProcessData:circleProcessData
    23       }
    24     }
    25   },
    26   ......
    27 }

    注意事项:

    关于animation动画的循环频率,scss中并没有随机数这一说,所以,要用css的var()函数来获取了,可以在html的style属性中传递,如下:

    :style="{'top':(initSize-item.size)/2+'px','left':0-item.size/2+'px','--speed':item.speed/10+'s'}"

    var()获取的属性值只能引用,不能在scss中计算,所以要拼接好能直接使用的属性值: item.speed/10+'s' 。

  • 相关阅读:
    异常、中断、陷阱
    BigDecimal
    事务
    jsp的九大内置对象
    timer和ScheduledThreadPoolExecutor
    关于Python的导入覆盖解决办法
    RTTI
    Golang不会自动把slice转换成interface{}类型的slice
    Python中下划线的5种含义
    Python如何合并两个字典
  • 原文地址:https://www.cnblogs.com/xyyt/p/14082173.html
Copyright © 2011-2022 走看看