GSAP ScrollTrigger切换主题时滚动到页面底部异常问题咨询
问题原因
滚动到页面底部触发意外onEnterBack回调是ScrollTrigger的边界校准逻辑和你配置的参数缺失共同导致的,具体有两个核心问题:
- 你为
.js__trigger-light创建的ScrollTrigger没有显式声明end参数,ScrollTrigger默认会用"top top"(触发器顶部碰到视口顶部)作为区间结束值。如果该触发器所在区块高度较大、位置靠近页面底部,滚动到页面最底部时,滚动位置会超出该触发器的预设区间,触发逻辑回退,意外命中第一个触发器的onEnterBack回调。 - 你第一个触发器的
end设为"+=300",如果页面整体可滚动高度不足,滚动到页面底部时还未到该触发器的结束位置,ScrollTrigger的边界自动校准逻辑会判定你「回退进入了触发器区间」,进而触发onEnterBack执行disableTheme()移除主题属性。
解决方法
按照下面的规则调整配置即可修复:
- 给所有ScrollTrigger显式设置
end参数,明确每个触发器的生效区间,避免默认值带来的判定歧义 - 新增
toggleActions参数,明确指定不同滚动状态下的触发规则,禁止边界校准自动触发回调 - 给主题切换函数增加状态判断,避免重复执行无意义的属性修改
调整后的参考代码:
ScrollTrigger.create({ trigger: ".js__trigger-dark", start: "bottom bottom", end: "+=300", toggleActions: "play none none reverse", // 仅主动滚动时触发回调 onLeave: self => changeTheme(), onEnterBack: self => disableTheme(), }); ScrollTrigger.create({ trigger: ".js__trigger-light", start: 'bottom bottom', end: "top top", // 可根据实际区块高度调整为对应结束位置 toggleActions: "play none none reverse", onLeave: self => disableTheme(), onEnterBack: self => changeTheme(), }); function changeTheme() { if(jQuery('html').attr('data-theme') === 'dark') return jQuery('html').attr('data-theme','dark'); } function disableTheme() { if(jQuery('html').attr('data-theme') === '') return jQuery('html').attr('data-theme',''); }
内容的提问来源于stack exchange,提问作者Valentine
相关产品推荐
相关产品推荐

