๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒต Vue.js

[Vue.js] transition์„ ์ด์šฉํ•ด์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์†๋„ ๋‚˜ํƒ€๋‚ด๊ธฐ.

by ._.sori 2025. 8. 4.

 

 

 

์ฐธ๊ณ ๋กœ Vue.js์— ๋Œ€ํ•ด์„œ ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

์•„๋ฌด๊ฑฐ๋‚˜ ๋ง‰ ํ•ด๋ณด๋Š” ์ค‘์ด๊ณ  ์˜ณ์€ ์ •๋ณด์ธ์ง€ ์ €๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค!

 

 

 

๋ฒ„ํŠผ์— ๋งˆ์šฐ์Šค๋ฅผ ๋Œ€๋ฉด
์ƒ‰์ด ์ฒœ์ฒœํžˆ ๋ฐ˜์ „๋˜๋„๋ก
๋งŒ๋“ค์–ด๋ณผ ๊ฒƒ์ด๋‹ค.



 

1. ์‹คํ–‰ํ™”๋ฉด

 

 

 

 

 


 

 

 

2. MainView.vue

๋ฒ„ํŠผ์„ ์„ค์ •ํ•˜๊ณ  btn์ด๋ž€ ํด๋ž˜์Šค๋ฅผ ๋ถ™์—ฌ์คฌ๋‹ค.

<template>
  <div class="main-view">
    <button class="btn" > Click </button>
  </div>
</template>

 

์ „์ฒด ํ™”๋ฉด ์„ค์ •์ด๋‹ค.

<style scoped>์˜ ์ฝ”๋“œ

.main-view {
  position: relative;
  width:  100vw;
  height: 100vh;
  background-color: lemonchiffon;
}

 

๋ฒ„ํŠผ์ด ์ค‘์•™์— ์œ„์น˜ํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค. ํ…์ŠคํŠธ ์ปฌ๋Ÿฌ๋Š” ํ™”์ดํŠธ์ด๊ณ , ๋ฐฐ๊ฒฝ์ƒ‰์€ ๋ธ”๋ž™์ด๋‹ค.

<style scoped>์˜ ์ฝ”๋“œ

.btn{
  position: absolute;
  width: 80px;
  height: 50px;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  font-size: 20px;
  color: white;
  background-color: black;
  cursor:  pointer;
  transition: background-color 0.8s ease, border 0.8s ease;
}

 

๋ฐฐ๊ฒฝ์ปฌ๋Ÿฌ๋Š” ์ง„๋ถ„ํ™์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ํ…Œ๋‘๋ฆฌ๋„ border๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ๋˜๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค. ์ด๋•Œ ๋งˆ์šฐ์Šค ์ปค์„œ๋ฅผ ๋Œ€๋ฉด ์ƒ‰์ƒ์ด ๋ณ€ํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ์Šคํƒ€์ผ์„ :hover๋ผ๊ณ  ํ•œ๋‹ค. :hover์— transition์„ ๋„ฃ์–ด ์ƒ‰์ƒ ๋ณ€๊ฒฝ์˜ ์†๋„๋ฅผ ์กฐ์ ˆํ•ด ๋ณผ ๊ฒƒ์ด๋‹ค. transition์€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์†๋„๋ฅผ ์กฐ์ ˆํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

 

transition: [์†์„ฑ] [์ง€์†์‹œ๊ฐ„] [ํƒ€์ด๋ฐ ํ•จ์ˆ˜] [์ง€์—ฐ ์‹œ๊ฐ„];์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ ๋Š”๋ฐ, ์†์„ฑ์œผ๋กœ ๋„ˆ๋น„๋‚˜ ๋†’์ด๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜๋„ ์žˆ๊ณ  ํ…Œ๋‘๋ฆฌ๋งŒ ๋“ค์–ด๊ฐˆ ์ˆ˜๋„ ์žˆ๊ณ  ๋‹ค์–‘ํ•˜๊ฒŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค. ํ˜„์žฌ ์ฝ”๋“œ์—์„œ๋Š” ๋ฐฐ๊ฒฝ์ปฌ๋Ÿฌ(background-color)์™€ ํ…Œ๋‘๋ฆฌ(border)๋ฅผ ์†์„ฑ์œผ๋กœ ์ง€์ •ํ–ˆ๋‹ค. ์ง€์†์‹œ๊ฐ„์€ 0.8s๋กœ ์ง€์ •ํ–ˆ๋‹ค. ํƒ€์ด๋ฐ ํ•จ์ˆ˜๋Š” ์†๋„๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š”๋ฐ, ์ปค์Šคํ„ฐ๋งˆ์ด์ง•๋„ ๊ฐ€๋Šฅํ•ด์„œ ์–ด๋–ค ๊ฐ€์†๋„ ๊ณก์„ ์„ ๋”ฐ๋ฅด๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋‚ด๋ถ€์—์„œ ์„ค์ •ํ•ด ์ฃผ๋Š” ease๋กœ ์„ค์ •ํ–ˆ๋‹ค. ease ๋ง๊ณ  linear, ease-in, ease-out๋„ ์žˆ์œผ๋‹ˆ ํ•œ๋ฒˆ์”ฉ ํ•ด๋ณด๋ฉด ์ข‹์„ ๋“ฏํ•˜๋‹ค. ํ˜„์žฌ ์ฝ”๋“œ์—์„œ ์ง€์—ฐ ์‹œ๊ฐ„์€ ์„ค์ •ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ, ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์ถœ๋ฐœ ์‹œ๊ฐ„์„ ์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 

 

์—ฌ๋Ÿฌ ์†์„ฑ์„ ์ง€์ •ํ•˜๊ณ  ์‹ถ์œผ๋ฉด ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ,์„ ์ฐ์–ด ์†์„ฑ์„ ์ด์–ด ์ ์œผ๋ฉด ๋œ๋‹ค.

 

<style scoped>์˜ ์ฝ”๋“œ

.btn:hover {
  background-color: #ed3597;
  color: white;
  border: 3px solid #ed3597;
  cursor: pointer;
}

 

 

์•„๋ž˜ ๋งํฌ์— ๋“ค์–ด๊ฐ€๋ฉด ์ง์ ‘ ํƒ€์ด๋ฐํ•จ์ˆ˜๋ฅผ ์„ค์ •ํ–ˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์˜ˆ์‹œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

- ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

 

cubic-bezier.com

 

cubic-bezier.com

 

 

์ด๋•Œ ์ฃผ์˜ํ•  ์ ์ด ์žˆ๋‹ค.  ๋‘ ์˜์ƒ์„ ์‚ดํŽด๋ณด์ž.

 

์ฒซ๋ฒˆ์งธ ์˜์ƒ

 

 

๋‘๋ฒˆ์งธ ์˜์ƒ

 

๋‘ ์˜์ƒ์˜ ์ฐจ์ด์ ์€ ๋งˆ์šฐ์Šค๊ฐ€ ๋ฒ„ํŠผ์—์„œ ๋ฉ€์–ด์ง€๋ฉด์„œ ์ƒ๊ธฐ๋Š” ๋ณ€ํ™”์ด๋‹ค. ๊ทธ ์ด์œ ๋Š” transition์ด ์–ด๋А ํด๋ž˜์Šค์— ๋ถ™์–ด์žˆ๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค. .btn ํด๋ž˜์Šค์ธ ๋ฒ„ํŠผ์„ ๋งŒ๋“  ํด๋ž˜์Šค์— transition ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด๋‘๋ฉด ๋งˆ์šฐ์Šค๋ฅผ ๋ฒ„ํŠผ์—์„œ ๋–ผ๋„ ๊ฐ™์€ ์†๋„๋กœ ์ƒ‰์ƒ์ด ๋Œ์•„๊ฐ„๋‹ค. ๊ทธ๋Ÿฐ๋ฐ :hover์— transition ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด๋‘๋ฉด ๋งˆ์šฐ์Šค๋ฅผ ๋—„ ๋• ์ฝ”๋“œ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. (์–‘๋ฐฉํ–ฅ ์ ์šฉ์ด ์•ˆ ๋˜๋Š” ๊ฒƒ)

 

:hover๊ฐ€ ์ปค์„œ๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ์ ์šฉ๋˜๋Š” ํด๋ž˜์Šค๋‹ˆ๊นŒ transition ์ฝ”๋“œ๋ฅผ hover์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.(๋‚ด๊ฐ€ ๊ทธ๋žฌ์Œ..ใ…Žใ…Ž) ๊ทธ๋Ÿฐ๋ฐ :hover๋Š” ์˜ฌ๋ ธ์„ ๋•Œ๋งŒ ์ ์šฉ๋˜๊ฒŒ ํ•˜๋‹ˆ๊นŒ, ๋ฐ˜๋Œ€๋กœ ๋–ผ๋ฉด? ์ ์šฉ์ด ์•ˆ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ผญ transition ์ฝ”๋“œ๋ฅผ .btn ํด๋ž˜์Šค์— ๋„ฃ์–ด์•ผ ํ•œ๋‹ค.

 

 

 

- transition

 

Vue.js

Vue.js - ํ”„๋กœ๊ทธ๋ž˜์‹œ๋ธŒ ์ž๋ฐ”์ŠคํŠธ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ

ko.vuejs.org