트랜지션은 CSS 스타일 변경을 부드럽게 표현하기 위해 duration(지속시간)을 부여하여 속도를 조절한다. 예를 들어 요소에 마우스를 올렸을때, 스타일이 변화가 즉각 반영되는 대신, 자연스럽게 전환되도록 만들고 싶을때 사용한다
Transition 속성
| 속성 | 설명 |
|---|---|
| transition | 모든 transition 속성을 이용한 스타일을 한줄에 설정 |
| transition-property | 요소에 추가할 전환 효과를 설정 |
| transition-duration | 전환 효과가 지속될 시간을 설정 |
| transition-timing-function | 전환 효과의 시간당 속도를 설정함 |
| transition-delay | 전환 효과가 나타나기 전까지의 지연시간을 설정 |
transition-property
트랜지션의 대상이 되는 CSS 프로퍼티명을 지정한다. 지정하지 않은 경우 모든 프로퍼티가 트랜지션의 대상이 된다
<body>
<div></div>
</body>
<style>
div {
width: 100px;
height: 50px;
background-color: red;
margin-bottom: 10px;
/* 어떤 CSS 프로퍼티를 transition할지 지정 */
transition-property: width, background-color;
transition-duration: 2s, 2s;
}
div:hover{
width: 300px;
background-color: blue;
}
</style>
주의해야 할 사항은 모든 CSS 프로퍼티가 트랜지션의 대상이 될 수 없다는 것이다. 예를 들어 width font-size background-color 등은 하나의 범주안에서 크기나 색상의 값이 변화가 가능하지만 display 프로퍼티는 그렇지 않다
따라서 트랜지션의 대상이 될 수 있는 CSS 프로퍼티는 다음과 같다
[Box model]
[Background]
[좌표]
[텍스트]
[기타]
transition-duration
트랜지션에 일어나는 지속시간을 초단위 또는 밀리 초단위로 지정한다. 프로퍼티값을 지정하지 않을 경우 기본값 0s가 적용되어 어떠한 트랜지션 효과도 볼 수 없다
transition-duration 프로퍼티값은 transition-property 프로퍼티값과 1:1 대응한다
div {
transition-property: width;
transition-duration: 2s;
}
div:hover{
width: 300px;
background-color: blue;
}

div {
transition-property: width, opacity;
transition-duration: 2s, 4s;
}
div:hover{
width: 300px;
opacity: 0.2;
}

