[javascript] Vue.js에서의 애니메이션 효과 추가

Vue.js는 선언적인 방식으로 UI를 구성하기 위한 JavaScript 프레임워크입니다. Vue.js를 사용하면 컴포넌트 간의 데이터 흐름을 쉽게 관리하고, 동적인 UI를 만들 수 있습니다. 이뿐만 아니라 Vue.js는 애니메이션과 관련된 기능을 제공하여 웹 애플리케이션에 경쾌하고 매끄러운 효과를 추가할 수 있습니다.

이번 기사에서는 Vue.js에서 애니메이션 효과를 추가하는 방법에 대해 알아보겠습니다.

1. CSS 트랜지션과 트랜스폼 사용하기

Vue.js에서 애니메이션 효과를 추가하는 가장 기본적인 방법은 CSS 트랜지션과 트랜스폼을 사용하는 것입니다. Vue.js는 요소의 상태 변화에 대한 감지를 할 수 있으며, 이를 활용하여 CSS 클래스를 추가하거나 제거함으로써 애니메이션 효과를 동적으로 적용할 수 있습니다.

아래는 Vue.js의 <transition> 컴포넌트를 사용하여 애니메이션 효과를 추가하는 코드의 예시입니다:

<template>
  <div>
    <transition name="fade">
      <p v-if="show">안녕하세요!</p>
    </transition>
    <button @click="toggleShow">토글</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      show: false
    };
  },
  methods: {
    toggleShow() {
      this.show = !this.show;
    }
  }
};
</script>

<style>
.fade-enter-active, .fade-leave-active {
  transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {
  opacity: 0;
}
</style>

위의 코드에서 <transition> 컴포넌트는 애니메이션 효과를 적용할 요소를 감싸고 있습니다. name 속성을 사용하여 해당 효과의 이름을 지정할 수 있으며, 위의 예시에서는 “fade”라는 이름을 사용했습니다. v-if 디렉티브를 통해 요소의 존재 여부를 동적으로 조절할 수 있으며, 버튼을 클릭할 때마다 toggleShow 메서드가 호출되어 요소가 나타났다 사라지는 효과가 적용됩니다.

CSS에서는 .fade-enter-active, .fade-leave-active, .fade-enter, .fade-leave-to와 같은 클래스를 사용하여 트랜지션과 트랜스폼 효과를 정의합니다. 위의 예시에서는 opacity 속성을 사용하여 투명도를 조절하는 효과를 적용했습니다.

2. Vue 트랜지션 클래스 사용하기

Vue.js는 내장된 트랜지션 클래스를 제공하여 애니메이션 효과를 더욱 손쉽게 추가할 수 있도록 도와줍니다. 이러한 트랜지션 클래스는 CSS와 Vue.js의 상호작용을 간편하게 할 수 있도록 도와줍니다.

아래는 Vue 트랜지션 클래스를 사용하여 애니메이션 효과를 추가하는 예시입니다:

<template>
  <div>
    <transition
      name="custom"
      enter-active-class="animated fadeInDown"
      leave-active-class="animated fadeOutUp"
    >
      <p v-if="show">안녕하세요!</p>
    </transition>
    <button @click="toggleShow">토글</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      show: false
    };
  },
  methods: {
    toggleShow() {
      this.show = !this.show;
    }
  }
};
</script>

<style>
@import url("https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css");
</style>

위의 코드에서 enter-active-classleave-active-class 속성을 사용하여 CSS 애니메이션 라이브러리인 Animate.css의 클래스를 해당 효과에 추가하였습니다.

위의 예시에서는 fadeInDown 애니메이션 효과가 진입할 때 적용되고, fadeOutUp 애니메이션 효과가 퇴장할 때 적용됩니다.

3. Velocity.js와 함께 사용하기

Vue.js는 CSS와 함께 애니메이션 효과를 추가하는 것 외에도, Velocity.js와 같은 자바스크립트 애니메이션 라이브러리와 함께 사용할 수도 있습니다. Velocity.js는 매우 유연하고 다양한 애니메이션 효과를 제공하여 Vue.js와 통합하여 사용할 수 있습니다.

아래는 Vue.js와 Velocity.js를 함께 사용하여 애니메이션 효과를 추가하는 예시입니다:

<template>
  <div>
    <transition
      name="custom"
      :enter-active-class="enterClasses"
      :leave-active-class="leaveClasses"
    >
      <p v-if="show">안녕하세요!</p>
    </transition>
    <button @click="toggleShow">토글</button>
  </div>
</template>

<script>
import Velocity from "velocity-animate";

export default {
  data() {
    return {
      show: false
    };
  },
  computed: {
    enterClasses() {
      return {
        "animated": true,
        "bounceIn": true
      };
    },
    leaveClasses() {
      return {
        "animated": true,
        "bounceOut": true
      };
    }
  },
  methods: {
    toggleShow() {
      this.show = !this.show;
    }
  },
  mounted() {
    Velocity.RegisterEffect("bounceIn", {
      defaultDuration: 1000,
      calls: [
        [{ opacity: [1, 0], translateY: [-30, 0], scale: [1.05, 1] }]
      ]
    });
    
    Velocity.RegisterEffect("bounceOut", {
      defaultDuration: 1000,
      calls: [
        [{ opacity: [0, 1], translateY: [30, 0], scale: [0.95, 1] }]
      ]
    });
  }
};
</script>

<style>
@import url("https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css");
</style>

위의 코드에서는 enter-active-classleave-active-class를 계산된 속성으로 사용하여 Velocity.js의 애니메이션 효과를 적용했습니다. bounceInbounceOut 애니메이션 효과가 요소가 나타나거나 사라질 때 적용되도록 설정하였습니다.

또한, Vue 컴포넌트의 mounted 훅을 사용하여 Velocity.js의 애니메이션 효과를 등록하였습니다. bounceInbounceOut 애니메이션 효과에서는 opacity, translateY, scale 등의 속성을 사용하여 애니메이션을 정의하였습니다.

결론

Vue.js를 사용하면 선언적인 방식으로 애니메이션 효과를 추가할 수 있습니다. CSS 트랜지션과 트랜스폼, Vue 트랜지션 클래스, 그리고 Velocity.js와의 통합을 통해 다양한 애니메이션 효과를 웹 애플리케이션에 추가할 수 있습니다. 애니메이션을 활용하면 더욱 동적인 UI를 만들고 사용자 경험을 향상시킬 수 있습니다.

참고 자료: