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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM