JSFiddle - React, Tailwind, and code Playground
by rough cheap
HTML
<div id="box">
<div class="vertical">
Welcome to <strong>The Box!</strong>
</div>
</div>
CSS
#box {
background-color: rgba(40, 40, 190, 255);
border: 4px solid rgb(29, 29, 120);
transition: background-color 1s, border 1s;
width: 350px;
height: 350px;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
margin-top: 1000px;
margin-bottom: 1000px;
}
.vertical {
color: white;
font: 32px "Arial";
}
.extra {
width: 350px;
height: 350px;
margin-top: 10px;
border: 4px solid rgb(29, 29, 120);
text-align: center;
padding: 20px;
}
JavaScript
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()
};
console.log(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) => {
console.log(entry.intersectionRatio);
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;
});
}