用纯 css 动画一个接一个 div
Animate one div after another with pure css
<style>
@keyframes bounceIn {
from,
20%,
40%,
60%,
80%,
to {
-webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
}
0% {
opacity: 0;
-webkit-transform: scale3d(0.3, 0.3, 0.3);
transform: scale3d(0.3, 0.3, 0.3);
}
20% {
-webkit-transform: scale3d(1.1, 1.1, 1.1);
transform: scale3d(1.1, 1.1, 1.1);
}
40% {
-webkit-transform: scale3d(0.9, 0.9, 0.9);
transform: scale3d(0.9, 0.9, 0.9);
}
60% {
opacity: 1;
-webkit-transform: scale3d(1.03, 1.03, 1.03);
transform: scale3d(1.03, 1.03, 1.03);
}
80% {
-webkit-transform: scale3d(0.97, 0.97, 0.97);
transform: scale3d(0.97, 0.97, 0.97);
}
to {
opacity: 1;
-webkit-transform: scale3d(1, 1, 1);
transform: scale3d(1, 1, 1);
}
}
.card {
height: 400px;
width: 100%;
max-width: 360px;
margin: 50px 10px 0px 10px;
box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
transition: all 0.3s cubic-bezier(.25,.8,.25,1);
animation: bounceIn 0.85s linear forwards;
}
我使用 animated.css 中的代码来制作卡片动画。我有多张卡片,我想一张一张地制作动画。第一张卡的延迟为 0.85 秒,第二张为 0.9 秒,第三张为 0.95 秒,依此类推。有没有一种方法可以在 CSS 中做到这一点,而无需创建大量新的 类,例如 .card_1
、.card_2
等等?
不,如果不做像 this 这样非常时髦的事情,您的 .css 文件就无法知道有多少元素需要设置动画。根据您的环境,如果可能的话,我建议使用内联样式来处理使用服务器端逻辑呈现的过渡持续时间,或者如果不行,则使用 JavaScript。
带有 Twig 模板的服务器端示例:
{% for item in items %}
<div class="card" style="transition-duration={{ loop.index }}s"></div>
{% endfor %}
Javascript中的示例:
[...document.querySelectorAll('.card')].forEach((card, i) => {
card.style.transitionDuration = i + 's'
})
我还没有计算出所要求的确切延迟,也没有测试过上述内容。但这是方法。
你好像在看错开的动画。以下是执行此操作的两种方法:
Sass循环
就最终 CSS 代码而言,这是最“昂贵”的,需要进行预处理。如果您没有太多项目,它仍然可以接受,并且可以在更多浏览器上运行,如果您必须针对较旧的浏览器。
/* Your previous styles… */
.card {
$initial-delay: .85s;
$increase-delay: .1s;
$total-cards: 10; /* Say you have 10 cards, you can change this number */
@for $i from 1 through $total-cards {
&:nth-child($i) {
$zero-i: $i - 1; // Make it zero-based
animation-delay: #{ $initial-delay + $zero-i * $increase-delay };
}
}
}
CSS 自定义属性
现代浏览器可以使用 css 自定义属性,也称为 CSS 变量。通过将 Sass 示例中的相同值分配到您的标记中,您可以获得相同的结果。
<ul class="card-container" style="--t: 10;">
<li class="card" style="--i: 0;">Card content…</li>
<li class="card" style="--i: 1;">Card content…</li>
<li class="card" style="--i: 2;">Card content…</li>
<!-- And so on… -->
</ul>
/* Your previous styles… */
.card {
animation-delay: calc(.85s + .1s * var(--i));
}
更少 CSS 但您可能需要处理 HTML 输出以在每个项目上附加这些额外的 style
属性。请注意,此处不需要容器分配 --t
,但我想确保您可以看到每个方法的工作原理。
我认为如果不写出每个 id 或 class 并更改动画 css 属性 以包含 .05,您就无法使用纯 css 来做到这一点更多秒数。
您可以使用 javascript 以编程方式执行此操作。
const beginSpeed = 0.85
const cards = []
cards.forEach((card, i) => {
cards.push(<div id=`card_${i}` class="card" style=`animation: bounceIn ${beginSpeed + (i * .05)}s linear forwards;` ></div>)
})
或者,如果您只想使用 for 循环
const beginSpeed = 0.85
const numberOfCardsDesired = 40
const cards = []
for(let i = 0; i < numberOfCardsDesired; i++) {
cards.push(<div id=`card_${i}` class="card" style=`animation: bounceIn ${beginSpeed + (i * .05)}s linear forwards;` ></div>)
}
通过将索引乘以 0.05 倍,它将导致每个后续 div 元素在前一个元素之后增加 0.05 秒。在您的 css 中,您可以包含带有所有静态 css 元素的卡片。通过这样做,您可以将变量 "numberOfCardsDesired" 更改为您想要的任何数字,并且许多卡片将动画化
.card {
height: 400px;
width: 100%;
max-width: 360px;
margin: 50px 10px 0px 10px;
box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
}
如果我的回答不完全符合您的要求,我深表歉意,因为它没有严格使用 CSS。希望这能以某种方式帮助你。祝你好运!
<style>
@keyframes bounceIn {
from,
20%,
40%,
60%,
80%,
to {
-webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
}
0% {
opacity: 0;
-webkit-transform: scale3d(0.3, 0.3, 0.3);
transform: scale3d(0.3, 0.3, 0.3);
}
20% {
-webkit-transform: scale3d(1.1, 1.1, 1.1);
transform: scale3d(1.1, 1.1, 1.1);
}
40% {
-webkit-transform: scale3d(0.9, 0.9, 0.9);
transform: scale3d(0.9, 0.9, 0.9);
}
60% {
opacity: 1;
-webkit-transform: scale3d(1.03, 1.03, 1.03);
transform: scale3d(1.03, 1.03, 1.03);
}
80% {
-webkit-transform: scale3d(0.97, 0.97, 0.97);
transform: scale3d(0.97, 0.97, 0.97);
}
to {
opacity: 1;
-webkit-transform: scale3d(1, 1, 1);
transform: scale3d(1, 1, 1);
}
}
.card {
height: 400px;
width: 100%;
max-width: 360px;
margin: 50px 10px 0px 10px;
box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
transition: all 0.3s cubic-bezier(.25,.8,.25,1);
animation: bounceIn 0.85s linear forwards;
}
我使用 animated.css 中的代码来制作卡片动画。我有多张卡片,我想一张一张地制作动画。第一张卡的延迟为 0.85 秒,第二张为 0.9 秒,第三张为 0.95 秒,依此类推。有没有一种方法可以在 CSS 中做到这一点,而无需创建大量新的 类,例如 .card_1
、.card_2
等等?
不,如果不做像 this 这样非常时髦的事情,您的 .css 文件就无法知道有多少元素需要设置动画。根据您的环境,如果可能的话,我建议使用内联样式来处理使用服务器端逻辑呈现的过渡持续时间,或者如果不行,则使用 JavaScript。
带有 Twig 模板的服务器端示例:
{% for item in items %}
<div class="card" style="transition-duration={{ loop.index }}s"></div>
{% endfor %}
Javascript中的示例:
[...document.querySelectorAll('.card')].forEach((card, i) => {
card.style.transitionDuration = i + 's'
})
我还没有计算出所要求的确切延迟,也没有测试过上述内容。但这是方法。
你好像在看错开的动画。以下是执行此操作的两种方法:
Sass循环
就最终 CSS 代码而言,这是最“昂贵”的,需要进行预处理。如果您没有太多项目,它仍然可以接受,并且可以在更多浏览器上运行,如果您必须针对较旧的浏览器。
/* Your previous styles… */
.card {
$initial-delay: .85s;
$increase-delay: .1s;
$total-cards: 10; /* Say you have 10 cards, you can change this number */
@for $i from 1 through $total-cards {
&:nth-child($i) {
$zero-i: $i - 1; // Make it zero-based
animation-delay: #{ $initial-delay + $zero-i * $increase-delay };
}
}
}
CSS 自定义属性
现代浏览器可以使用 css 自定义属性,也称为 CSS 变量。通过将 Sass 示例中的相同值分配到您的标记中,您可以获得相同的结果。
<ul class="card-container" style="--t: 10;">
<li class="card" style="--i: 0;">Card content…</li>
<li class="card" style="--i: 1;">Card content…</li>
<li class="card" style="--i: 2;">Card content…</li>
<!-- And so on… -->
</ul>
/* Your previous styles… */
.card {
animation-delay: calc(.85s + .1s * var(--i));
}
更少 CSS 但您可能需要处理 HTML 输出以在每个项目上附加这些额外的 style
属性。请注意,此处不需要容器分配 --t
,但我想确保您可以看到每个方法的工作原理。
我认为如果不写出每个 id 或 class 并更改动画 css 属性 以包含 .05,您就无法使用纯 css 来做到这一点更多秒数。
您可以使用 javascript 以编程方式执行此操作。
const beginSpeed = 0.85
const cards = []
cards.forEach((card, i) => {
cards.push(<div id=`card_${i}` class="card" style=`animation: bounceIn ${beginSpeed + (i * .05)}s linear forwards;` ></div>)
})
或者,如果您只想使用 for 循环
const beginSpeed = 0.85
const numberOfCardsDesired = 40
const cards = []
for(let i = 0; i < numberOfCardsDesired; i++) {
cards.push(<div id=`card_${i}` class="card" style=`animation: bounceIn ${beginSpeed + (i * .05)}s linear forwards;` ></div>)
}
通过将索引乘以 0.05 倍,它将导致每个后续 div 元素在前一个元素之后增加 0.05 秒。在您的 css 中,您可以包含带有所有静态 css 元素的卡片。通过这样做,您可以将变量 "numberOfCardsDesired" 更改为您想要的任何数字,并且许多卡片将动画化
.card {
height: 400px;
width: 100%;
max-width: 360px;
margin: 50px 10px 0px 10px;
box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
}
如果我的回答不完全符合您的要求,我深表歉意,因为它没有严格使用 CSS。希望这能以某种方式帮助你。祝你好运!