이번 프로젝트는 유튜버 '수코딩'님의 무료강의를 토대로 진행했다.
강의를 본지는 좀 된 것 같고, 이번 프로젝트는 그때 기억을 되살려 혼자 해보았다.
핵심 기능
- CSS : animation, @keyframes, nth-child
- JS : Math, for loop
HTML에는 아무런 요소도 추가하지 않았다.
body {
width: 100%;
height : 100vh;
background : linear-gradient(#0C1C3E,#394269);
overflow: hidden;
}
#snow {
background-color: #FFF;
width: 25px;
height: 25px;
opacity: 0;
border-radius: 50%;
animation : snow 3s infinite linear;
}
#snow:nth-of-type(odd) {
animation-delay: 3s;
animation-duration: 7s;
width : 30px;
height : 30px;
color : #eee;
}
#snow:nth-of-type(even) {
animation-delay: 2s;
animation-duration: 4s;
width : 15px;
height : 15px;
}
#snow:nth-of-type(n+3) {
animation-delay: 1s;
width : 20px;
height : 20px;
}
@keyframes snow {
20% {
transform: translate(25px, 20vh) scale(.8);
opacity: 1;
}
40% {
transform: translate(-25px, 40vh) scale(.6);
opacity: .8;
}
60% {
transform: translate(25px, 60vh) scale(.4);
opacity: .6;
}
80% {
transform: translate(-25px, 80vh) scale(.2);
opacity: .4;
}
100% {
transform: translate(25px, 100vh) scale(0);
opacity: .2;
}
}
CSS 코드
@keyframes로 원하는 애니메이션을 만든 후 사용할 선택자에 animation을 이용해 추가해 준다.
animation 기능은 animation-name, animation-delay, animation-duration, animation-iteration-count 등의 많은 속성값을 갖고 있으며, background 기능과 같이 animation에 속성값을 붙여 쓸 수 있다.
위의 코드값을 보면 animation : snow 3s infinite linear;
" snow라는 애니메이션을 || 3초 동안 || 계속해서 || 균등하게 " 보여주세요.라는 뜻이 되겠다.
그다음은 CSS 가상 선택자 중 하나인 nth-child 선택자이다.
위의 코드와 같이 짝수, 홀수, 수식을 통해 임의 값을 지정할 수 있다.
각각의 선택자를 통해 눈이 내리는 효과에 차이를 줘 자연스러움을 더해줬다.
const bodyWidth = document.body.offsetWidth;
function getMargin(a) {
return Math.floor(Math.random() * a);
}
function makeSnow() {
const snow = document.createElement('div');
snow.setAttribute('id','snow');
snow.style.marginLeft = `${getMargin(bodyWidth)}px`;
document.body.appendChild(snow);
}
for(let i = 0; i < 200; i++) {
makeSnow();
}
JS 코드
짧으면서도 어렵지 않은 코드였다.
- makeSnow라는 함수를 통해 하나의 div태그를 생성.
- setAttribute 속성으로 id 값을 할당.
- body 요소의 넓이 값이 최대인 무작위 정수를 뽑아 div 요소의 margin-left값을 주어 위치를 다르게 함.
- 마지막으로 for 반복문을 통해 여러 개의 눈송이를 만듦.
'코딩 리뷰 > [HTML, CSS , JS]' 카테고리의 다른 글
[HTML,CSS] 이미지 스크롤 애니메이션 (2) | 2023.10.24 |
---|---|
[HTML, CSS, JS] scrollIntoView와 scrollBy를 이용한 섹션 이동 (2) | 2023.05.18 |
[HTML, CSS, JS] 요소를 마우스 커서에 따라다니게 하기 (0) | 2023.05.18 |
[HTML, CSS, JS] 유튜브 클론코딩 리뷰 (0) | 2023.04.26 |
[HTML, JS] 멀티 Select 공부 리뷰 (0) | 2023.04.14 |