GSAP 和 IntersectionObserver:文本 .from opacity:0 到 1 在动画前闪烁
GSAP and IntersectionObserver: Text .from opacity:0 to 1 flashing before animation
我正在使用 GSAP 和 IntersectionObserver 为滚动中每个 h1
的每个字符设置动画。
一切似乎都正常,但动画的 opacity
部分没有按预期工作。基本上可以看到 h1
,然后它变为 opacity:0
,然后又回到 1(这让我想起了臭名昭著的 Flash Of Unstyled Text)。
我正在使用 .from
方法。我希望每个 h1
在动画之前都是不可见的,但我不知道我做错了什么。
请检查代码段。
const titles = document.querySelectorAll("h1");
const options = {
root: null,
threshold: 0.25,
rootMargin: "-200px"
};
const observer = new IntersectionObserver(function(entries, observer) {
entries.forEach(entry => {
if (!entry.isIntersecting) {
return;
}
entry.target.classList.add("anim-text");
// TEXT SPLITTING
const animTexts = document.querySelectorAll(".anim-text");
animTexts.forEach(text => {
const strText = text.textContent;
const splitText = strText.split("");
text.textContent = "";
splitText.forEach(item => {
text.innerHTML += "<span>" + item + "</span>";
});
});
// END TEXT SPLITTING
// TITLE ANIMATION
const charTl = gsap.timeline();
charTl.set("h1", { opacity: 1 }).from(
".anim-text span",
{
opacity: 0,
x: 40,
stagger: {
amount: 1
}
},
"+=0.5"
);
observer.unobserve(entry.target);
// END TITLE ANIMATION
});
}, options);
titles.forEach(title => {
observer.observe(title);
});
* {
color: white;
padding: 0;
margin: 0;
}
.top {
display: flex;
justify-content: center;
align-items: center;
font-size: 2rem;
height: 100vh;
width: 100%;
background-color: #279AF1;
}
h1 {
opacity: 0;
font-size: 4rem;
}
section {
padding: 2em;
height: 100vh;
}
.sec-1 {
background-color: #EA526F;
}
.sec-2 {
background-color: #23B5D3;
}
.sec-3 {
background-color: #F9C80E;
}
.sec-4 {
background-color: #662E9B;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.2.5/gsap.min.js"></script>
<div class="top">Scroll Down</div>
<section class="sec-1">
<h1>FIRST</h1>
</section>
<section class="sec-2">
<h1>SECOND</h1>
</section>
<section class="sec-3">
<h1>THIRD</h1>
</section>
<section class="sec-4">
<h1>FOURTH</h1>
</section>
非常感谢您的帮助!
这确实是无样式内容 (FOUC) 的闪现,因为 JavaScript 等待 运行 直到页面加载完毕。 GreenSock居然有我推荐的a tutorial on removing FOUC
基本方法是使用 CSS 隐藏元素并修改 JS 以使用更改后的 CSS(例如将 .from() 更改为 .to() 或。从到())。您可以通过将 h1 { opacity: 0 }
添加到 CSS 然后将以下内容添加到 JS:gsap.set(h1, {opacity: 1});
来实现。
旁注:GSAP 有自己的 SplitText plugin,可以轻松自定义文本的拆分方式(包括按行)、处理非标准字符并添加轻松恢复为默认值的功能.如果您要拆分文本,我强烈推荐它!
我正在使用 GSAP 和 IntersectionObserver 为滚动中每个 h1
的每个字符设置动画。
一切似乎都正常,但动画的 opacity
部分没有按预期工作。基本上可以看到 h1
,然后它变为 opacity:0
,然后又回到 1(这让我想起了臭名昭著的 Flash Of Unstyled Text)。
我正在使用 .from
方法。我希望每个 h1
在动画之前都是不可见的,但我不知道我做错了什么。
请检查代码段。
const titles = document.querySelectorAll("h1");
const options = {
root: null,
threshold: 0.25,
rootMargin: "-200px"
};
const observer = new IntersectionObserver(function(entries, observer) {
entries.forEach(entry => {
if (!entry.isIntersecting) {
return;
}
entry.target.classList.add("anim-text");
// TEXT SPLITTING
const animTexts = document.querySelectorAll(".anim-text");
animTexts.forEach(text => {
const strText = text.textContent;
const splitText = strText.split("");
text.textContent = "";
splitText.forEach(item => {
text.innerHTML += "<span>" + item + "</span>";
});
});
// END TEXT SPLITTING
// TITLE ANIMATION
const charTl = gsap.timeline();
charTl.set("h1", { opacity: 1 }).from(
".anim-text span",
{
opacity: 0,
x: 40,
stagger: {
amount: 1
}
},
"+=0.5"
);
observer.unobserve(entry.target);
// END TITLE ANIMATION
});
}, options);
titles.forEach(title => {
observer.observe(title);
});
* {
color: white;
padding: 0;
margin: 0;
}
.top {
display: flex;
justify-content: center;
align-items: center;
font-size: 2rem;
height: 100vh;
width: 100%;
background-color: #279AF1;
}
h1 {
opacity: 0;
font-size: 4rem;
}
section {
padding: 2em;
height: 100vh;
}
.sec-1 {
background-color: #EA526F;
}
.sec-2 {
background-color: #23B5D3;
}
.sec-3 {
background-color: #F9C80E;
}
.sec-4 {
background-color: #662E9B;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.2.5/gsap.min.js"></script>
<div class="top">Scroll Down</div>
<section class="sec-1">
<h1>FIRST</h1>
</section>
<section class="sec-2">
<h1>SECOND</h1>
</section>
<section class="sec-3">
<h1>THIRD</h1>
</section>
<section class="sec-4">
<h1>FOURTH</h1>
</section>
非常感谢您的帮助!
这确实是无样式内容 (FOUC) 的闪现,因为 JavaScript 等待 运行 直到页面加载完毕。 GreenSock居然有我推荐的a tutorial on removing FOUC
基本方法是使用 CSS 隐藏元素并修改 JS 以使用更改后的 CSS(例如将 .from() 更改为 .to() 或。从到())。您可以通过将 h1 { opacity: 0 }
添加到 CSS 然后将以下内容添加到 JS:gsap.set(h1, {opacity: 1});
来实现。
旁注:GSAP 有自己的 SplitText plugin,可以轻松自定义文本的拆分方式(包括按行)、处理非标准字符并添加轻松恢复为默认值的功能.如果您要拆分文本,我强烈推荐它!