script.js
style.css
index.html
setup.css
let highlightClass = 'highlight'; // Variables again. let highlightBlocks = document.querySelectorAll('section'); // All. // Loop through the list, doing this `forEach` one. highlightBlocks.forEach((block) => { let sectionObserver = new IntersectionObserver((entries) => { let [entry] = entries; // This is a "ternary" operator——a condensed if/else. entry.isIntersecting ? block.classList.add(highlightClass) : block.classList.remove(highlightClass); }, { root: document, // This is only needed in the example iframe! rootMargin: '-33% 0% -33% 0%', // CSS-ish: top/right/bottom/left. }); sectionObserver.observe(block); // Watch each one! });
section { /* Initial state, without the class. */ background-color: gold; padding: calc(var(--base) / 2); transition: all 1s ease-in-out; /* Transition everything. */ will-change: transform; /* Improves the aliasing! */ } section.highlight { /* When the class is applied with JS! */ background-color: aquamarine; transform: rotate(5deg); }
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="/assets/styles/reset.css" rel="stylesheet"> <link href="setup.css" rel="stylesheet"> <link href="style.css" rel="stylesheet"> <script defer src="script.js"></script> </head> <body> <section> <p>I’ve just added some text here to have another element, and also added some CSS to style it a bit—nothing too fancy.</p> </section> <section> <p>I’ve just added some text here to have another element, and also added some CSS to style it a bit—nothing too fancy.</p> </section> <section> <p>I’ve just added some text here to have another element, and also added some CSS to style it a bit—nothing too fancy.</p> </section> <section> <p>I’ve just added some text here to have another element, and also added some CSS to style it a bit—nothing too fancy.</p> </section> <section> <p>I’ve just added some text here to have another element, and also added some CSS to style it a bit—nothing too fancy.</p> </section> <section> <p>I’ve just added some text here to have another element, and also added some CSS to style it a bit—nothing too fancy.</p> </section> <section> <p>I’ve just added some text here to have another element, and also added some CSS to style it a bit—nothing too fancy.</p> </section> </body> </html>
body { --base: 20px; align-items: center; display: flex; flex-direction: column; font-family: sans-serif; padding: var(--base); row-gap: var(--base); }