이전 게시글에 이어서 animation.dev의 내용에 대해 적어보려고 한다.
우리가 매일 경험하는 물리를 애니메이션에 반영해야 자연스럽게 보인다. 애니메이션에 놀라지 않고 익숙할때가 잘 만들어진 애니메이션이다.
예를 들면 linear easing curve는 다른 easing에 비해 생동감이 없고, 부자연스럽고 로봇같다. 우리 주변에 거의 모든 것은 정속으로 움직이지 않기 때문이다.
애니메이션에는 목적이 있다.
흔히 하는 실수가 사람들을 기쁘게, 즐겁게 하기 위해 애니메이션을 넣는 것인데 사람들이 애니메이션을 너무 자주 보면 피로를 느끼고 짜증이 날 수 있다.
이 부분은 내가 프론트를 처음 시작할 때 자주 했던 실수같다.
훌륭한 애니메이션은 훌륭한 디자인처럼 규칙이 있다. easing, timing과 같은 요소들이 규칙을 구성한다.
취향은 개인적인 게 아니다. 사람들이 좋아할 애니메이션은 개인적으로 타고나는 게 아니라 배울 수 있다.
이러한 취향(감각) 을 기르면 애니메이션 선구안이 생긴다. 좋은 애니메이션과 좋지 않은 애니메이션을 구별할 수 있으며 자주 사용하는 프리셋(코드, 구현 등)이 생기고 여러 경우의 수를 대비할 수 있다.
예시로 Apple의 dynamic island가 있다. 스프링 효과도 따지고 보면 ease-in-out이다.
Emil은 웬만하면 사용하지 말라고 하지만 탈출 애니메이션으로 사용할 만하다는 의견도 존재한다.
개인적으로는 이렇게 호불호가 갈릴때는 굳이 사용할 필요를 느끼지 못해 사용하지 않을 것 같다.
마키 애니메이션
공장의 컨테이너 벨트처럼 끝없이 흘러가는 애니메이션
때로는 우아할 느낌을 줘서 ease-out 대신 사용하기도 한다.
ex) sonner 등장 애니메이션
지금까지의 애니메이션은 고정된 easing curve와 타이밍으로 이루어져있다.
하지만 자연은 이렇게 고정되어 있지 않기 때문에 spring을 사용하면 더 자연스럽다.
spring = 질량(mass) + 장력(tenstion) + 속력(velocity)
Apple은 지속시간(duration) + 반발력(bounce)으로 spring 애니메이션을 정의하려고 했다.
여기서 말하는 duration은 실제 지속기간이 아니라 체감상 지속기간을 나타낸다
motion(framer motion)을 사용하면 동일한 방식으로 접근이 가능하다.
애니메이션이 끝나지 않았을 때 (애니메이션을 중단하고) 다른 애니메이션을 시작해야 할 수 있다. spring 애니메이션은 자연스럽게 이를 수행한다.
이를 이용해서 spring 애니메이션을 이용해 bounce 효과를 낼 수 있다. 하지만 드래그 종료 시에 효과와 같이 특이한 유즈케이스를 제외하고 필요성은 극히 적다.
css로는 spring 애니메이션 구현이 불가능하다.
linear 이징으로 만드는 것도 근사치를 흉내내는 것에 불과하다.
이를 위해 framer motion(현 motion/react)이나 react-spring을 사용해야 하는데 그러면 번들사이즈가 너무 커질 수 있다. 트레이드 오프를 고려해야 한다.
애니메이션을 잘 사용하면 프로덕트를 예측 가능하고 빠르게 느껴지며 즐거움을 줄 수있다.
잘못 사용하면 반대로 예측 불가능하고 느리고 성가신 느낌을 줄 수 있다.
랜딩 페이지에서 애니메이션을 사용하면 비디오를 사용하는 것 보다 유저의 흥미를 이끌고 제품 이해도를 높일 수 있다.
마케팅이 아니면 사용자에게 빠르다고 인식 시켜야함
ex) 빠르게 회전하는 로딩 스피너는 어플 성능을 빠르다고 인식 시킴
일반적으로 애니메이션은 300ms 내에 이루어져야함
툴팁에는 실수로 인한 호버를 방지하기 위해 애니메이션 딜레이를 설정함
그러나 호버가 활성화된 후에는 다른 툴팁에 호버될 때 지연 시간을 없애면 애니메이션 딜레이를 설정해도 빠르게 느껴짐
Emil은 Vercel 해커톤에서 1s 동안 동작하는 모핑 애니메이션을 만들었음대부분의 내용은 이 게시글에 적혀 있다. 여기에 적히지 않은 몇가지 내용을 적어보겠다.
좋아보이는 애니메이션은 녹화해서 감속해서 프레임 단위로 분석해야 한다. 좋은 애니메이션은 좋게 느끼도록 하는 이유, 규칙이 존재한다. 왜 애니메이션을 좋다고 느꼈는지 파악해라.
@media (hover: hover) and (pointer: fine) {
.card:hover {
transform: scale(1.05);
}
}
원활한 클릭을 보장하기 위해 버튼의 클릭 영역은 48px 이상으로 제공한다.
이때 버튼 클릭 영역을 넓힐 때 보통 padding을 주는 등 레이아웃을 변경시키는데, before을 사용하면 레이아웃 변경 없이 가능하다.
@utility touch-hitbox {
position: relative;
&::before {
content: "";
position: absolute;
display: block;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 100%;
height: 100%;
min-height: 48px;
min-width: 48px;
z-index: 9999;
}
}
<button className="touch-hitbox">
<BellIcon />
</button>
초반까지의 느낌은 아래와 같다.
4개의 이론 모듈 수강 이후 앞의 이론 모듈을 활용한 3~4개의 모듈 실습양으로 따지면 두 강의를 따로 듣는 게 맞긴 한데 두 강의를 같이 수강하며 공통적으로 말하는 부분과 차이나는 부분을 정리하면서 듣고 있어서 이것도 괜찮은 것 같다.
Whimsical Animations은 얼리버드, animation.dev는 기간제 수강 신청을 받아서 추석 보너스로 질러버림..
+강사들이 제공하는 프리셋도 몇 개 있는데 이건 복붙하고 사용해도 될듯하다.