본문 바로가기
인간은 어떻게 배울까

[HTML/CSS] Transform , Transition, Animation

by 개발하는 아인 2023. 6. 7.

/* 이 포스팅은 '앨리스 동남권 웹개발 온라인 부트캠프' 과정을 공부하면서 정리한 것입니다. */

 

 

 

Transform , Transition, Animation 이 세가지는 모두 웹사이트에 움직임과 관련한 다양한 효과를 주는 CSS 효과로, CSS3에서 새롭게 추가된 신조어.

 

1. Transform

: 오브젝트의 각도를 틀거나 위치를 변경하는 등의 작용을 합니다.

<!DOCTYPE html>
<html>
<head>

  <meta charset="UTF-8">
  <title>CSS Transform</title>
  
  <style>
    .transform {
    	/* 가로 100, 세로 100의 빨간색 도형 */
        width: 100px;
        height: 100px;
        background-color: red;

		/* 도형이 변하는 모습을 확인하기 쉽도록 top과 left에 여백을 줌. */
        margin: 200px 0 0 200px;  // top right bottom left

        transform: rotate(45deg);
        transform: scale(2, 3);
        transform: translate(100px, 200px);
        transform: skew(10deg, 20deg);  /* 마지막 transform 속성만 적용됨 */

        /* 하위버전 브라우저들을 고려하여 prefix 붙이기.
        항상 최신버전 브라우저에서만 돌아가도록 할거라면 없애도 됨. */
        -webkit- transform: skew(10deg, 20deg);
        -moz- transform: skew(10deg, 20deg);
        -ms- transform: skew(10deg, 20deg);

    }
  </style>
  
</head>
<body>

  <div class="transform"></div>

</body>
</html>

 

 

 

 

 

2. Transition

: 변화하는 과정을 보여줌.

 

Transition은 아래의 4가지 속성으로 구성됩니다.

 

- property : 어떤 효과를 나타낼지

- duration : 소요시간

- timing-function : 속도 패턴 (ex. linear -> 일정하게 선형으로)

- delay : 지연시간

 

사용예시입니다.

    .transition {
	transition-property: width;
        transition-duration: 2s;
        transition-timing-function: linear;
        transition-delay: 1s;
    }

 

 

이것을 아래처럼 한줄로 줄여서 표현할 수도 있습니다.

    .transition {
        transition: width 2s linear 1s;
    }

이렇게 쓸 때는, property, duration, timing-function, delay들의 순서는 상관이 없습니다.

    .transition {
        transition: 2s 1s linear width;
    }

이렇게 순서를 뒤섞어도 똑같이 작용합니다.

 

 

다만 주의할 점은

시간 요소인 duration과 delay를 같이 쓰려면 반드시 duration이 먼저 와야 한다는 겁니다.

 

즉 시간요소를 하나만 쓴다면 그것은 무조건 duration이라고 취급하고, 

시간요소를 두개를 썼다면 무조건 앞의 것이 duration이라고 취급한다는 것입니다.

    .transition {
        transition: width 2s linear;
    }

여기서는 시간이 2s 하나밖에 없으므로 duration: 2s 로 적용됩니다. delay는 없는 셈이예요.

 

 

 

 

 

한 가지 더 특이한 사항, transition에는 가상 선택자 :hover가 있습니다.

가상 선택자란, CSS에서 미리 만들어놓은 선택자입니다. 가상선택자에는 다양한 것들이 있지만 '마우스를 올렸을 때'라는 조건을 담고 있는 hover만 살펴봅니다.

<style>

  .transition:hover {
      width: 300px; 
  }

</style>

위 구문은 transition이라는 class를 가지는 태그들은 '(hover)마우스를 올렸을 때' 가로가 300px로 바뀐다 라는 의미입니다.

보통 html내에서 어떤 부분에 마우스를 올렸을 때 모양이나 위치가 스르륵 바뀌는 효과를 내려고 할 때가 대부분이므로 transition은 hover라는 가상 선택자와 자주 붙어다닌다고 생각하면 되겠습니다.

 

 

 

마우스를 올렸을 때 색상이 바뀌게 하고 싶다면

.colorChange {
    transition: color 1s;
}

