์ฐธ๊ณ ๋ก Vue.js์ ๋ํด์ ์ ๋ชจ๋ฆ ๋๋ค.
์๋ฌด๊ฑฐ๋ ๋ง ํด๋ณด๋ ์ค์ด๊ณ ์ณ์ ์ ๋ณด์ธ์ง ์ ๋ ๋ชจ๋ฆ ๋๋ค!
[ ํ ๋ผ์ ๊ฑฐ๋ถ์ด ๊ฒฝ์ฃผ๊ฒ์ ]
[Vue.js] Vue.js๋ฅผ ์ด์ฉํ์ฌ ๊ฐ๋จํ ํ ๋ผ์ ๊ฑฐ๋ถ์ด ๊ฒฝ์ฃผ๊ฒ์ ๋ง๋ค๊ธฐ.
ํ ๋ผ์ ๊ฑฐ๋ถ์ด๊ฒฝ์ฃผ๊ฒ์์๊ฐ๋จํ๊ฒ ๋ง๋ค์ด๋ณด์. 1. ํ๊ฒฝโก WebStrom: HTML ํธ์ง๊ธฐ๊ฐ ํฌํจ๋ ์๋ฐ์คํฌ๋ฆฝํธ IDE(Intergrated Development Environment)๋ก IntelliJ IDEA ํ๋ซํผ ์์ ๊ตฌ์ถ๋์๊ณ ๋น์ฃผ์ผ ์คํ๋์ค๋ ์ด
post-this.tistory.com
1. ๋์๊ณผ์ ๊ตฌ์ฑ
ํ ๋ผ๋ ์กฐ๊ฑด์ ๊ฐ์ง๋ค. ์ง์๊ฐ ๋์ค๋ฉด ํ ๋ผ์ ํ๋ ์๊ฐ์ด ์งง์์ง๊ณ , ํ์๊ฐ ๋์ค๋ฉด ํ ๋ผ์ ํ๋ ์๊ฐ์ด ๊ธธ์ด์ง๋ค. ๊ฑฐ๋ถ์ด๋ ์กฐ๊ฑด ์์ด ํญ์ ๊ฐ์ ์๋๋ก ๋ฌ๋ฆฐ๋ค.
2. animation๊ณผ transition
animation๊ณผ transition ๋ ๋ค ๋์,ํจ๊ณผ ๋ฑ ์์ง์์ ๋ํ๋ผ ๋ ์ด๋ค. ํ์ง๋ง ์ด๋ฒ ํ๋ก์ ํธ์์ ํ ๋ผ์ ๊ฑฐ๋ถ์ด์ ์์ง์์ transition์ด ์๋ animation์ผ๋ก ๋ํ๋๋ค.
animation์ ์ข ๋ ๋ณต์กํ ์์ง์์ ๋ํ๋ผ ๋ ์ฌ์ฉํ๊ธฐ ์ข๋ค. ๋ฐ๋๋ก transition์ ๋จ์ํ ์์ง์ผ ๋ ์ฌ์ฉํ๊ธฐ ์ข๋ค.
.game-start{
position: absolute;
top: 45%;
left: 80%;
width: 9%;
height: 14%;
transform: rotate(24deg);
background: rgba(192, 240, 248, 0.75);
border: 5px solid white;
border-radius: 100px;
font-size: 1.2rem;
font-weight: bold;
font-family: Danjo-bold-Regular;
text-align: center;
z-index: 15;
cursor: pointer;
transition: width 2s ease, height 2s ease, background 2s ease, transform 2s ease;
}
.game-start:hover{
width: 10%;
height: 15%;
background: rgba(244, 234, 110, 0.63);
transform: rotate(30deg);
}
๋ง์ฐ์ค๋ฅผ ๋ฒํผ ์์ ๋๋ฉด ์์์ด ๋ณํ๋๋ก ํ๋ ๋ถ๋ถ์ transition์ ์ด์ฉํ๋ค. ๋ณดํต transition์ ์์ ์ํ์ ๋ ์ํ๋ง ์ ์ํ๊ธฐ์ ๋จ์ํ ๋ณํ์ ๋ ์ฉ์ดํ๋ค.
@keyframes rabbit-run {
0% {
left: -10%;
}
40% {
left: 50%;
}
60% {
left: 50%;
}
100% {
left: 90%;
}
}
.running-rabbit.run{
animation: rabbit-run 5s linear forwards;
}
ํ์ง๋ง ๋จ๊ณ๋ณ๋ก ์์ง์์ ์ค์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ, @keyframs๋ฅผ ์ฌ์ฉํ ์ ์๋ animation์ด ๋ ํจ์จ์ ์ธ ๋ฏ ํ๋ค. animation์ ์ฝ๋์ forwards๋ฅผ ์ถ๊ฐํ๋ฉด ๋ง์ง๋ง ๋์์ ์ ์ง์ํฌ ์ ์๋ค. transition๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ฑฐ๋ JS๋ฅผ ์ด์ฉํ์ฌ ๋ง์ง๋ง ๋์์ด ์ ์ง๋๋๋ก ๋ง๋ค ์ ์๊ธด ํ์ง๋ง animation๋ณด๋ค ์ข ๋ ๋ณต์กํ ๊ฑธ ๋๋ ์ ์๋ค.
3. animation๊ณผ @keyframs
animation
: ์์์ ์คํ์ผ์ ์๊ฐ์ ๋ฐ๋ผ ๋ณํ์ํค๋ ๊ธฐ๋ฅ์ผ๋ก, ์ฌ๋ฌ ๊ฐ์ ์ค๊ฐ ๋จ๊ณ๋ฅผ ์ค์ ํ์ฌ ์ง์ ํ ์๊ฐ ๋์ ์๋์ผ๋ก ์ฌ์๋๋ค.
@keyframs
: ์ ๋๋ฉ์ด์ ์ ๋จ๊ณ๋ณ ์คํ์ผ ๋ณํ๋ฅผ ์ ์ํ๋ CSS ๊ท์น์ผ๋ก 0%์์ 100%๊น์ง์ ๋น์จ๋ก ์ํ๋ฅผ ์ง์ ํ๋ค.
<style> ์ฝ๋
@keyframes rabbit-run {
0% {
left: -10%;
}
40% {
left: 50%;
}
60% {
left: 50%;
}
100% {
left: 90%;
}
}
<style> ์ฝ๋
ํ ๋ผ ์ด๋ฏธ์ง
.running-rabbit{
position: absolute;
top: 17%;
left: -10px;
width:20%;
z-index: 10;
}
running-rabbit์ ํ ๋ผ ์ด๋ฏธ์ง๋ก ์์ ์ง์ ์ด -10px๊ฐ ๋๋ค. @keyframs์์ ์งํ๋ฅ 0%์ผ ๋ ์ฒ์ ํ ๋ผ ์ด๋ฏธ์ง๋ฅผ ๋ฐฐ์นํ ์์ ์ด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์งํ๋ฅ ์ด 40%๊ฐ ๋๋ฉด ์ผ์ชฝ 50% ์ง์ ๊น์ง ๊ฐ๊ฒ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์งํ๋ฅ 60%์ผ ๋, ์ฌ์ ํ 50% ์ง์ ์ผ๋ก ํ ๋ผ๊ฐ ์ฌ๋ ๊ตฌ๊ฐ์ด ๋๋ค. ๋ง์นจ๋ด ์งํ๋ฅ ์ด 100%๊ฐ ๋๋ฉด ํ ๋ผ๊ฐ ๊ฒฐ์น์ ์ ๋์ฐฉํ๋ค.
๊ทธ๋ผ ์ด ์งํ๋ฅ ์ ๋น ๋ฅด๊ธฐ๋ ํ์ ์ค์ ํ ์๊ฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
<style> ์ฝ๋
.running-rabbit.run{
animation: rabbit-run 5s linear forwards;
}
.running-rabbit.stop {
animation: rabbit-run 7s linear forwards;
}
<template> ์ฝ๋
<img src="../assets/runrabbit.png" alt="๋ฌ๋ฆฌ๋ํ ๋ผ" class="running-rabbit"
:class="{run: rabbitRunning, stop: rabbitStopping}"/>
run์ด๋ฉด ํ ๋ผ๊ฐ ์น๋ฆฌํ๊ณ , stop์ด๋ฉด ํ ๋ผ๊ฐ ์ง๋ค. ๊ทธ๋์ run์ @keyframs๊ฐ 5์ด ๋์ ์งํ๋๊ณ , stop์ @keyframs๊ฐ 7์ด ๋์ ์งํ๋๋ค. ํ ๋ผ๊ฐ ๋ฉ์ถฐ์ ๋จธ๋ฌด๋ฅด๋ ๊ตฌ๊ฐ์ ๋๊ฐ์ด ์กด์ฌํ์ง๋ง, @keyframs๊ฐ ์งํ๋๋ ์๊ฐ ์์ฒด๊ฐ ๋ค๋ฅด๋ stop์ผ ๋ ์ฒ์ฒํ ๋ฌ๋ฆฌ๊ณ ์ข ๋ ์ฌ๋ค๊ฐ ๊ฒฐ์น์ ์ ๋์ฐฉํ๊ฒ ๋๋ค.
<script> ์ฝ๋
import {ref} from "vue";
const currentSeconds = ref(new Date().getSeconds());
ref๋ Vue3์์ ๋ฐ์์ฑ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉํ๋ ํจ์์ด๋ค. ์ฌ๊ธฐ์ ๋ฐ์์ฑ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ฐ ์ดํดํ๋งํผ ์ ์ด๋ณด๋ คํ๋ค. (์ ๋๋ก ์ดํดํ๋์ง ๋ชจ๋ฅด๊ฒ ๋ค) ์์ํ๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด ๊ทธ๋์ ๊ฐ์ ๋ง์ถฐ ์ด๋ค ํ๋ฉด์ ๊ทธ๋ฆด ๊ฒ์ด๋ค. (์๋ก ์ง์์ ๊ฐ์ ๋ฐ์ ํ ๋ผ๊ฐ ์ด๊ธฐ๋ ํ๋ฉด) ๊ทธ๋ฐ๋ฐ ์๋ก์ด ๊ฐ์ด ๋ค์ด์ค๋ฉด ๊ทธ๊ฑฐ์ ๋ง์ถฐ ์๋ก์ด ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ๊ฒ(์ด๋ฒ์๋ ๊ฑฐ๋ถ์ด๊ฐ ์ด๊ธฐ๋ ํ๋ฉด)์ฒ๋ผ ์ด๋ค ์ํฉ์ ๋ฐ๋ผ ํ๋ฉด์ ๋ค์ ๊ทธ๋ฆฌ๋๊ฒ ๋ฐ์์ฑ ๋ฐ์ดํฐ์ธ ๋ฏ ํ๋ค. ์๋ ๊ณต์๋ฌธ์ ์ค๋ช ์ ์ ์ด๋๊ฒ ๋ค.
ref( )๋ Vue๊ฐ ๋ด๋ถ์์ Proxy๋ก ๊ฐ์ธ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ํ๋ฉด์ด ์๋์ผ๋ก ๋ ๋๋ง๋๋๋ก ํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ const๋ฅผ ๋ฃ์ ์ด์ ๋ currentSeconds์ ๊ฐ์ด ์ฌํ ๋น๋๋ ๊ฑธ ๋ง๊ธฐ ์ํจ์ด๋ค. ํ์ง๋ง ๊ฐ์ธ ํ๋ก์ ํธ๋ผ์ let์ ์จ๋ ์๊ด์ ์์ ๋ฏ ํ๋ค.
์์ํ๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด Date( ).getSeconds๋ก ์ด๋ฅผ ๊ฐ์ ธ์ currendSeconds์ ์ ์ฅํ๋ค. ์ด๋ Date( ) ํฌ๋ฉง์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ง์ํ๋ ๋ฌธ๋ฒ์ด๋ค. const์ let๋ ๊ทธ๋ ๋ค.
ํ๊ฐ์ง ๊ถ๊ธํ ์ ์, ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ค๊ณ ์จ getSeconds๋ฅผ Vue ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ref๋ฅผ ์ฌ์ฉํ ์ด์ ๋ ์๋์ง์ด๋ค. ์ฒ์์vue๋ก ๋ง๋๋ ๋ถ๋ถ์ ์ฐพ์๋ดค๋๋ฐ ref๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ฝ๋๋ค์ด ์์๋ค. ๊ทธ๋์ ์ด๋ฐ ๊ถ๊ธ์ฆ์ด ์๊ฒผ๋ค. - ์ฐพ์๋ ์๋์ค๊ธธ๋ GPT์๊ฒ ๋ฌผ์๋๋, ๋ณํ๋ ๊ฐ์ ํ๋ฉด์ ๋ณด์ฌ์ค๋ ref๋ฅผ ์ฌ์ฉํ๋๊ฑฐ๋ผ๊ณ ํ๋ค.
<script> ์ฝ๋
export default {
name: 'MainView',
data() {
return {
rabbitRunning: false,
rabbitStopping: false,
turtleRunning: false,
}
},
<template> ์ฝ๋
<img src="../assets/runrabbit.png" alt="๋ฌ๋ฆฌ๋ํ ๋ผ" class="running-rabbit"
:class="{run: rabbitRunning, stop: rabbitStopping}"/>
rabbitRunning์ 5์ด ๋์ ์งํ๋์ด ํ ๋ผ๊ฐ ๊ฒฐ์น์ ์ ๋จผ์ ๋์ฐฉํ๋ ์ฝ๋๊ฐ ๋๊ณ , rabbitStopping์ 7์ด ๋์ ์งํ๋์ด ๊ฑฐ๋ถ์ด๊ฐ ๋จผ์ ๋์ฐฉํ๋ ์ฝ๋๊ฐ ๋๋ค. ์ด ๋ฐ์ดํฐ๋ค์ ๋ชจ๋ ์ด๊ธฐ๊ฐ์ด false๋ก ์ค์ ํ๋ค.
<script> ์ฝ๋
methods: {
gameStart() {
const currentSeconds = ref(new Date().getSeconds());
if(currentSeconds.value % 2 === 0) {
this.rabbitRunning = true;
} else {
this.rabbitStopping = true;
}
this.turtleRunning = true;
},
reload() {
window.location.reload();
}
}
<template> ์ฝ๋
<button class="game-start" @click="gameStart"> ์์ </button>
gameStart ๋ฉ์๋๋ ์์ ๋ฒํผ์ด ๋๋ฆฌ๋ฉด ์งํ๋๋ค. ํ์ฌ ์ด๋ฅผ ๋ฐ์์ 2๋ก ๋๋ ๋๋จธ์ง ๊ฐ์ด 0์ด ๋๋ฉด ํ ๋ผ์ ๋ฌ๋ฆฌ๊ธฐ๊ฐ rabbitRunning์ด true๊ฐ ๋์ด ํ ๋ผ๋ 5์ด ๋์ ์์ง์ผ ๊ฒ์ด๋ค. ๊ทธ ์ธ ๋๋จธ์ง ๊ฐ์ rabbitStopping์ด true๊ฐ ๋์ด ํ ๋ผ์ ์์ง์์ด 7์ด ๋์ ์์ง์ผ ๊ฒ์ด๋ค.
๊ฑฐ๋ถ์ด๋ ์์ ๋ฒํผ์ด ๋๋ฆฌ๋ฉด turtleRunning์ด true๊ฐ ๋๋ค.
<style> ์ฝ๋
@keyframes turtle-run {
0% {
left: -10%;
}
100% {
left: 90%;
}
}
.running-turtle{
position: absolute;
bottom: 3.5%;
left: -10px;
width:20%;
z-index: 7;
}
.running-turtle.run {
animation: turtle-run 6s linear forwards;
}
๊ฑฐ๋ถ์ด ์ฝ๋๋ ์์ฃผ ๊ฐ๋จํ๋ค. ์์ ๋ฒํผ์ด ๋๋ฆฌ๋ฉด ์ผ์ ํ ์๋๋ก 6์ด ๋์ -10%๋ถํฐ 90%๊น์ง ์ด์ฌํ ๋ฌ๋ ค๊ฐ๋ฉด ๋๋ค.
์๋์ ์ถ์ฒ๋ฅผ ๋จ๊ฒจ๋๊ฒ ์ต๋๋ค.
๋ธ๋ก๊ทธ์ ์ ๊ฐ ์ต๋ํ ์ดํดํ ๋ด์ฉ๊น์ง๋ง ์ ๋๊ฑฐ๋ผ
์ถ์ฒ์ ๋ค์ด๊ฐ์๋ฉด ๋ ๋ง์ ๋ด์ฉ์ด ์์ด ๊ณต๋ถํ์๋๋ฐ ๋์๋์ค๊ฒ๋๋ค.
๐ชฝ
ํ๋ฆฐ ๋ด์ฉ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์
Vue.js
Vue.js - ํ๋ก๊ทธ๋์๋ธ ์๋ฐ์คํธ๋ฆฝํธ ํ๋ ์์ํฌ
ko.vuejs.org
Vue3 ref, reactive ์ฌ์ฉ๋ฒ
ref Vue.js 3์์ ref๋ ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์ด ์ด์ ๋ฒ์ ์ ref์๋ ์กฐ๊ธ ๋ค๋ฆ ๋๋ค. Vue.js 3์์ ref๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. 1. ๊ฐํธํ ๋ณ์ ์ ์ธ Vue.js 3์์ ref๋ ๋ณ์๋ฅผ ์ ์ธํ๋ ๋ฐ
shan0325.tistory.com
[Vue.js] dayJs ๋ก ๋ ์ง ๋ฐ์ดํฐ ์กฐ์ ๋ฐ Vue.js ๊ฐ๋จ ์์
dayJs ๋ ์ง ๋ฐ์ดํฐ ์กฐ์, Vue.JS ๊ฐ๋จ ์์ dayJs ๋? JavaScript ์์ ์ฌ์ฉํ ์ ์๋ ๋ ์ง, ์๊ฐ ์กฐ์์ ๊ด๋ จ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋ค. Momment.js ์ ๋น์ทํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ํ์ง๋ง ๋ณด๋ค ์ฑ๋ฅ์ด ์ฐ์ํ๊ณ , ํ
lucas-owner.tistory.com
Animated Digital Clock with Vue 3 | Matt Fletcher - Full Stack Developer Based in Hampshire, UK
Back to blog Note: This tutorial is part of my instagram series. See instagram post. In this tutorial you will learn how to create an animated digital clock widget with Vue 3. We will be using the setup script, TypeScript and Tailwind CSS. This component i
mattfletcher.dev
[Vue.js] Datepicker๋ฅผ ์ด์ฉํ ์บ๋ฆฐ๋ ๋ง๋ค๊ธฐ - ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ๋ฐ ์ค๋ ๋ ์ง๋ก ์ค์ ํ๊ธฐ
๋จผ์ datepicker๋ฅผ ๋ค์ด๋ฐ์์ผ ํ๋๋ฐ์ npm install vue3-datepicker ๋ฅผ ํด์ ํจํค์ง๋ฅผ ๋ฐ์์ค๋๋ค. ๋ค์์ ๋ณธ๋ก ์ธ ์ฝ๋๋ก ๋์ด๊ฐ๊ฒ ์ต๋๋ค. ์ ์ฌ์ผ์ ... ์ด๋ ๊ฒ ๋ฅผ ๋ง๋ค์ด ์ค๋๋ค. - ์ํฉ์ ๋ฐ๋ผ ๋ณํ์ ์
jaey0ng.tistory.com
Vue.js
Vue.js - The Progressive JavaScript Framework
vuejs.org
https://sweets1327.tistory.com/63
์๋ฐ์คํฌ๋ฆฝํธ Date()์ ํฌ๋งท ๋ณํ(yyyy-mm-dd)
์ฝ๊ธฐ ์ ๋ถํ์ํ ์ฝ๋๋ ์๋ชป ์์ฑ๋ ๋ด์ฉ์ ๋ํ ์ง์ ์ ์ธ์ ๋ ํ์ํฉ๋๋ค. ๊ณต๋ถํ๋ฉด์ ๋ฐฐ์ด ์ ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ๊ด๋ จ ๋ด์ฉ๋ค์ ํ์ผ๋ก ์ ๋ฆฌํด๋ดค์ต๋๋ค. ํ์ํ์ ๋ถ๋ค์ ๋ค์ด๋ก๋ํ์๋ฉด
sweets1327.tistory.com
'๐ป ํ๋ก์ ํธ > ๐ฐํ ๋ผ์ ๊ฑฐ๋ถ์ด ๊ฒฝ์ฃผ๊ฒ์๐ข' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Vue.js] ์๋ก๊ณ ์นจ ์ฝ๊ฒ ํ๋ ๋ฐฉ๋ฒ, window.location.reload( ) (5) | 2025.08.13 |
---|---|
[Vue.js] Vue.js๋ฅผ ์ด์ฉํ์ฌ ๊ฐ๋จํ ํ ๋ผ์ ๊ฑฐ๋ถ์ด ๊ฒฝ์ฃผ๊ฒ์ ๋ง๋ค๊ธฐ. (7) | 2025.08.11 |