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' 。
个人原创博客,转载请注明来源地址:https://www.cnblogs.com/xyyt
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通