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);
}