一般情况下使用scss就可以实现
@import "math";
#app {
display: flex;
align-items: center;
justify-content: center;
width: 200px;
height: 200px;
position: relative;
border-radius: 50%;
border: 1px solid #000;
> span {
position: absolute;
display: flex;
align-items: center;
justify-content: center;
transform-origin: center center;
width: 50px;
height: 50px;
background: red;
border-radius: 70%;
transition: all 3s;
top: 0;
left: 0;
opacity: 0;
transform: translateX(-50%) translateY(-50%);
@for $i from 0 through 7 {
@keyframes moveFromCenter-#{$i} {
from {
left: 50%;
top: 50%;
opacity: 0.5;
}
to {
left: calc(#{(cos(360deg / 8 * ($i + 2)) * 100px)} + 50%);
top: calc(#{(sin(360deg / 8 * ($i + 2)) * 100px)} + 50%);
opacity: 1;
}
}
&:nth-child(#{$i}) {
animation: moveFromCenter-#{$i} 0.3s * $i 1 forwards normal;
}
}
}
}
在vue实际应用中
不需要引入sass:math 默认集成的
不需要特意安装sass 因为scss就是sass的改良版
.middle-center {
width: 200px;
height: 200px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
border: 1px solid red;
.middle-item {
width: 50px;
height: 50px;
position: absolute;
display: flex;
justify-content: center;
align-items: center;
transition: all 3s;
$size: 300px;//圆的大小
$num: 8;//数量 就是这个圆被分成了几份
@for $i from 0 through $num {
$co: cos(360deg / $num * $i);
$si: sin(360deg / $num * $i );
$left: calc(#{$co} * #{$size} + 50%);
$top: calc(#{$si} * #{$size} + 50%);
@keyframes moveFromCenter-#{$i} {
from {
transform: translateX(-50%) translateY(-50%);
}
to {
transform: translateX(calc(-50% + #{$left})) translateY(calc(-50% + #{$top}));//这里得用插值 要不然会报错
}
}
&:nth-child(#{$i}) {
animation: moveFromCenter-#{$i} 0.3s * $i 1 forwards normal;
}
}
}
如果报错可能时scss 或者sass-loader版本问题
我的版本"sass-loader": "^8.0.2","scss": "^0.2.4"
并且移除vue.config.js中有关css的配置