위 코드를 다음과 같이 축약 표현으로 나타낼 수 있다
div {
transition: width 2s, opacity 4s;
}
div:hover{
width: 300px;
opacity: 0.2;
}
transition-timing-function
트랜지션 효과의 변화 흐름, 시간에 따른 변화 속도와 같은 일종의 변화의 리듬을 지정한다
대부분의 타이밍 함수는 큐빅 베이지어를 정의하는 네 점에 의해 정의되므로 상응하는 함수의 그래프로 제공해서 명시할 수 있다
transition-timing-function: ease;
transition-timing-function: linear;
transition-timing-function: ease-in;
transition-timing-function: ease-out;
transition-timing-function: ease-in-out;
| 프로퍼티값 | 효과 |
|---|---|
| ease | 기본값. 느리게 시작하여 점점 빨라졌다가 느려지면서 종료한다 |
| linear | 시작부터 종료까지 등속 운동을 한다 |
| ease-in | 느리게 시작한 후 일정한 속도에 다다르면 그 상태로 등속 운동한다 |
| ease-out | 일정한 속도의 등속으로 시작해서 점점 느려지면서 종료한다 |
| ease-in-out | ease와 비슷하게 느리게 시작하여 느려지면서 종료한다 |
transition-delay
트랜지션 발동 대시 시간. 시간을 초단위 또는 밀리 초 단위로 지정한다
프로퍼티의 값이 변화하여도 즉시 트랜지션이 실행되지 않고, 일정 시간 대기 한 후 트랜지션이 실행되도록 한다
transition-delay : 3s;
transition
모든 트랜지션 프로퍼티를 한번에 지정할 수 있는 shorthand이다. 값을 지정하지 않은 프로퍼티에는 기본값이 지정된다
단, transition-duration은 반드시 지정해야 한다. 지정하지 않은 경우 기본값 0이 세팅되어 어떠한 트랜지션도 실행되지 않는다
transition: property duration function delay
기본값 all 0 ease 0
/* duration */
transition: 1s
/* property duration */
transition: width 1s
/* duration function */
transition: 1s ease-in;
/* duration delay*/
transition: 1s 1s;
/* property duration function delay */
transition: width 1s ease-in 1s;
트랜스폼(Transform)은 요소에 이동, 회전, 확대/축소, 비틀기 효과를 부여해준다. 단, transform 속성은 별도의 애니메이션 없이 즉시 화면에 밤영되므로, 부드러운 전환을 위해서는 transition과 함께 사용해야 한다
2D Transform
기본 x,y 두 좌표로만 요소를 변화시켜 2D적인 변화를 가미할 수 있다
| Transform function | 설명 | 단위 |
|---|---|---|
| translate(x,y) | 요소의 위치를 X축으로 x만큼, Y축으로 y만큼 이동시킨다 | px, %, em 등 |
| translateX(n) | 요소의 위치를 X축으로 x만큼 이동시킨다 | px, %, em 등 |
| translateY(n) | 요소의 위치를 Y축으로 y만큼 이동시킨다 | px, %, em 등 |
| scale(x,y) | 요소의 크기를 X축으로 x배, Y축으로 y배 확대/축소 시킨다 | 0과 양수 |
| scaleX(n) | 요소의 크기를 X축으로 x배 확대/축소 시킨다 | 0과 양수 |
| scaleY(n) | 요소의 크기를 Y축으로 y배 확대/축소 시킨다 | 0과 양수 |
| skew(x-angle,y-angle) | 요소를 X축으로 x 각도만큼, Y축으로로 y 각도만큼 기울인다 | +/- 각도 |
| skewX(x-angle) | 요소를 X축으로 x 각도만큼 기울인다 | +/- 각도 |
| skewY(y-angle) | 요소를 Y축으로 y 각도만큼 기울인다 | +/- 각도 |
| rotate(angle) | 요소를 angle만큼 회전시킨다 | +/- 각도 |
3D Transform
x,y,z 세 좌표를 이용해 요소를 변화시켜 3D적인 변화를 가미할 수 있다
| Transform function | 설명 | 단위 |
|---|---|---|
| translate3d(x,y) | 요소의 위치를 X축으로 x만큼, Y축으로 y만큼,Z축으로 z만큼 이동시킨다 | px, %, em 등 |
| translateX(n) | 요소의 위치를 X축으로 x만큼 이동시킨다 | px, %, em 등 |
| translateY(n) | 요소의 위치를 Y축으로 y만큼 이동시킨다 | px, %, em 등 |
| translateZ(n) | 요소의 위치를 Z축으로 z만큼 이동시킨다 | px, %, em 등 |
| scale3d(x,y) | 요소의 크기를 X축으로 x배, Y축으로 y배, Z축으로 z배 확대/축소 시킨다 | 0과 양수 |
| scaleX(n) | 요소의 크기를 X축으로 x배 확대/축소 시킨다 | 0과 양수 |
| scaleY(n) | 요소의 크기를 Y축으로 y배 확대/축소 시킨다 | 0과 양수 |
| scaleZ(n) | 요소의 크기를 Z축으로 z배 확대/축소 시킨다 | 0과 양수 |
| rotate3d(x,y,z) | 요소를 X축으로 x각도, Y축으로 y각도, Z축으로 z각도 회전시킨다 | +/- 각도 |
| rotateX(x) | 요소를 X축으로 x각도 회전시킨다 | +/- 각도 |
| rotateY(y) | 요소를 Y축으로 y각도 회전시킨다 | +/- 각도 |
| rotateZ(z) | 요소를 Z축으로 z각도 회전시킨다 | +/- 각도 |
3D transform을 사용하는 경우, 부모 요소에 perspective 속성을 설정하면 입체감 있는 시작 효과를 만들 수 있다
transform
하나 이상의 변형 함수를 공백으로 구분해 연속 적용할 수 있으며, 적용 순서에 따라 결과가 달라질 수 있다
<body>
<div class="box translate">translate</div>
<div class="box rotate">rotate</div>
<div class="box scale">scale</div>
<div class="box skew">skew</div>
<div class="box multiple">multiple</div>
<div class="box origin">origin</div>
</body>
<style>
body{
display: grid;
grid-template-columns: repeat(3,1fr);
gap: 30px;
padding: 50px;
font-family: sans-serif;
background: #f9f9f9;
}
.box {
width: 100px;
height: 100px;
background: #4caf50;
color: white;
display: flex;
align-items: center;
justify-content: center;
transition: transform 0.3s ease;
border-radius: 10px;
text-align: center;
}
.box:hover{
cursor: pointer;
}
.translate:hover {
transform: translate(50px,20px);
}
.rotate:hover {
transform: rotate(45deg);
}
.scale:hover {
transform: scale(1.5);
}
.skew:hover {
transform: skew(20deg,10deg);
}
.multiple:hover{
transform: translateX(20px) rotate(30deg) scale(1.2);
}
</style>

