[CSS] 10. 애니메이션



10. 애니메이션

애니메이션 개요

  • transition 과 비슷하다.
  • A 의 css 를 B의 css로 몇초동안 변경
  • transition 은 user action에 따라 실행 여부 결정
  • 애니메이션을 유저 액션과 상관없이 진행
  • a > b 가 아닌 a > b > c > d 가능


@keyframes

@keyframse slidein {
    from {
        margin-left: 100%;
        width: 300%;
    }

    to {
        marin-left: 0%;
        width: 10%;
    }
}

@keyframse identifier {
    0% { top: 0; left: 0;}
    30% { top: 50px;}
    68%, 72% { left: 50px;}
    100% { top: 100px; left: 100%; }
    // 앞의 %는 시간의 개념
}


<div class="box>
안녕
</div>

.box {
    width: 300px;
    height: 80px;
    background-color: green;
    font-size: 50px;
    color: white;

    animation: my-first-animaiton 5s infinite;

    
}

@keyframes my-first-animaiton {
    from {
        width: 300px;
    }
    to {
        width: 600px;
    }
}

@keyframes my-first-animaiton {
    0% {} // 기본값이므로 안적어도 된다.
    50% {
        width: 600px;
    }
    100% {
        width: 300px;
    }
    // 프레임 많이 만들고 싶으면 그래도 된다.
}
  • transition property 와 비슷한 개념
  • 하나의 속성이 아닌 속성의 묶음


animation-name, animation-duration

  • animation-name : keyframes 지정해주는 것(like property)
  • animation-name : none (default)
  • animation-name : _, - 만 사용 가능, 대소문자 구분, 예약어 사용 금지
  • animation-duration: 애니메이션 한 사이클을 완료하는데 걸리는 시간 (s, ms)
  • 음수 사용 금지


animation-delay, animation-timing-function

<div class="box1">
안녕
</div>
<div class="box2">
안녕
</div>
<div class="box3">
안녕
</div>

.box1 {
    width: 300px;
    height: 80px;
    background-color: green;
    font-size: 50px;
    color: white;

    animation: my-first-animaiton 5s infinite;   
    animation-delay: 0;
}

.box2 {
    width: 300px;
    height: 80px;
    background-color: red;
    font-size: 50px;
    color: white;

    animation: my-first-animaiton 5s infinite; 
    animation-delay: 0.3s;  
}

.box3 {
    width: 300px;
    height: 80px;
    background-color: blue;
    font-size: 50px;
    color: white;

    animation: my-first-animaiton 5s infinite;  
    animation-delay: 0.5s; 
}
@keyframes my-first-animaiton {
    0% {} // 기본값이므로 안적어도 된다.
    50% {
        width: 600px;
    }
    100% {
        width: 300px;
    }
}


  • animation-delay : s, ms 음수 사용 가능
  • 음수일때, -1s 이면 바로 시작되지만 1초 부분부터 시작된다.
  • animation-timing-function : transition 과 동일


animation-iteration-count, animation-direction

<div class="box>
안녕~
</div>

.box {
    width: 100px;
    height: 100px;
    background-color: orage;
    border-radius: 50%; // 원
    animation-name: rotate;
    animation-duration: 3s;
    animation-iteration-count: infinite;
    animation-direction: alternate;

}

@keyframes rotate {
    from {
        transform: rotate(0);
    }
    to {
        trasform: rotate(360deg);
    }
}
  • animation-iteration-count : 반복 횟수
  • <number>: 기본값 1 (한번만 재생)
  • infinite : 무한 반복
  • animation-direction : keyframes 재생 순서
  • normal : 정방향 (default)
  • reverse : 역방향
  • alternate : 매 사이클마다 각 주기의 방향을 뒤집음. 처음은 정방향
  • alternate-reverse : 매 사이클마다 각 주기의 방향을 뒤집음. 처음은 역방향


animation-play-state

/// ... 위의 코드

.box:hover {
    animation-play-state: paused;
    // 마우스 올리면 정지
}
  • running (default) : 계속 진행
  • paused : 일시 정지


animation-fill-mode

<div class="box>
안녕~
</div>

div {
    width: 100px;
    height: 100px;
    border: 10px solid green;
}

.box {
    background-color: red;
    animation: fill-mode 3s linear 1s;
    animation-fill-mode: forwards; // red로 끝남
    animation-fill-mode: backwards; // black에서 시작
    animation-fill-mode: both; // black에서 시작해서 red 로 끝남


}

@keyframes fill-mode {
    0% {
        backgrouond-color: black;
    }
    50% {
        width: 200px;
    }
    100% {
        background-color: red;
    }
}

1. 기존 스타일
2. keyframes 첫번째 // backwards 여기서 시작됨
3. ing
4. keyfrmaes 마지막 // forwards 여기서 끝남
5. 기존 스타일
  • 애니메이션의 실행 전과 후에 스타일을 적용하는 방법
  • none (default) : 애니메이션 재생 전 keyframes 의 속성들은 적용되지 말고 본인 것만 적용해라
  • forwards : 애니메이션 끝났을 때 마지막 keyframes 속성 유지해라
  • backwards : 애니메이션 시작 전에 keyframes 미리 갖고 적용해놔라
  • both : forwards + backwards


animation (shorthand)

  • 작성하지 않으면 initial 값으로 적용된다.
  • 순서 상관 없다.
  • 시간 2개면 duration > delay
  • 마지막은 keyframes 이름
  • animation: 3s linear 1s infinite alternate slidein;


나의 회고 🤫

애니메이션까지 배우니 동적으로 css를 꾸미는 방법을 모두 알게 되었다.!!
css 로 드라마틱한 효과를 주고 싶을 때 transform, transition, 애니메이션을 조합해서 사용하면 외관상 화려한 웹페이지를 만들 수 있을 것 같다.
다음에 시간이 된다면 이 작업을 많이 녹여낼 수 있는 간단한 토이 프로젝트를 만들어봐야겠다.