scroll 변화를 감지해 css 효과를 줄 수 있는 라이브러리
그냥 내렸을 때보다 영화 포스터가 생성되는 듯한 느낌을 준다
<script src="https://unpkg.com/scroll-out/dist/scroll-out.min.js"></script>
.movie {
display: flex;
flex-direction: column;
align-items: center;
gap: 40px;
border-radius: 5px;
color: white;
font-weight: bold;
cursor: pointer;
/* 투명도 추가 */
opacity: 0;
transition: opacity .35s
}
.movie[data-scroll='in']{
opacity: 1;
transition-duration: 1s;
}
ScrollOut({
targets: ".movie",
once: true,
});
주의점: target의 태그가 비동기로 생성되는 경우, 해당 비동기 함수안에 선언해야 함!
<img src="${poster_path? moviePosterPath: 'icons/replaceMovie.png'}" onerror="this.onerror=null; this.src='icons/replaceMovie.png';">
const currentScroll = window.scrollY;
const windowHeight = window.innerHeight;
const bodyHeight = document.body.clientHeight;
if(currentScroll + windowHeight <= bodyHeight){
//api호출
}
const options = {
root: null, // 뷰포트를 기준으로 타켓의 가시성 검사
rootMargin: "200px", // 확장 또는 축소 X
threshold: 0, // 타켓의 가시성 0%일 때 옵저버 실행
};
function onIntersect(entries, observer) {
const url = `https://api.themoviedb.org/3/search/movie?api_key=${apiKey}&language=ko-KR&query=${word}&page=${page}`;
entries.forEach(async (entry) => {
if (entry.isIntersecting) {
page++;
const data = await fetchGetData(url);
const movies = data.results;
//탈출 조건
if (movies.length < 1) {
observer.unobserve($listEnd);
return;
}
//영화 카드 구현
$movieContainer.insertAdjacentHTML(
"beforeend",
movies.map((movieInfo) => makeMovieCard(movieInfo)).join("")
);
//scroll시 fadeIn 애니메이션
ScrollOut({
targets: ".movie",
once: true,
});
}
});
}
const observer = new IntersectionObserver(onIntersect, options);
observer.observe($listEnd);
callback(onIntersect)
이 실행된다