transform-origin
요소의 기본 기준점을 설정할때 사용된다. 기본 기준점은 요소의 정중앙이다(50%, 50%)
설정값으로 %, px, top left, bottom right을 사용할 수 있다. 0, 0은 top left / 100% 100%는 bottom right과 같은 값이다.
<body>
<div class="box center">center</div>
<div class="box topleft">topleft</div>
<div class="box buttomright">buttomright</div>
</body>
<style>
body{
display: flex;
gap: 100px;
height: 100vh;
justify-content: center;
font-family: sans-serif;
background: #f9f9f9;
align-items: center;
}
.box {
width: 100px;
height: 100px;
background: #4caf50;
color: white;
display: flex;
align-items: center;
justify-content: center;
transition: transform 0.3s ease;
}
.center:hover{
transform: rotate(45deg);
transform-origin: center center; /* 기본값 */
}
.topleft:hover {
transform: rotate(45deg);
transform-origin: top left;
}
.buttomright:hover {
transform: rotate(45deg);
transform-origin: buttom right;
}
</style>

애니메이션 속성은 말 그대로 html 요소에 애니메이션 효과를 적용시켜준다. 애니메이션을 적용하기 위해선 @keyframes 이라는 특별한 속성이 쓰여진다. 하나의 줄거리(keyframes)를 구성하여 줄거리 내에서 세부 움직임을 시간 흐름 단위로 제어하여 요소의 움직임을 표현한다
transition과 비슷하지만, 비교하여 다른 점은 다음과 같다
Animation 속성
| 프로퍼티 | 설명 | 기본값 |
|---|---|---|
| animation-name | @keyframes 애니메이션 이름을 지정한다 | |
| animation-duration | 한 사이클에 소요되는 시간 단위를 초/밀리초 단위로 지정 | 0s |
| animation-timing-function | 애니메이션 효과를 위한 타이밍 함수를 지정한다 | ease |
| animation-delay | 요소가 로드된 시점과 애니메이션이 실제로 시작하는 사이에 대기하는 시간을 초/밀리초 단위로 지정 | 0s |
| animation-iteration-count | 애니메이션 재생 횟수를 지정한다 | 1 |
| animation-direction | 애니메이션이 종료된 이후 반복될 때 진행하는 방향을 지정한다 | normal |
| animation-fill-mode | 애니메이션 미실행 시 요소 스타일 지정 | |
| animation-play-state | 애니메이션 재생 상태를 지정한다 | running |
| animation | 모든 애니메이션 프로퍼티를 한번에 지정한다 |
@keyframes
CSS 애니메이션과 트랜지션 방식의 주된 차이는 @keyframes rule에 있다. 이 룰을 사용하면 애니메이션의 흐름(sequence) 중의 여러 시점(breakpoint)에서 CSS 프로퍼티값을 지정할 수 있다
@keyframes rule은 시간의 흐름에 따라 애니메이션을 정의한다. 여러개의 키프레임을 정의하거나 애니메이션 중에 특정 CSS 프로퍼티에 값을 지정하는 지점을 정의할 수 있다. from-to 또는 0% ~ 100% 형식으로 정의한다
@keyframes move {
from {
left: 0;
}
to {
left: 300px;
}
}
/* from, to 키워드를 사용하여 애니메이션의 시작과 끝 시점을 정의하였다. 애니메이션의 시작 시점을 의미하는 from 키프레임 내에는 left 프로퍼티에 값 0을, 애니메이션의 끝 시점을 의미하는 to 키프레임 내에는 left 프로퍼티에 값 300px을 지정하였다. 그 결과, 정지 상태에서 오른쪽으로 300px 이동하는 애니메이션이 실행된다. */
@keyframes move {
from {
left: 0;
}
to {
left: 300px;
}
}
div {
position: absolute;
width: 100px;
height: 100px;
background-color: red;
animation-name: move;
animation-duration: 5s;
animation-iteration-count: infinite;
}

