竖排文字滑动,一句一句
Vertical text sliding, one phrase after another
我正在努力想出一个使用 CSS 动画的文本 silder。我所追求的是从短语列表中一次显示一个短语。一个短语从右侧滑入,保持(暂停)并从右侧滑出,然后下一个短语滑入。依此类推。
这就是我目前所做的工作。但似乎使用动画延迟方法不是可行的方法。有人对如何让这些文本短语整齐地一个接一个地滑动有什么建议吗?
ul {
padding: 0;
margin: 0;
}
.wrapper div {
width: 100%;
}
.list li {
width: 100%;
max-width: 600px;
display: flex;
justify-content: center;
opacity: 0;
margin-left: auto;
margin-right: auto;
position: absolute;
}
.item-a {
animation: slideIn 4s forwards cubic-bezier(0.1, 0.67, 0.29, 0.98) infinite;
}
.item-b {
/* Start with 4 seconds delay */
animation: slideIn 4s 4s forwards cubic-bezier(0.1, 0.67, 0.29, 0.98) infinite;
}
.item-c {
/* Start with 8 seconds delay */
animation: slideIn 4s 8s forwards cubic-bezier(0.1, 0.67, 0.29, 0.98) infinite;
}
@keyframes slideIn {
0% {
transform: translate3d(50%, 0, 0);
opacity: 0;
}
20% {
transform: translate3d(0, 0, 0);
opacity: 1;
}
80% {
transform: translate3d(0, 0, 0);
opacity: 1;
}
99.99% {
transform: translate3d(-50%, 0, 0);
opacity: 0;
}
100% {
transform: translate3d(50%, 0, 0);
opacity: 0;
}
}
<div class="wrapper">
<div>
<ul class="list slider">
<li class="item-a">
You are cool!
</li>
<li class="item-b">
Well done!
</li>
<li class="item-c">
Keep on going!
</li>
</ul>
</div>
</div>
如果您不介意使用 javascript(也许不是对您问题的直接回答),您可以通过在动画结束后删除 li
元素来解决它,然后添加不同文字的新版本。
最大的优点是您可以轻松地向列表中添加更多文本,而无需调整 CSS 文件。
const texts = ["You are cool", "Well done", "Keep on going!"]
const ul = document.querySelector("ul");
let counter = 0
function addAnimation() {
const li = document.createElement("li");
li.innerText = texts[counter];
ul.appendChild(li);
li.classList.add("animated-item");
li.addEventListener('animationend', (e) => {
e.target.remove();
counter++;
if(counter == texts.length) counter = 0;
addAnimation();
});
}
addAnimation();
ul {
padding: 0;
margin: 0;
}
.wrapper div {
width: 100%;
}
.list li {
width: 100%;
max-width: 600px;
display: flex;
justify-content: center;
opacity: 0.4;
margin-left: auto;
margin-right: auto;
position: absolute;
}
.animated-item {
animation: slideIn 4s forwards cubic-bezier(0.1, 0.67, 0.29, 0.98);
}
@keyframes slideIn {
0% {
transform: translate3d(50%, 0, 0);
opacity: 0.5;
}
20% {
transform: translate3d(0, 0, 0);
opacity: 1;
}
80% {
transform: translate3d(0, 0, 0);
opacity: 1;
}
100% {
transform: translate3d(-50%, 0, 0);
opacity: 0.5;
}
}
<div class="wrapper">
<div>
<ul class="list slider">
</ul>
</div>
</div>
您可以使用纯 CSS/HTML 和使用动画延迟来执行此操作 - 但动画中的 %s 和动画的总长度需要更改。
每个短语显示 4 秒,然后在其他短语显示时消失 8 秒,因此整体动画时间为 12 秒,前三分之一的短语将显示,剩下的三分之二将显示被隐藏。
将动画中的 %s 除以 3,我们得到:
@keyframes slideIn {
0% {
transform: translate3d(50%, 0, 0);
opacity: 0;
}
6.66% {
transform: translate3d(0, 0, 0);
opacity: 1;
}
26.66% {
transform: translate3d(0, 0, 0);
opacity: 1;
}
33.30% {
transform: translate3d(-50%, 0, 0);
opacity: 0;
}
33.33% {
transform: translate3d(50%, 0, 0);
opacity: 0;
}
100% {
transform: translate3d(50%, 0, 0);
opacity: 0;
}
}
现在,使用您已经内置的动画延迟,但将每个短语的整体动画持续时间更改为 12 秒,这些短语将永远一个接一个地出现。
这是片段:
ul {
padding: 0;
margin: 0;
}
.wrapper div {
width: 100%;
}
.list li {
width: 100%;
max-width: 600px;
display: flex;
justify-content: center;
opacity: 0;
margin-left: auto;
margin-right: auto;
position: absolute;
}
.item-a {
animation: slideIn 12s forwards cubic-bezier(0.1, 0.67, 0.29, 0.98) infinite;
}
.item-b {
/* Start with 4 seconds delay */
animation: slideIn 12s 4s forwards cubic-bezier(0.1, 0.67, 0.29, 0.98) infinite;
}
.item-c {
/* Start with 8 seconds delay */
animation: slideIn 12s 8s forwards cubic-bezier(0.1, 0.67, 0.29, 0.98) infinite;
}
@keyframes slideIn {
0% {
transform: translate3d(50%, 0, 0);
opacity: 0;
}
6.66% {
transform: translate3d(0, 0, 0);
opacity: 1;
}
26.66% {
transform: translate3d(0, 0, 0);
opacity: 1;
}
33.30% {
transform: translate3d(-50%, 0, 0);
opacity: 0;
}
33.33% {
transform: translate3d(50%, 0, 0);
opacity: 0;
}
100% {
transform: translate3d(50%, 0, 0);
opacity: 0;
}
}
<div class="wrapper">
<div>
<ul class="list slider">
<li class="item-a">
You are cool!
</li>
<li class="item-b">
Well done!
</li>
<li class="item-c">
Keep on going!
</li>
</ul>
</div>
</div>
对于不同数量的短语,您可以相应地更改 %s。
我正在努力想出一个使用 CSS 动画的文本 silder。我所追求的是从短语列表中一次显示一个短语。一个短语从右侧滑入,保持(暂停)并从右侧滑出,然后下一个短语滑入。依此类推。
这就是我目前所做的工作。但似乎使用动画延迟方法不是可行的方法。有人对如何让这些文本短语整齐地一个接一个地滑动有什么建议吗?
ul {
padding: 0;
margin: 0;
}
.wrapper div {
width: 100%;
}
.list li {
width: 100%;
max-width: 600px;
display: flex;
justify-content: center;
opacity: 0;
margin-left: auto;
margin-right: auto;
position: absolute;
}
.item-a {
animation: slideIn 4s forwards cubic-bezier(0.1, 0.67, 0.29, 0.98) infinite;
}
.item-b {
/* Start with 4 seconds delay */
animation: slideIn 4s 4s forwards cubic-bezier(0.1, 0.67, 0.29, 0.98) infinite;
}
.item-c {
/* Start with 8 seconds delay */
animation: slideIn 4s 8s forwards cubic-bezier(0.1, 0.67, 0.29, 0.98) infinite;
}
@keyframes slideIn {
0% {
transform: translate3d(50%, 0, 0);
opacity: 0;
}
20% {
transform: translate3d(0, 0, 0);
opacity: 1;
}
80% {
transform: translate3d(0, 0, 0);
opacity: 1;
}
99.99% {
transform: translate3d(-50%, 0, 0);
opacity: 0;
}
100% {
transform: translate3d(50%, 0, 0);
opacity: 0;
}
}
<div class="wrapper">
<div>
<ul class="list slider">
<li class="item-a">
You are cool!
</li>
<li class="item-b">
Well done!
</li>
<li class="item-c">
Keep on going!
</li>
</ul>
</div>
</div>
如果您不介意使用 javascript(也许不是对您问题的直接回答),您可以通过在动画结束后删除 li
元素来解决它,然后添加不同文字的新版本。
最大的优点是您可以轻松地向列表中添加更多文本,而无需调整 CSS 文件。
const texts = ["You are cool", "Well done", "Keep on going!"]
const ul = document.querySelector("ul");
let counter = 0
function addAnimation() {
const li = document.createElement("li");
li.innerText = texts[counter];
ul.appendChild(li);
li.classList.add("animated-item");
li.addEventListener('animationend', (e) => {
e.target.remove();
counter++;
if(counter == texts.length) counter = 0;
addAnimation();
});
}
addAnimation();
ul {
padding: 0;
margin: 0;
}
.wrapper div {
width: 100%;
}
.list li {
width: 100%;
max-width: 600px;
display: flex;
justify-content: center;
opacity: 0.4;
margin-left: auto;
margin-right: auto;
position: absolute;
}
.animated-item {
animation: slideIn 4s forwards cubic-bezier(0.1, 0.67, 0.29, 0.98);
}
@keyframes slideIn {
0% {
transform: translate3d(50%, 0, 0);
opacity: 0.5;
}
20% {
transform: translate3d(0, 0, 0);
opacity: 1;
}
80% {
transform: translate3d(0, 0, 0);
opacity: 1;
}
100% {
transform: translate3d(-50%, 0, 0);
opacity: 0.5;
}
}
<div class="wrapper">
<div>
<ul class="list slider">
</ul>
</div>
</div>
您可以使用纯 CSS/HTML 和使用动画延迟来执行此操作 - 但动画中的 %s 和动画的总长度需要更改。
每个短语显示 4 秒,然后在其他短语显示时消失 8 秒,因此整体动画时间为 12 秒,前三分之一的短语将显示,剩下的三分之二将显示被隐藏。
将动画中的 %s 除以 3,我们得到:
@keyframes slideIn {
0% {
transform: translate3d(50%, 0, 0);
opacity: 0;
}
6.66% {
transform: translate3d(0, 0, 0);
opacity: 1;
}
26.66% {
transform: translate3d(0, 0, 0);
opacity: 1;
}
33.30% {
transform: translate3d(-50%, 0, 0);
opacity: 0;
}
33.33% {
transform: translate3d(50%, 0, 0);
opacity: 0;
}
100% {
transform: translate3d(50%, 0, 0);
opacity: 0;
}
}
现在,使用您已经内置的动画延迟,但将每个短语的整体动画持续时间更改为 12 秒,这些短语将永远一个接一个地出现。
这是片段:
ul {
padding: 0;
margin: 0;
}
.wrapper div {
width: 100%;
}
.list li {
width: 100%;
max-width: 600px;
display: flex;
justify-content: center;
opacity: 0;
margin-left: auto;
margin-right: auto;
position: absolute;
}
.item-a {
animation: slideIn 12s forwards cubic-bezier(0.1, 0.67, 0.29, 0.98) infinite;
}
.item-b {
/* Start with 4 seconds delay */
animation: slideIn 12s 4s forwards cubic-bezier(0.1, 0.67, 0.29, 0.98) infinite;
}
.item-c {
/* Start with 8 seconds delay */
animation: slideIn 12s 8s forwards cubic-bezier(0.1, 0.67, 0.29, 0.98) infinite;
}
@keyframes slideIn {
0% {
transform: translate3d(50%, 0, 0);
opacity: 0;
}
6.66% {
transform: translate3d(0, 0, 0);
opacity: 1;
}
26.66% {
transform: translate3d(0, 0, 0);
opacity: 1;
}
33.30% {
transform: translate3d(-50%, 0, 0);
opacity: 0;
}
33.33% {
transform: translate3d(50%, 0, 0);
opacity: 0;
}
100% {
transform: translate3d(50%, 0, 0);
opacity: 0;
}
}
<div class="wrapper">
<div>
<ul class="list slider">
<li class="item-a">
You are cool!
</li>
<li class="item-b">
Well done!
</li>
<li class="item-c">
Keep on going!
</li>
</ul>
</div>
</div>
对于不同数量的短语,您可以相应地更改 %s。