gpt4 book ai didi

javascript - 为什么 CSS 动画突然结束?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:08:16 25 4
gpt4 key购买 nike

我正在尝试为 block 制作字幕动画,动画应该是“无限的”。但是有一个问题是动画在一段时间后突然结束并突然开始。大约 6 秒的动画后,您可以看到 block “抽搐”,我假设这是 css 动画从 100% 变为 0% 的时候?任何建议如何使它“无限”?我不介意使用 JS 或其他任何方法来解决问题。代码笔:https://codepen.io/1818/pen/WVOKMK

const root = document.documentElement;
const marqueeElementsDisplayed = getComputedStyle(root).getPropertyValue("--marquee-elements-displayed");
const marqueeContent = document.querySelector("ul.marquee-content");

root.style.setProperty("--marquee-elements", marqueeContent.children.length);

for(let i=0; i<marqueeElementsDisplayed; i++) {
marqueeContent.appendChild(marqueeContent.children[i].cloneNode(true));
}
:root {
--marquee-width: 80vw;
--marquee-height: 20vh;
/* --marquee-elements: 12; */ /* defined with JavaScript */
--marquee-elements-displayed: 3;
--marquee-element-width: calc(var(--marquee-width) / var(--marquee-elements-displayed));
--marquee-animation-duration: calc(var(--marquee-elements) * 0.5s);
}

.marquee {
width: var(--marquee-width);
height: var(--marquee-height);
background-color: #111;
color: #eee;
overflow: hidden;
position: relative;
}
.marquee:before, .marquee:after {
position: absolute;
top: 0;
width: 10rem;
height: 100%;
content: "";
z-index: 1;
}
.marquee:before {
left: 0;
background: linear-gradient(to right, #111 0%, transparent 100%);
}
.marquee:after {
right: 0;
background: linear-gradient(to left, #111 0%, transparent 100%);
}
.marquee-content {
list-style: none;
height: 100%;
display: flex;
animation: scrolling var(--marquee-animation-duration) linear infinite;
}
/* .marquee-content:hover {
animation-play-state: paused;
} */
@keyframes scrolling {
0% { transform: translateX(calc(-1 * var(--marquee-element-width) * var(--marquee-elements))); }
100% { transform: translateX(0); }
}
.marquee-content li {
display: flex;
justify-content: center;
align-items: center;
/* text-align: center; */
flex-shrink: 0;
width: var(--marquee-element-width);
max-height: 100%;
font-size: calc(var(--marquee-height)*3/4); /* 5rem; */
white-space: nowrap;
}

.marquee-content li img {
width: 100%;
/* height: 100%; */
border: 2px solid #eee;
}

@media (max-width: 600px) {
html { font-size: 12px; }
:root {
--marquee-width: 100vw;
--marquee-height: 16vh;
--marquee-elements-displayed: 1;
}
.marquee:before, .marquee:after { width: 5rem; }
}

/* STYLES */
.marquee-content li, .marqueetwo-content li, .marqueethree-content li {
margin: 20px 20px 20px 20px!important;
background: #fff;
height: 301px;
width: 536px!important;
border-radius: 10px;
}

.marquee, .marqueetwo, .marqueethree {
width: auto!important;
height: auto!important;
}
 <div class="marquee">
<ul class="marquee-content">
<li><i class="fab fa-github"></i></li>
<li><i class="fab fa-codepen"></i></li>
<li><i class="fab fa-free-code-camp"></i></li>
<li><i class="fab fa-dev"></i></li>
<li><i class="fab fa-react"></i></li>
<li><i class="fab fa-vuejs"></i></li>
<li><i class="fab fa-angular"></i></li>
<li><i class="fab fa-node"></i></li>
<li><i class="fab fa-wordpress"></i></li>
<li><i class="fab fa-aws"></i></li>
<li><i class="fab fa-docker"></i></li>
<li><i class="fab fa-android"></i></li>
</ul>
</div>

最佳答案

您的计算存在一些问题,我已解决如下问题:

  • 有一个应用于 ul 的默认填充/边距需要删除
  • 您需要在每个选取框元素的宽度计算中考虑边距
  • 我将容器制作成 inline-flex,这样它就适合它的内容,您可以考虑转换中的百分比值,而不是复杂的公式。

我删除了一些代码,只保留了相关的代码

const root = document.documentElement;
const marqueeElementsDisplayed = getComputedStyle(root).getPropertyValue("--marquee-elements-displayed");
const marqueeContent = document.querySelector("ul.marquee-content");

root.style.setProperty("--marquee-elements", marqueeContent.children.length);

for(let i=0; i<marqueeElementsDisplayed; i++) {
marqueeContent.appendChild(marqueeContent.children[i].cloneNode(true));
}
:root {
--marquee-width: 100vw;
--marquee-height: 100vh;
/* --marquee-elements: 12; */ /* defined with JavaScript */
--marquee-elements-displayed: 3;
--marquee-element-width: calc(var(--marquee-width) / var(--marquee-elements-displayed));
--marquee-animation-duration: calc(var(--marquee-elements) * 0.5s);
}
body {
margin:0;
}
.marquee {
width: var(--marquee-width);
height: var(--marquee-height);
background-color: #111;
color: #eee;
overflow: hidden;
position: relative;
}
.marquee:before, .marquee:after {
position: absolute;
top: 0;
width: 10rem;
height: 100%;
content: "";
z-index: 1;
}
.marquee:before {
left: 0;
background: linear-gradient(to right, #111 0%, transparent 100%);
}
.marquee:after {
right: 0;
background: linear-gradient(to left, #111 0%, transparent 100%);
}
.marquee-content {
list-style: none;
height: 100%;
display: inline-flex; /* added this */
padding:0; /* added this */
margin:0; /* added this */
animation: scrolling var(--marquee-animation-duration) linear infinite;
}

@keyframes scrolling {
0% { transform: translateX(calc(-100% + var(--marquee-width))); } /* modified this*/
100% { transform: translateX(0); }
}
.marquee-content li {
margin:20px;
flex-shrink: 0;
width: calc(var(--marquee-element-width) - 40px); /* Modified this */
font-size: calc(var(--marquee-height)*3/4); /* 5rem; */
background:#fff;
border-radius: 10px;
}
<div class="marquee">
<ul class="marquee-content">
<li><i class="fab fa-github"></i></li>
<li><i class="fab fa-codepen"></i></li>
<li><i class="fab fa-free-code-camp"></i></li>
<li><i class="fab fa-dev"></i></li>
<li><i class="fab fa-react"></i></li>
<li><i class="fab fa-vuejs"></i></li>
<li><i class="fab fa-angular"></i></li>
<li><i class="fab fa-node"></i></li>
<li><i class="fab fa-wordpress"></i></li>
<li><i class="fab fa-aws"></i></li>
<li><i class="fab fa-docker"></i></li>
<li><i class="fab fa-android"></i></li>
</ul>
</div>

关于javascript - 为什么 CSS 动画突然结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57305300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com