.colorChange:hover {
    color: #323232;
}

바탕색을 바꾸겠다면

.bgColorChange {
    transition: background-color 1s;
}

.bgColorChange:hover {
    background-color: 323232;
}

 

 

 

 

3. Animation

: 조건에 상관없이 움직이는 효과를 줍니다. (Transition은 마우스 hover했을 때 같은 조건부 애니메이션)

즉, 웹사이트가 열리자마자 효과가 시작됩니다.

 

<!DOCTYPE html>
<html>
<head>

  <meta charset="UTF-8">
  <title>CSS Animation</title>
  
  <style>

    .animation {
        width: 300px;
        height: 300px;
        background-color: pink;

        animation-name: changeWidth;  // 임의로 지어주는 이름입니다.
        
        animation-duration: 3s;  // 소요시간
        animation-timing-function: linear;  // 속도 패턴
        animation-delay: 1s;  // 지연시간
        // transition의 속성들과 비슷합니다.

        animation-iteration-count: 6;  // 반복횟수
        animation-direction: alternate;  // 반복형태-앞뒤에서 번갈아 반복
    }

	// animation 속성에 필수인 키프레임. from(시작 장면)과 to(끝 장면)로 구성.
    @keyframes changeWidth {	// keyframes 다음에 위에서 정해준 animation 이름이 와야 함
        /* from 1회, to 1회로 카운트되어 6회 반복이지만 총 3번만 반복된다. */
        from { width: 300px; }
        to { width: 600px; }
    }
  </style>
  
</head>
<body>

  <div class="animation"></div>

</body>
</html>

주의할 것은 반복횟수로 6을 주더라도 우리가 볼 땐 6번 왕복하는 것이 아니다.

keyframes의 from에서 to로 가는 것이 1회, to에서 다시 from으로 오는 것이 또 1회 이런식으로 차감되어 갔다가 오는데 2회가 차감되므로 왔다갔다 왕복을 3번 하게 된다는 것이다.

 

 

animation도 아래처럼 한 줄로 쓸 수 있다.

.box1 {
    animation: rotation 1500ms linear infinite alternate;
    /* infinite는 무한히 반복하라는 뜻 */
}

1000ms = 1초이므로 1500ms는 1.5초이다.

 

 

 

 

 

그 외

아래처럼 animation과 transform을 혼합해서 사용할 수 있습니다.

.box1 {
    animation: expand 1500ms linear infinite alternate;
}

@keyframes expand {
    from { width: 300px; }
    to { width: 600px; }
}

/* transform과 같이 사용 */
.box2 {
    animation: rotation 1500ms linear infinite alternate;
}

@keyframes rotation {
    from { transform: rotate(-10deg); }
    to { transform: rotate(10deg); }
}

 

 

 

또한 animation도 하위 브라우저에서 호환이 되도록 하는 prefix들을 붙일 수 있다.

아래처럼 오리지널 코드를 복제한 후 붙여준다.

<style>

    .box1 {
        width: 300px;
        height: 300px;
        background-color: red;

        animation: rotation 1500ms linear infinite alternate;
        -webkit-animation: rotation 1500ms linear infinite alternate;
    }

    @keyframes rotation {
        from { transform: rotate(-10deg); }
        to { transform: rotate(10deg); }
    }
    @-webkit-keyframes rotation {
        from { transform: rotate(-10deg); }
        to { transform: rotate(10deg); }
    }
</style>

이렇게 animation과 키프레임, 그 안의 from과 to에도 모두 붙여주어야 한다. 

 

 

 

 

 

 

transition과 transform을 아래처럼 혼합해서 쓰기도 하는데,

.change {
    transition: all 1s;
}

.change:hover {
    transform: scale(1.2);
}

transition부분이 있어야 scale(1.2)가 서서히 커지고 작아지는 모습으로 보여집니다. 물론 transition에서 설정한대로 1초동안. 

 

transition: all 1s; 에서 all은 모든 옵션. 즉 width, height 등등 모든 옵션에 transition을 적용한다는 뜻.

 

만약 transition 부분이 없다면 즉시 커졌다 작아졌다를 계속 반복하느라 깜박깜박거린다.