如上,實現多個同心不同寬度的圓環以不同的速度轉動的特效。
本例所取項目采用了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' 。