InterSectionObserver
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const observer = new IntersectionObserver((entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { console.log(`${entry.target.id} 进入视口`); entry.target.src = 'your_image.jpg'; observer.unobserve(entry.target); } }); });
const targetElement = document.getElementById('your_element_id');
observer.observe(targetElement);
|
MutationObserver
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| const observer = new MutationObserver((mutationsList) => { mutationsList.forEach((mutation) => { if (mutation.type === 'childList') { console.log('子节点列表发生变化'); } else if (mutation.type === 'attributes') { console.log(`属性 ${mutation.attributeName} 发生变化`); } }); });
const targetNode = document.getElementById('your_target_node_id');
const config = { attributes: true, childList: true, subtree: true };
observer.observe(targetNode, config);
|
requestAnimationFrame
requestAnimationFrame的概念
通俗点讲就是该API能以浏览器的显示频率来作为其动画动作的频率,比如浏览器每10ms刷新一次,动画回调也每10ms调用一次,这样就不会存在过度绘制的问题,动画不会掉帧,自然流畅。
requestAnimationFrame的作用
requestAnimationFrame的优势
requestAnimationFrame的优势应用场景
requestIdleCallback