Web 接口
Intersection Observer API - 用于异步观察目标元素与祖先元素或与顶级文档视口的交集的变化
下面是产生的内容。向上和向下滚动这个页面,注意在你这样做的时候,盒子的外观如何变化。
源代码:
点击运行 »
<style> #box { background-color: rgba(40, 40, 190, 255); border: 4px solid rgb(20, 20, 120); transition: background-color 1s, border 1s; width: 350px; height: 350px; display: flex; align-items: center; justify-content: center; padding: 20px; } .vertical { color: white; font: 32px "Arial"; } .extra { width: 350px; height: 350px; margin-top: 10px; border: 4px solid rgb(20, 20, 120); text-align: center; padding: 20px; } </style> <div id="box"> <div class="vertical"> 欢迎来到<strong>盒子!</strong> </div> </div> <script> const numSteps = 20.0; let boxElement; let prevRatio = 0.0; let increasingColor = "rgba(40, 40, 190, ratio)"; let decreasingColor = "rgba(190, 40, 40, ratio)"; window.addEventListener("load", (event) => { boxElement = document.querySelector("#box"); createObserver(); }, false); function createObserver() { let observer; let options = { root: null, rootMargin: "0px", threshold: buildThresholdList() }; observer = new IntersectionObserver(handleIntersect, options); observer.observe(boxElement); } function buildThresholdList() { let thresholds = []; let numSteps = 20; for (let i=1.0; i<=numSteps; i++) { let ratio = i/numSteps; thresholds.push(ratio); } thresholds.push(0); return thresholds; } function handleIntersect(entries, observer) { entries.forEach((entry) => { if (entry.intersectionRatio > prevRatio) { entry.target.style.backgroundColor = increasingColor.replace("ratio", entry.intersectionRatio); } else { entry.target.style.backgroundColor = decreasingColor.replace("ratio", entry.intersectionRatio); } prevRatio = entry.intersectionRatio; }); } </script>
运行结果:
点击运行 »