π λ§μ΄ν¬λ‘ μΈν°λμ
μμ¦ SNSμμ νν λ³Ό μ μλ μΈμ€νκ·Έλ¨μ "μ’μμ", νΈμν°μ κ²½μ° λ¦¬νΈμμ
μ¬μ©μλ€μ΄ μμ λμμΌλ‘ ν΄λΉ κ²μλ¬Όμ νΌλλ°±μ μ£Όλ μ’μ λ°©λ²μ΄λ€.
λ§μ΄ν¬λ‘ μΈν°λμ μ μ¬μ©μλ€μ΄ ννμ΄μ§μμ νλ μμ νλλ€μ
μ΄λ ν λ³νλ₯Ό μ£Όμλμ§λ₯Ό μ¬μ©μ κ²½νμΌλ‘μ¨ λλ μ μκ² ν΄ μ€λ€.
μμ μ΄ νν νΉμ νλμ μμ°μ€λ¬μ΄ UI νΌλλ°±μ μ£Όμ΄
ꡬꡬμ μ ν μ€λͺ μ΄ μμ΄λ μ¬μ©μλ λ³νλ₯Ό μμ차릴 μ μλλ‘ μκ°ννλ©°
μ€λ₯ λ° λ€μ νλλ€μ μ§μν μ μκ² νλ€.
μ λ§μ΄ν¬λ‘ μΈν°λμ μ μ¬μ©ν΄μΌ νλκ°?
λ§μ΄ν¬λ‘ μΈν°λμ μΌλ‘ μ°λ¦¬λ μ¬μ©μμκ²
- μ΄λ ν μΌμ΄ μ§κΈ μΌμ΄λκ³ μλμ§
- λ€μ λͺ©νλ₯Ό μν΄ μ΄λ ν μΌμ μ§νν΄μΌ νλμ§
- κΈ°λ€λ¦Ό λμ νμ΄μ§ μ΄νμ λ°©μ§μμΌμ£Όλ λ±μ κΈ°λ₯μ μ 곡ν μ μμ΅λλ€.
μ΄λ¬ν λ§μ΄ν¬λ‘ μΈν°λμ μ μ¬μ©μμκ² UXμ μΈ κ²½νμ ν₯μν΄ μ¬μ΄νΈλ₯Ό μμ μ μΌλ‘ μ΄μ©ν μ μκ² νλ©°,
μ°λ¦¬ μ¬μ΄νΈμμ μ’μ κ²½νμ μ£Όμ΄ κΈμ μ μΈ μΈμμ κ°μ§ μ μκ² νλ€.
κ·ΈλΌ νμ μμ μμ£Ό λ³Ό μ μμΌλ©°, μ¬μ©ν μ μλ λ§μ΄ν¬λ‘ μΈν°λμ μ λ§λ€μ΄ 보λλ‘ νμ.
πμμ£Ό μ¬μ©νλ λ§μ΄ν¬λ‘ μΈν°λμ μμ
μλ
μλμ κ²½μ° μ¬μ©μκ° μλμ΄ λ°μν¨μ μΈμ§ν μ μκ², μ€μ μ²λΌ μ’ μ νλλ ν¨κ³Όμ
μλμ΄ λ°μν μλ₯Ό νμνμ¬ μ¬μ©μκ° ν΄λΉ μλ μμ΄μ½μ λμ΄ κ° μ μκ² νλ λ°©λ²μ΄ μλ€.
νΉν μλ κ°μμ κ°λ ¬ν μμ λ£μ΄μ μ¬μ©μμ μμ μ κ°μ§κ³ μ¬ μ μκ² νλ κ²μ΄ μ’μ 보μΈλ€.
μν μ½λ(Vue.js)
<template>
<div class="wrapper">
<a :class="alarmEventClass" @click="alarmEvent">
<img src="alarm.svg" />
<span>1</span>
</a>
</div>
</template>
<script>
export default {
data() {
return{
alarmEventClass:'',
}
},
methods: {
alarmEvent() {
console.log(this.alarmEventClass);
if( this.alarmEventClass === 'alarm-shake') {
this.alarmEventClass = '';
} else {
this.alarmEventClass = 'alarm-shake';
}
}
}
}
</script>
<style>
@import url('https://fonts.googleapis.com/css2?family=Staatliches&display=swap');
.wrapper {
padding:50px;
text-align:center;
}
@keyframes alarm-shake {
20%,60% {
transform: rotate(20deg);
}
40%,80% {
transform: rotate(-20deg);
}
100% {
transform: rotate(0deg);
}
}
.alarm-shake {
animation-name: alarm-shake;
animation-duration: .5s;
animation-iteration-count:2;
animation-fill-mode: both;
}
a {
display:block;
position:relative;
width:200px;
height:200px;
margin:0 auto;
}
a img {width:200px;}
@keyframes number-alarm {
0% {
transform: scale(0);
}
50% {
transform: scale(1.1);
}
100% {
transform: scale(1);
}
}
.alarm-shake span {
animation-name: number-alarm;
animation-duration: 1s;
animation-delay: 1s;
animation-fill-mode: both;
}
span {
position:absolute;
top:15px;
right:15px;
display:block;
width:60px;
height:60px;
line-height:60px;
background:#EE6B60;
color:#fff;
border-radius:50px;
font-size:26px;
font-weight:bold;
text-align:center;
font-family: 'Staatliches', cursive;
transform: scale(0);
}
</style>
λ‘λ© ν¨κ³Ό
λμ©λ νμΌμ λ€μ΄λ‘λνκ±°λ, DB μμ , API νΈμΆ λ± μκ°μ΄ μ€λ 걸리λ μμ μ΄ μμ κ²½μ°
μ¬λ°λ λ‘λ© barλ₯Ό μ΄μ©νλ©΄ μ¬μ©μκ° κΈ°λ€λ¦Όμ μΈμ§ν μ μμΌλ©°, μΈν°λ μ ν¨κ³Όλ₯Ό ν΅νμ¬ ν΄λΉ νμ΄μ§ μ΄νμ λ°©μ§ν μ μλ€.
μν μ½λ(Vue.js)
<template>
<div class="wrapper">
<a :class="state + ' button'" @click="submit">
<div class="button-wrap">
<div>SUBMIT</div>
<div class="loading-div">
<span></span>LOADING
</div>
<div class="success-div">
<svg height="24" viewBox="0 0 24 24" width="24">
<path d="M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z"/>
</svg>
SUCCESS
</div>
</div>
</a>
</div>
</template>
<script>
export default {
data() {
return {
state: 'submit',
}
},
methods: {
submit() {
this.state = "loading";
setTimeout(() => {
this.state = "success";
console.log("bbb")
}, 3000);
}
}
}
</script>
<style>
@import url('https://fonts.googleapis.com/css2?family=Staatliches&display=swap');
.wrapper {
padding: 50px;
text-align: center;
}
a.button {
display: block;
position: relative;
width: 200px;
height: 50px;
margin: 0 auto;
font-family: 'Staatliches', cursive;
font-size: 26px;
border-radius: 10px;
color: #fff;
background: #00A178;
font-weight: 400;
letter-spacing: 1px;
overflow: hidden;
cursor: pointer;
transition:all ease-in .5s;
}
.button-wrap {
transition:all ease-in-out .2s;
}
.loading .button-wrap {
transform: translateY(-50px);
}
.loading.button {
background:#22A6C0;
}
.success .button-wrap {
transform: translateY(-100px);
}
.success.button {
background:#4CC290;
}
div.button-wrap div {
height: 50px;
line-height: 50px;
}
@keyframes loading {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.loading-div span {
display: inline-block;
width: 20px;
height: 20px;
border-radius: 50%;
border: 2px solid #CCDACD;
border-top: 3px solid #2C656B;
margin: 0 10px 0 0;
animation: loading 1s ease-in-out infinite;
}
@keyframes success {
0% {
stroke-dashoffset: -50px;
}
70% {
stroke-dashoffset: 0;
transform: scale(1);
}
80% {
transform: scale(1.3);
}
95% {
transform: scale(1);
}
100% {
transform: scale(1);
}
}
.success svg {
fill: transparent;
stroke: #2C656B;
stroke-width: 3px;
stroke-dasharray: 50px;
margin: -5px 2px 0 0;
}
.success .success-div svg {
animation: success 2s ease-in-out;
}
</style>
λ΄κ° μμ±ν κ°λ¨ν μ½λ μΈμλ μ λ¬Έκ°λ€μ΄ λ§λ λ€μν λ§μ΄ν¬λ‘ μΈν°λμ ν¨κ³Όλ€μ
μλ μ¬μ΄νΈμμ μμλ₯Ό λ³Ό μκ° μλ€.
CodeMyUI
Handpicked collection of Web Design & UI Inspiration with Code Snippets. β GIF preview β HTML CSS copy paste code.
codemyui.com