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');
}
}
});
添加回答
舉報