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' 。

posted on 2020-12-04 11:20  逍遥云天  阅读(1496)  评论(0编辑  收藏  举报

导航