from to 키워드 대신 좀 더 상세한 조작을 위해 퍼센티지도 사용할 수 있다
@keyframes move {
0% {left: 0;}
50% {left: 100px;}
100% {left: 300px;}
}
animation-name
이름을 animation-name 프로퍼티값으로 지정하여 사용하고자 하는 @keyframes rule을 선택한다. 하나 이상의 애니메이션 이름을 지정할 수 있다
@keyframes 뒤에 애니메이션을 대표하는 임의의 이름을 부여하여 그것을 어느 요소에 등록할지 정하는 것으로 보면 된다
div {
position: absolute;
width: 100px;
height: 100px;
background-color: red;
animation-name: move, fadeOut, changeColor;
animation-duration: 5s;
animation-iteration-count: infinite;
}
@keyframes move {
from {
left: 0;
}
to {
left: 300px;
}
}
@keyframes fadeOut{
from{
opacity: 1;
}
to {
opacity: 0;
}
}
@keyframes changeColor{
from{
background-color: red;
}
to {
background-color: blue;
}
}

animation-duration
한 싸이클의 애니메이션에 소요되는 시간을 초 단위 또는 밀리 초 단위로 지정한다. animation-duration은 반드시 지정해야 한다. 지정하지 않은 경우 기본값 0s가 셋팅되어 어떠한 애니메이션도 실행되지 않는다
animation-duration: .5s;
animation-duration: 500ms;
animation-timing-function
애니메이션 효과를 위한 수치 함수를 지정한다
animation-delay
애니메이션 실행 대기 시간
animation-delay: 2s
animation-iteration-count
애니메이션 주기의 재생 횟수를 지정한다. 기본값은 1이며 infinite로 무한반복할 수 있다
animation-iteration-count : 3;
animation-direction
애니메이션이 종료된 이후 반복될 때 진행하는 방향을 지정한다
| 프로퍼티값 | 설명 |
|---|---|
| normal | 기본값으로 from(0%)에서 to(100%) 방향으로 진행한다 |
| reverse | to에서 from 방향으로 진행한다 |
| alternate | 홀수번째는 normal, 짝수번째는 reverse로 진행한다 |
| alternate-reverse | 홀수번째는 reverse, 짝수번째는 normal로 진행한다 |
<div></div>
<style>
div {
position: absolute;
width: 100px;
height: 100px;
background: red;
animation: myAnimation 5s infinite;
animation-direction: alternate;
}
@keyframes myAnimation{
0% { background: red; left: 0px; top: 0px;}
25% { background: yellow; left: 200px; top: 0px;}
50% { background: blue; left: 200px; top: 200px;}
75% { background: green; left: 0px; top: 200px;}
100% { background: red; left: 0px; top: 0px;}
}
</style>

