scroll event example
by hyeyoon
HTML
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.7.0/animate.min.css">
<div class="example">
<h1 class="title">Scroll Down <span class="arrow">๐</span></h1>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>
CSS
.example {
padding-top: 800px;
padding-bottom: 300px;
width: 100%;
background: #eee;
position: relative;
}
.title {
position: absolute;
top: 10px;
left: 50%;
transform: translateX(-50%);
}
.arrow {
display: inline-block;
animation: bounce 1s infinite ease;
}
.box {
margin: 0 auto 200px auto;
width: 100px;
height: 100px;
border-radius: 5px;
background: #7de2fc linear-gradient(-225deg, #7de2fc 0%, #b9b6e5 100%);
}
.box.tada {
animation: tada 1s ease;
}
JavaScript
// ํด๋น ์์๊ฐ viewport ๋ด์ ์๋์ง ํ์ธํ๋ ํจ์
// ๋ํ์ ์ธ ์์๋ก ์ฌ์ฉ๋๊ณ ์๋ stackoverflow์ ์์๋ฅผ ๊ฐ์ ธ์์ต๋๋ค.
// https://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport/7557433#7557433
function isElementInViewport (el) {
var rect = el.getBoundingClientRect();
return (
rect.top >= 0 &&
rect.left >= 0 &&
rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
rect.right <= (window.innerWidth || document.documentElement.clientWidth)
);
}
// scroll ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ๊ณ , ํด๋น element์ callback ํจ์๋ฅผ ๋ฑ๋กํ๋ ํจ์
const addEventToEl = (elList) => {
document.addEventListener('scroll', () => {
elList.forEach(el => {
if (isElementInViewport(el)) {
el.classList.add('tada');
} else {
el.classList.remove('tada');
}
})
})
}
// ๋์์ํฌ elements๋ฆฌ์คํธ์ ์ด๋ฒคํธ๋ฅผ ๋ฑ๋ก
const boxElList = document.querySelectorAll('.box');
addEventToEl(boxElList);