我用CSS创建了一个旋转的轮播,对此我感到非常满意。它包含在代码段中。原稿在this CodePen上。
基本上旋转四个盒子的位置。动画总时间为8秒,我对其进行了设置,因此它会保持20%的静态,然后将框移动5%,然后再次等待(运行代码段;我认为我没有对此进行解释很好)。
现在我想对其进行参数化。 Sass是我选择的武器,我可以轻松设置一些有帮助的变量。因此,在我的样式顶部,我有这个:
$delays: 0s, -6s, -4s, -2s;
$fullanimtime: 8s;
$animationstops: 0%, 20%, 25%, 45%, 50%, 70%, 75%, 95%, 100%;
我将$fullanimtime
用作我的animation-duration
,并使用$delays
列表来配置我的pos-XXXX
样式的延迟:
.pos-1 {
animation-delay: nth($delays, 1);
}
.pos-2 {
animation-delay: nth($delays, 2);
}
.pos-3 {
animation-delay: nth($delays, 3);
}
.pos-4 {
animation-delay: nth($delays, 4);
}
这就像一种魅力,通过正确设置$fullanimtime
和$delays
,我可以将动画更改为在8秒或120秒的任何时间正确运行。
问题是@keyframes
使用百分比。因此,如果我将其他变量设置为较长的动画时间,则使框移动的实际过渡会变得很慢:8秒钟,过渡运行400毫秒,而120秒钟,过渡需要6秒钟,这比令人讨厌的多很酷。
因此,$animationstops
变量应该让我配置合理的时间。但这不起作用。
出于我不了解的原因,我不能在关键帧声明中使用Sass nth
函数,也不能使用Sass变量。
@keyframes rotate-board {
nth($animationstops, 1) {
// This gives an error:
// Invalid CSS after "nth": expected keyframes selector, was "($animationstop..."
}
$somevariable {
// This gives an error:
// Invalid CSS after " $somevalue ": expected ":", was "{"
}
}
有没有解决的办法,还是我发现Sass的局限性?如果要执行此操作,是否还应该使用另一个预处理器?
body {
margin: 0;
padding: 0;
}
.frame {
height: 580px;
width: 100vw;
background: lightgrey;
position: relative;
box-sizing: border-box;
}
.box {
width: calc(50% - 30px);
height: calc(50% - 30px);
top: 20px;
left: 20px;
position: absolute;
animation-name: rotate-board;
animation-duration: 8s;
animation-timing-function: ease-in-out;
animation-iteration-count: infinite;
}
.redbox {
background: red;
}
.greenbox {
background: green;
}
.bluebox {
background: blue;
}
.orangebox {
background: orange;
}
@keyframes rotate-board {
0% {
top: 20px;
left: 20px;
bottom: calc(50% + 10px);
right: calc(50% + 10px);
}
20% {
top: 20px;
left: 20px;
bottom: calc(50% + 10px);
right: calc(50% + 10px);
}
25% {
top: 20px;
left: calc(50% + 10px);
bottom: calc(50% + 10px);
right: 20px;
}
45% {
top: 20px;
left: calc(50% + 10px);
bottom: calc(50% + 10px);
right: 20px;
}
50% {
top: calc(50% + 10px);
left: calc(50% + 10px);
bottom: 20px;
right: 20px;
}
70% {
top: calc(50% + 10px);
left: calc(50% + 10px);
bottom: 20px;
right: 20px;
}
75% {
top: calc(50% + 10px);
left: 20px;
bottom: 20px;
right: calc(50% + 10px);
}
95% {
top: calc(50% + 10px);
left: 20px;
bottom: 20px;
right: calc(50% + 10px);
}
100% {
top: 20px;
left: 20px;
bottom: calc(50% + 10px);
right: calc(50% + 10px);
}
}
.pos-1 {
animation-delay: 0s;
}
.pos-2 {
animation-delay: -6s;
}
.pos-3 {
animation-delay: -4s;
}
.pos-4 {
animation-delay: -2s;
}
<div class="frame">
<div class="box redbox pos-1"></div>
<div class="box greenbox pos-2"></div>
<div class="box bluebox pos-3"></div>
<div class="box orangebox pos-4"></div>
</div>
答案 0 :(得分:2)
您可以这样编写变量:
#{nth($animationstops, 1)}
我为您创建了一个Sassmeister: https://www.sassmeister.com/gist/7c9b06c6b5a7cc580b14cbd1b312c566
它在工作:https://codepen.io/anon/pen/PBeNLV
PS :您的动画非常漂亮!恭喜! :)
答案 1 :(得分:1)
正如ReSedano所说,您可以使用语法#{$var}
来解决问题。
您还可以使用loops provided from Sass来创建更少行的更具可读性的代码。
您可以使用for循环来改进与pos-*
相关的代码的最后一部分,例如以下代码。
$delays: 0s, -6s, -4s, -2s;
@for $i from 1 through 4 {
.pos-#{$i} {
animation-delay: nth($delays, $i);
}
}
您还可以尝试为您要解决的问题创建一个循环。例如,我发现有一个像 aaaabbbb 的模式,每侧都有一个偏移量,可以映射您的案例以重现您想要的内容。按照这种逻辑,我创建了以下代码。
$animationPerc: 0%, 20%, 25%, 45%, 50%, 70%, 75%, 95%, 100%;
$animationPos: 20px, calc(50% + 10px);
$animationOffset: 0, 2, 4, 6; // top, left, bottom, right
@keyframes rotate-board {
@for $i from 0 to 9 {
#{nth($animationPerc, $i + 1)} {
top: nth($animationPos, 1 + (floor((nth($animationOffset, 1) + $i)/4) % 2));
left: nth($animationPos, 1 + (floor((nth($animationOffset, 2) + $i)/4) % 2));
bottom: nth($animationPos, 1 + (floor((nth($animationOffset, 3) + $i)/4) % 2));
right: nth($animationPos, 1 + (floor((nth($animationOffset, 4) + $i)/4) % 2));
}
}
}