animation-fill-mode
애니메이션 미실행 시(대기, 종료) 요소의 스타일 지정한다
| 프로퍼티값 | 상태 | 설명 |
|---|---|---|
| none | 대기 | 시작 프레임에 설정한 스타일을 적용하지 않고 대기 |
| 종료 | 애니메이션 실행전 상태로 요소의 프로퍼티값을 되돌리고 종료 | |
| forwards | 대기 | 시작 프레임에 설정한 스타일을 적용하지 않고 대기 |
| 종료 | 종료 프레임에 설정한 스타일을 적용하고 종료 | |
| backwards | 대기 | 시작 프레임에 설정한 스타일을 적용하지 않고 대기 |
| 종료 | 애니메이션 실행 전 상태로 요소의 프로퍼티값을 되돌리고 종료 | |
| both | 종료 | 시작 프레임에 설정한 스타일을 적용하지 않고 대기 |
| 대기 | 종료 프레임에 설정한 스타일을 적용하고 종료 |
<body>
<h1>animation-fill-mode</h1>
<div class="play">none</div>
<p>대기 : 시작 프레임(from)에 설정한 스타일을 적용하지 않고 대기</p>
<p>종료 : 애니메이션 실행 전 상태로 애니메이션 요소의 프로퍼티값을 되돌리고 종료</p>
<div class="play">forwards</div>
<p>대기 : 시작 프레임(from)에 설정한 스타일을 적용하지 않고 대기
<p>종료 : 종료 프레임(to)에 설정한 스타일을 적용하고 종료
<div class="play">backwards</div>
<p>대기 : 시작 프레임(from)에 설정한 스타일을 적용하고 대기
<p>종료 : 애니메이션 실행 전 상태로 애니메이션 요소의 프로퍼티값을 되돌리고 종료
<div class="play">both</div>
<p>대기 : 시작 프레임(from)에 설정한 스타일을 적용하고 대기한다.
<p>종료 : 종료 프레임(to)에 설정한 스타일을 적용하고 종료한다.
</body>
<style>
div {
position: absolute;
width: 100px;
height: 100px;
background: red;
font: bold 1em/100px san-serif;
text-align: center;
position: relative;
margin-bottom: 10px;
animation: myAnimation 2s linear 2s;
animation-iteration-count: 1;
animation-play-state: running;
}
div.play:nth-of-type(1){
animation-fill-mode: none;
}
div.play:nth-of-type(2){
animation-fill-mode: forwards;
}
div.play:nth-of-type(3){
animation-fill-mode: backwards;
}
div.play:nth-of-type(4){
animation-fill-mode: both;
}
@keyframes myAnimation{
0% { left: 0px; background: yellow;}
100% { left: 200px; background: blue;}
}
</style>

코드를 직접 실행하여 확인해보는 것도 좋다
animation-play-state
애니메이션 재생 상태(재생 또는 중지)를 지정한다. 기본값을 running이다
animation-play-state : paused;
animation-play-state : running;
animation
모든 애니메이션 프로퍼티를 한번에 지정한다. 값을 지정하지 않은 프로퍼티에는 기본값이 지정된다
animation은 animation-name, duration, timing-function, delay, iteration-count, direction, fill-mode, play-state를 순서대로 축약할 수 있다
/*name duration timing-function delay */
animation: myAnimation 2s linear 2s;