오늘날의 웹 페이지는 동적인 콘텐츠와 다양한 인터렉션 요소를 포함하고 있으며, 이를 통해 사용자 경험의 중요성도 점차 높아졌다. 이와 같이 사용자 경험을 향상시키기 위한 방법 중에서 css로 페이지 내부의 요소들에 animation속성을 부여하는 방법이 있다. 이번 포스팅에서는 animation속성이 브라우저의 렌더링에 미치는 영향과 이를 최적화하는 방법에 대해서 알아보려고 한다.
그림과 같이 일련의 과정을 거쳐 웹페이지가 브라우저에서 렌더링 된다.
MDN 공식문서에 따르면, animation 속성은 다수의 스타일을 전환하는 애니메이션을 적용할 때, 사용된다고 한다. 따라서, 요소의 스타일이 변경되기 때문에 위의 과정에서 layout단계가 발생하며, 이를 reflow라고 부른다. 따라서, 레이아웃의 재배치가 발생했기 때문에, 자연스럽게 paint가 다시 진행되는 repaint과정이 발생한다.
css animation을 최적화 하는 방법으로는 여러가지 방법이 있으나, 이번 포스팅에서는 그 중에서 will-change
에 대하여 알아보려고 한다.
will-change
속성은 향후에 변경 가능성이 있는 요소의 속성을 브라우저에 알려주는 css 속성이다. 이를 통하여 브라우저는 요소의 렌더링을 미리 최적화하여 더 나은 성능을 얻을 수 있다.
앞서 언급했듯이 더 나은 성능을 얻기 위해 사용되며, 애니메이션의 성능을 향상시킬 수 있고, reflow와 repaint를 방지할 수 있다.
will-change: auto; // default
will-change: scroll-position;
will-change: contents;
will-change: transform; // <custom-ident>
will-change: opacity; // <custom-ident>
will-change: left, top; // <animatable-features>
css 파일에서 적용하려는 요소에 위의 구문을 사용하여 최적화를 할 수 있다.
<custom ident>
<animatable-features>
예를 들어 버튼 태그에 마우스를 올렸을 때, 색상이 blue로 변하는 경우라면 다음과 같이 작성할 수 있다.
// css
button:hover {
will-change: color;
color: blue;
}
이외에도 다양하게 사용할 수 있다.
아래의 몇가지 예시를 더 보자.
#animated-button {
will-change: transform, opacity
}
#animated-button.animation {
transition: transform 0.5s, opacity 0.5s;
transform: scale(2);
opacity: 0;
}
버튼을 클릭 시, transform과 opacity와 관련된 변화가 일어날 수 있음을 브라우저에 알리고, 해당 변화를 설정하여 사용할 수 있다.
#changing-button {
will-change: width, height, transform;
}
#changing-button.change {
width: 200px;
height: 200px;
transform: translateX(100px);
}
여기서도, will-change 속성을 사용하여 브라우저에 너비, 높이 및 transform 속성이 변경될 수 있음을 알리고, 그 아래에 변화되는 내용을 작성하여 사용할 수 있다.