Appearance
📚 定义:
ScrollTrigger.addEventListener(safe: Boolean)
- 对页面中所有的ScrollTrigger都重新计算位置。当window/scroller resize时,它会自动发生。但是你也可以通过调用
ScrollTrigger.refresh()
强制刷新。例如,如果你对DOM进行更改,将导致回流和位置更改(如展开内容)。 - 参数
safe: Boolean
: 如果为true
,它至少等待一个requestAnimationFrame tick,大约200ms后开始刷新。这很有用,因为有时浏览器实际上不会立即呈现dom相关的更改,从而导致测量不准确。- 例如,如果你给一个可以展开其内容的元素添加
click
事件,并且你在事件回调中调用ScrollTrigger.refresh()
,这个改变可能在那个时间点还没有完全渲染,因此这里是很适合开启safe
😎
刷新时会发生什么?
每个ScrollTrigger都会进行如下步骤(按实例创建的顺序):
refreshInit
事件被触发- 任何固定元素(
pinned elements
)会临时回退到它们非固定状态(它们在文档中的自然位置) - 如果使用了
scrub
,动画会临时重置到开始状态 - ScrollTrigger的start & end位置会基于其当前DOM(自然流)进行重新计算。这也意味着,如果你使用了基于函数的
start
|end
值,它们也会被调用🤩 - 任何固定元素和动画会依据它们的新的位置或进度重启(re-enable)
- 如果进度(progress)发生变化,
update()
回调函数会被调用 - ScrollTrigger实例的
onRefresh
回调被触发
高级:监听 refresh|refreshInit 事件
ScrollTrigger会在所有ScrollTriggers刷新前立即执行 refreshInit
事件,在所有ScrollTriggers刷新后立即执行 refresh
事件。 你可以添加一个 事件监听器:
js
ScrollTrigger.addEventListener('refreshInit', function() {
// 这个事件在刷新前调用
})
ScrollTrigger.addEventListener('refresh', function() {
// 这个事件在所有ScrollTriggers刷新后调用
})
这些事件都是 全局
发送的,而不是绑定某个特定ScrollTrigger的 🌰
js
ScrollTrigger.addEventListener(
'scrollEnd',
() => console.log('Scrolling Ended!')
)
同时还有一个移除事件监听的方法。注意,这些方法都是 静态的
refresh() 和 update() 的区别是什么?
refresh()
是关于ScrollTrigger start | end
位置依据当前DOM重新计算;而 update()
简单的检查scroller滚动位置并更新相关联的动画和触发回调(如果必要的话)。 因此,refresh()
设计更多的工作,它也会最终调用 update()
。 当DOM改变或者你需要强制重新计算 start|end
位置时,你才会去调用 refresh()
。
文档地址:
2022年10月20日17:40:12