css는 먼저 영역을 계산하고(reflow), 그 영역에 따른 스타일을 계산한 뒤(reflect) 후속처리를 합니다.
앞의 두 부분은 cpu가 계산하고, 후속처리는 gpu가 계산하기 때문에 성능이슈를 해결하기 위해서 이 처리를 나누기도 합니다.
animation, transform이나 3D요소들은 나중에 나온 속성들이고, 이들은 gpu로 계산됩니다.
엘리먼트가 변화될 때, 그 변화를 부드럽게 보여주는 효과가 있습니다. 애니메이션 효과라고들 말하지요. keyframe을 쓰지 않고 간단한 표현을 할 때 편리합니다.
단, 기존 엘리먼트의 속성 값과 변화는 값이 수치로 표현 되어 있는 속성이어야 합니다.
예로 기존 엘리먼트의 width가 auto였다면 transition은 적용되지 않습니다.
transition-delay: 0s /* 지연시간 */
transition-duration: 0s /* 실행 시간 */
transition-property: all /* 실행 대상 */
transition-timing-function: ease /* 가속도. 리듬 */
/* property name | duration */
transition: margin-left 4s;
/* property name | duration | delay */
transition: margin-left 4s 1s;
/* property name | duration | timing function | delay */
transition: margin-left 4s ease-in-out 1s;
/* Apply to 2 properties */
transition: margin-left 4s, color 1s;
/* Apply to all changed properties */
transition: all 0.5s ease-out;
축약형에서 유의할 점은 시간이 한 개만 있으면 duration으로 읽히고 그 다음이 delay입니다.
timing-function은 크롬 개발자도구에서 다양하게 만들 수도 있고, 여러가지 속성값도 볼 수 있습니다.
애니메이션은 다수의 스타일을 전환하는 애니메이션을 적용합니다. transition과의 차이는 key-frame을 제공하여 더 세밀한 작업이 가능합니다.
애니메이션의 타임라인을 정하는 것입니다. from(시작)~to(끝)으로 정의할 수도 있고 아래 예시처럼 %로 정의할 수도 있습니다.
세세하게 각 타임마다 그리고 원하는 속성을 그 때 그 때 넣어가며 사용할 수 있어 매우 세밀한 작업이 가능합니다.
@keyframes sample-ani {
0% {
transform: translate(0, 0);
}
50% {
background: red;
transform: translate(300px, 0);
}
100% {
transform: translate(400px, 500px);
}
}
.box {
animation: sample-ani 1s;
}
** 연습하기
변형을 시키는 속성인데 원래 자신의 공간은 지키면서 변형되는 모습이 다른 영역에 영향을 주지도 않습니다.
그야말로 변화에 최적화된 속성입니다.
.box:hover {
transform: scale(2) rotate(45deg);
}
변형의 기준점을 정합니다. 기준점을 기준으로 변형이 시작되겠죠?!
속성은 x축, y축, z축 순입니다.
.box {
transform-origin: 100% 100% 30px;
}
기본적으로 우리의 작업 공간은 2D이므로 3D로 전환을 하기 위해선 다른 장치들이 필요합니다.
3D 영역이 될 곳에 perspective
속성을 주거나 그 요소 자체에 transform: perspective()
를 줍니다.
둘의 차이는 부모 요소에게 준 Perspective는 전체를 중심으로 원근감이 주어져 어느 한 소실점에서 모든 요소가 나오는 것 같은 느낌인데
transform:perspective()는 각 엘리먼크마다 소실점이 있는 느낌으로 원근감을 주어 우리가 볼 때 동일한 모습으로 보입니다.
부모의 3D 속성은 직계 자식까지만 영향이 미치므로 자손까지 영향이 미쳐 한 덩어리로 움직이길 원한다면 transform-style: preserve-3d
속성을 해당 자손의 직계 부모까지 연결해줍니다.
해당 요소의 뒷면이 회전이나 기타 다른 이유로 볼 수 있게 됐을 때 보이게 할 것인지 여부를 묻습니다. 의외로 우리가 뒷면을 볼 일이 잘 없고, 속이 비치는 요소를 만든다고 해도 그 뒷면은 자기만의 다른 모양이지 앞면의 투영된 모습이진 않기 때문에 보통 hidden으로 꺼줍니다. 꺼주면 컴퓨터의 부담도 줄어듭니다.