[CSS] 쿨타임 애니메이션(clip-path: polygon)

ksj0314·2024년 5월 21일

CSS

목록 보기
3/6

게임등에서 흔히 쿨타임 표시 기능으로 쓰이는 위와 같은 애니메이션을 만들어 보겠다.

clip-path: polygon()을 사용할 것이다.

clip-path: polygon()은 영역을 x,y축을 이용해 점을 찍어 도형으로 잘라내는 역할을 한다.

영역에 위와 같이 9가지의 점을 찍어 도형으로 잘라낼것이다.

clip-path: polygon(50% 50%, 50% 0, 100% 0)을 사용하면 위와 같이 삼각형 형태로 자를 수 있다.

clip-path: polygon(50% 50%, 50% 0, 100% 0 100% 50%)을 사용하면 위와 같이 사각형으로 잘린것을 확인할 수 있다.

이를 애니메이션으로 이어주면

자연스럽게 변화하지 않는다.

clip-path: polygon()으로 만든 도형이 점이 3개에서 4개로 변화하였기에 애니메이션 효과가 의도대로 이루어지지 않는것이다.

이를 해결하기 위해 삼각형으로 자를 때에도 점을 4개를 찍어야한다. 3번점에 점을 2개 찍어 세번째 점이 네번째 점으로 이동되는 애니메이션을 넣을 수 있다.

위 사항을 응용하여 아래와 같이 5번, 2번, 3번, 6번, 9번, 8번, 7번, 4번, 1번, 2번의 점을 이어주면 애니메이션이 완성된다.

@keyframes change {
    0% {
        clip-path: polygon(50% 50%, 50% 0, 50% 0, 50% 0, 50% 0, 50% 0, 50% 0, 50% 0, 50% 0, 50% 0);
    } 5% {
        clip-path: polygon(50% 50%, 50% 0, 100% 0, 100% 0,100% 0, 100% 0, 100% 0, 100% 0, 100% 0, 100% 0);
    } 10% {
        clip-path: polygon(50% 50%, 50% 0, 100% 0, 100% 50%, 100% 50%,100% 50%, 100% 50%, 100% 50%, 100% 50%, 100% 50%);
    } 15% {
        clip-path: polygon(50% 50%, 50% 0, 100% 0, 100% 50%,100% 100%, 100% 100%, 100% 100%, 100% 100%, 100% 100%, 100% 100%);
    } 20%{
        clip-path: polygon(50% 50%, 50% 0, 100% 0, 100% 50%,100% 100%, 50% 100%, 50% 100%, 50% 100%, 50% 100%, 50% 100%);
    } 25%{
        clip-path: polygon(50% 50%, 50% 0, 100% 0, 100% 50%,100% 100%, 50% 100%, 0 100%, 0 100%, 0 100%, 0 100%);
    } 30%{
        clip-path: polygon(50% 50%, 50% 0, 100% 0, 100% 50%,100% 100%, 50% 100%, 0 100%, 0 50%, 0 50%, 0 50%);
    } 35%{
        clip-path: polygon(50% 50%, 50% 0, 100% 0, 100% 50%, 100% 100%, 50% 100%, 0 100%, 0 50%, 0 0, 0 0);
    } 40%{
        clip-path: polygon(50% 50%, 50% 0, 100% 0, 100% 50%, 100% 100%, 50% 100%, 0 100%, 0 50%, 0 0, 50% 0);
    } 60%{
        clip-path: polygon(50% 50%, 50% 0, 100% 0, 100% 50%, 100% 100%, 50% 100%, 0 100%, 0 50%, 0 0, 50% 0);
    } 65%{
        clip-path: polygon(50% 50%, 100% 0, 100% 0, 100% 50%, 100% 100%, 50% 100%, 0 100%, 0 50%, 0 0, 50% 0);
    } 70%{
        clip-path: polygon(50% 50%, 100% 50%, 100% 50%, 100% 50%, 100% 100%, 50% 100%, 0 100%, 0 50%, 0 0, 50% 0);
    } 75%{
        clip-path: polygon(50% 50%, 100% 100%, 100% 100%, 100% 100%, 100% 100%, 50% 100%, 0 100%, 0 50%, 0 0, 50% 0);
    } 80%{
        clip-path: polygon(50% 50%, 50% 100%, 50% 100%, 50% 100%, 50% 100%, 50% 100%, 0 100%, 0 50%, 0 0, 50% 0);
    } 85%{
        clip-path: polygon(50% 50%, 0% 100%, 0 100%, 0 100%, 0 100%, 0 100%, 0 100%, 0 50%, 0 0, 50% 0);
    } 90%{
        clip-path: polygon(50% 50%, 0% 50%, 0 50%, 0 50%, 0 50%, 0 50%, 0 50%, 0 50%, 0 0, 50% 0);
    } 95%{
        clip-path: polygon(50% 50%, 0 0, 0 0, 0 0, 0 0, 0 0, 0 0, 0 0, 0 0, 50% 0);
    } 100%{
        clip-path: polygon(50% 50%, 50% 0, 50% 0, 50% 0, 50% 0, 50% 0, 50% 0, 50% 0, 50% 0, 50% 0);
    }
}

0개의 댓글