2021. 9. 17. 16:36ㆍCSS
Summary
1. js 코드
function handleScroll() {
const elements = document.querySelectorAll('.on-screen');
elements.forEach(element => {
if ( element.getBoundingClientRect().y > window.innerHeight ) { // 각 요소의 위치와 스크린 높이 비교
// css 스타일에 변화 적용
element.style.opacity = "0";
element.style.transform = 'translateY(70px)';
}
else {
element.style.opacity = "1";
element.style.transform = 'translateY(0px)';
}
})
}
2. css
.on-screen {
transition: transform 0.7s, opacity 1s;
}
Result
See the Pen by wkddkdud (@angpeng) on CodePen.
코드 해석
- javascript
1. html 코드에서 애니메이션 적용을 원하는 태그에 class명('on-screen')을 설정한다.
2. querySelectorAll를 이용해 on-screen 클래스가 지정된 모든 요소를 찾아 elements에 저장한다.
const elements = document.querySelectorAll('.on-screen');
3. forEach 배열 API를 통해 elements을 돌아가며 각 요소의 현재 위치(y축)와 현재 윈도우의 innerHeight를 받아온다.
const top = element.getBoundingClientRect().y;
const innerHeight = window.innerHeight;
4. 스크린에서 scroll 이벤트가 발생할 때 마다 변수 top(요소 위치)과 innerHeight(화면 높이)를 비교한다.
- 각 엘리먼트가 화면보다 아래에 존재할 경우 요소의 스타일을 ' 투명도 - 0, translateY - 70px '로 설정하고
- 엘리먼트가 화면 위로 올라오게 되는 순간 ' 투명도 - 1, translateY - 0px ' 으로 변경해주면 자연스러운 애니메이션 적용이 가능하다.
- 2개의 함수로 구현한 js 코드
function isElementUnderBottom(element) {
const top = element.getBoundingClientRect().y;
const innerHeight = window.innerHeight;
return top > innerHeight ? true : false; // top(요소 위치)가 innerHeight보다 클경우 true 반환 (= 화면 크기보다 하단에 존재)
}
function handleScroll() {
const elements = document.querySelectorAll('.on-screen');
elements.forEach( element => {
if (isElementUnderBottom(element)) { // 요소가 화면 아래에 존재하는 것이 참일 경우 적용할 스타일
element.style.opacity = "0";
element.style.transform = 'translateY(70px)';
} else {
element.style.opacity = "1";
element.style.transform = 'translateY(0px)';
}
})
}
- isElementUnderBottom 함수를 한줄로 담아 코드 길이를 줄인 js 코드
function handleScroll() {
const elements = document.querySelectorAll('.on-screen');
elements.forEach(element => {
if ( element.getBoundingClientRect().y > window.innerHeight ) { // isElementUnderBottom 함수 한줄로
element.style.transform = 'translateY(70px)';
}
else {
element.style.opacity = "1";
element.style.transform = 'translateY(0px)';
}
})
}
- css
css의 경우 transition을 통해적용해줄 스타일(투명도와 축 위치)의 속도를 설정해주면 된다.
.on-screen {
transition: transform 0.7s, opacity 1s;
}
이렇게 간단한 css와 javascript 코드 추가를 통해 조금 더 디자인적으로 향상된 웹사이트 구현이 가능하다.
참 고
https://blueshw.github.io/2019/10/13/show-items-on-scroll/
Posted by Ang
'CSS' 카테고리의 다른 글
[css] 스크롤을 부드럽게 알맞은 위치로 - 'scroll snap' (0) | 2021.09.16 |
---|---|
📜 스크롤바 CSS 적용하기 ( feat. ::-webkit-scrollbar, 프론트앤드 ) (0) | 2021.08.31 |
CSS를 활용한 3가지 스타일의 Loading Screen 구현 💬 - with 애니메이션, React 💙 (0) | 2021.07.17 |