트랜지션과 애니메이션

버튼에 :hover 색상을 추가하면 작동하지만 변화가 급작스럽습니다. 한 프레임에는 파란색이고 다음 프레임에는 더 어두운데, 그 사이에는 아무것도 없습니다. 작은 페이드만 있어도 전체 페이지가 덜 어색해집니다. 그 페이드가 트랜지션이며, 두 상태 사이의 모션을 설명할 수 있으면 호버 효과, 떠오르는 카드, 무언가가 로딩되는 동안 회전하는 스피너까지 같은 도구가 확대됩니다. 이 장에서는 CSS가 어떻게 움직이는지, 그리고 페이지를 사용하기 어렵게 만들지 않으면서 어떻게 움직일지 배우게 됩니다.
트랜지션
**트랜지션**은 브라우저에게 속성을 이전 값에서 새 값으로 즉시 변경하는 대신 애니메이션하도록 지시합니다. 두 상태, 즉 일반 상태와 호버 상태를 설명하면 트랜지션이 그 사이의 프레임을 채웁니다.
호버 시 색상이 변하는 버튼입니다. 트랜지션 없으면 색상이 점프하고, 있으면 페이드됩니다:
.btn {
background: #3b82f6;
transition: background 0.2s; /* 0.2초 동안 색상을 페이드 */
}
.btn:hover {
background: #1d4ed8; /* 애니메이션할 새로운 상태 */
}transition을 :hover이 아니라 일반 상태에 넣습니다. 이렇게 하면 마우스가 들어올 때와 나갈 때 모두 적용됩니다.
:hover이 아니라 일반 상태에 작성하면 들어올 때와 나갈 때 모두 작동합니다. property와 duration으로 시작하면 이미 작동하는 페이드가 있습니다. 변환
**변환(transform)**은 요소를 주변 요소를 방해하지 않으면서 이동, 크기 조정 또는 회전시킵니다. 이것은 일반적으로 애니메이션하고 싶은 것입니다. 매끄럽게 보이고 이웃을 밀어내지 않기 때문입니다.
계속 사용할 세 가지가 있습니다:
.card:hover {
transform: translateY(-4px); /* 위로 4픽셀 이동 */
}
.icon:hover {
transform: scale(1.1); /* 크기의 110%로 확대 */
}
.arrow.open {
transform: rotate(90deg); /* 시계 방향으로 1/4 회전 */
}translate는 이동하고, scale은 크기 조정하고, rotate는 회전합니다. 이들 중 하나를 트랜지션과 결합하면 떠오르는 카드, 팝하는 아이콘, 또는 스윙 열리는 화살표를 얻습니다.
transform은 이웃을 밀어내지 않으면서 요소를 이동, 크기 조정, 또는 회전합니다. 기억해야 할 세 가지는 translate로 이동, scale로 크기 조정, rotate로 회전입니다. 트랜지션과 결합하면 호버 시 떠오르는 카드나 팝하는 아이콘을 얻습니다. 키프레임 애니메이션
트랜지션은 두 상태 사이에 애니메이션합니다. 두 개 이상이 필요하거나 모션이 반복되어야 하면, **키프레임 애니메이션**을 사용합니다. @keyframes로 단계를 작성한 후 animation 속성으로 요소에 첨부합니다.
로딩 스피너는 고전적인 예입니다: 계속 회전하므로 트랜지션은 할 수 없습니다.
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.spinner {
animation: spin 1s linear infinite; /* spin 실행, 1초 회전, 무한 반복 */
}from은 시작이고 to는 끝입니다. animation 줄은 실행할 키프레임, 한 사이클이 걸리는 시간, 속도 곡선, 그리고 반복 횟수를 말합니다. infinite는 절대 멈추지 않는다는 뜻입니다.
@keyframes에 단계를 작성하고 animation으로 실행합니다. 스피너는 표준 예입니다: 0도에서 from, 360에서 to, infinite로 반복. animation 줄은 어느 키프레임, 얼마나 오래, 곡선, 그리고 몇 번을 설정합니다. 사용자를 존중하는 모션
모든 사람이 화면의 모션을 원하는 것은 아닙니다. 어떤 사람들은 그것이 산만하다고 생각하고, 어떤 사람들에게는 실제로 불편함이나 구역질을 유발할 수 있습니다. 브라우저는 사람들이 시스템 설정에서 모션을 줄여달라고 요청할 수 있도록 하며, CSS는 **prefers-reduced-motion**으로 그 요청을 읽을 수 있습니다.
모션이 모션을 줄이도록 요청하지 않은 사람들을 위해서만 실행되도록 애니메이션을 확인으로 래핑합니다:
@media (prefers-reduced-motion: no-preference) {
.card {
transition: transform 0.2s;
}
}사용자를 존중하는 것의 다른 절반은 절제입니다: 모션을 짧고, 미묘하고, 호버나 클릭 같은 독자가 한 것과 연결된 것으로 유지합니다. 실제 변화에 주의를 끄는 모션은 도움이 됩니다; 자체 목적을 위한 모션은 빨리 지루해집니다.
prefers-reduced-motion으로 읽으면 모션을 줄이도록 요청하지 않은 사람들을 위해서만 애니메이션을 실행합니다. 당신이 추가하는 모션을 짧고, 미묘하고, 독자가 한 것과 연결되게 유지합니다. 무엇을 애니메이션할지, 그리고 이유
나중에 당신을 괴롭히는 것을 막을 빠른 규칙: 움직임을 애니메이션할 때, width, height, top, margin 같은 속성이 아니라 transform과 opacity를 애니메이션합니다.
/* 매끄러운: 브라우저가 이들을 저렴하게 처리합니다 */
.card:hover {
transform: translateY(-4px);
opacity: 0.9;
}이유는 transform과 opacity가 브라우저가 가장 저렴하게 움직일 수 있는 두 속성이므로, 그들에 기초한 애니메이션이 느린 장치에서도 매끄럽게 유지된다는 것입니다. 크기 또는 위치 속성을 애니메이션하면 브라우저가 매 프레임마다 더 많은 작업을 하도록 강제하며, 모션이 덜거덕거릴 수 있습니다. 당신은 더 깊이 들어가면 완전한 이유를 만날 것이지만, 지금 습관을 구축할 가치가 있습니다.
transform과 opacity를 애니메이션하고, width, height, top, margin 애니메이션을 피합니다. 이 두 가지가 브라우저가 움직이기에 가장 저렴하므로, 모션이 느린 장치에서도 매끄럽게 유지됩니다. 당신은 나중에 완전한 이유를 배울 것이지만, 습관은 지금부터 시작할 가치가 있습니다. 
