반응형
니콜라스 강의 보고 따라했다.
코드
const body = document.querySelector('body');
const MIN_DURATION = 10;
function makeSnowflake() {
const snowflake = document.createElement('div');
const delay = Math.random() * 10;
const initialOpacity = Math.random();
const duration = Math.random() * 20 + MIN_DURATION;
snowflake.classList.add('snowflake');
snowflake.style.left = `${Math.round(Math.random() * window.screen.width)}px`;
snowflake.style.animationDelay = `${delay}s`;
snowflake.style.opacity = initialOpacity;
snowflake.style.animation = `fall ${duration}s linear`;
body.appendChild(snowflake);
setTimeout(() => {
//쌓인 눈송이를 제거, html찌꺼기가 쌓이지 않도록 함
body.removeChild(snowflake);
//다시 내려
makeSnowflake();
}, (duration + delay) * 1000);
}
for (let i = 0; i < 100; i++) {
//한번에 떨어지지 않고 한송이 한송이씩 떨어지도록 각 index마다 setTimeout걸어줌
setTimeout(makeSnowflake, 500 * i);
}
* {
padding: 0;
margin: 0;
background: black;
overflow: hidden;
}
.snowflake {
width: 8px;
height: 8px;
border-radius: 50%;
background-color: white;
position: absolute;
top: -8px;
}
@keyframes fall {
from {
}
to {
transform: translateY(100vh);
opacity: 0;
}
}
고찰?이라 하면 될까
위 코드는 vanilaJS고 리액트에서 사용하려고 이리저리 시도해봤는데, 컴포넌트를 만드는것보다
그냥 index.html에서 렌더링해주는게 맞다는 결론을 내렸다. (SSR은 아님, snowflake.js를 통해 눈송이를 만드니까)
왜냐하면 DOM element를 계속 만들고 지우고 하는데 이건 리액트의 가상돔 시스템에 아~주 맞지 않기 때문
그래서 그냥 <div id = 'root'> 형제 엘리먼트로 <div class= 'snowflake'>넣어주었다.
이렇게 되면 리액트의 가상돔은 <div id = 'root'> 안에서 돌고, 눈내리는 배경은 <div class = 'snowflake'>에서 렌더링되므로
서로 독립되어 작동한다.
리액트웹에 적용한 모습
반응형
'개발 > 소소한 실습' 카테고리의 다른 글
벽돌깨기 (0) | 2022.12.27 |
---|---|
그냥 버튼 만들기 (0) | 2022.10.22 |
useToast만들기 (0) | 2022.10.13 |
타입스크립트로 TodoList 만들기, 교훈 : id는 고유할 뿐만 아니라 어디에도 의존되면 안된다. (0) | 2022.02.06 |
vanila JS로 캐러셀 만들기 (0) | 2022.01.30 |