2 回答
TA贡献1865条经验 获得超7个赞
问题是你总是调用fadeTo(),即使你不需要。当您滚动通过y > 400时,fadeTo(400, 0)将调用 (fade out)。但是,当您进一步向下滚动时,fadeTo(400, 0)即使该元素不再可见,您也会继续调用。
我不完全确定为什么淡出需要这么长时间,但我想这与在短时间内链接大量动画请求有关。
您可以通过跟踪元素的可见性来解决问题。我添加了以下内容:
if (y <= 400 == isVisible) return;
// or if you find the above confusing
if (y <= 400 && isVisible || y > 400 && !isVisible) return;
如果不必更改可见性,这会提前退出回调。这个保护子句确保fadeTo()只在实际需要时调用它。
另一件有助于提高性能的事情是确保您$("#intro-section")事先保存在变量中。你不应该忘记这$()是一个函数,每次调用它时都必须在 DOM 中搜索提供的查询选择器。把它想象成findSelectorInDOM("#intro-section"). 将结果缓存在变量中可能会大大加快速度,尤其是当您$()经常使用相同的参数调用时。
const $introSection = $("#intro-section");
let isVisible = $introSection.is(":visible");
$(document).scroll(function() {
const y = $(this).scrollTop();
console.log(y);
if (y <= 400 == isVisible) return;
isVisible = !isVisible;
const opacity = +isVisible;
console.log(`start fading to ${opacity}`);
$introSection.fadeTo(400, opacity, () => {
console.log(`done fading to ${opacity}`);
});
});
#intro-section {
padding: 4rem;
}
#intro-section .row {
padding: 4rem 8rem 7rem 8rem;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div style="height: 300px">
Scroll down!
</div>
<div id="intro-section">
Intro
</div>
<div style="height: 100vh">
</div>
TA贡献1848条经验 获得超6个赞
您在滚动时多次调用 FadeTo,因此它在尝试淡入时仍然淡出。此代码已经过测试并且可以正常工作。
let fading = false;
jQuery(document).scroll(function() {
var y = jQuery(this).scrollTop();
console.log(y);
if(!fading) {
fading = true;
if (y > 400) {
console.log('fading out');
jQuery('#intro-section').fadeTo(400, 0.0, () => fading = false);
console.log('done fading out');
} else {
console.log('fading in');
jQuery('#intro-section').fadeTo(400, 1.0, () => fading = false);
console.log('done fading in');
}
}
});
添加回答
举报