Vue.js에서 요소를 표시하면서 애니메이션
이 「transition」도 매우 편리합니다만,
컴퍼넌트가 표시·비표시가 될 때 이외에도 요소에 애니메이션을 붙이고 싶었으므로,
CSS와 Vue를 사용하여 구현해 보았습니다.
이번은 잘 보이는 회전 목마의 일종으로,
다음 이미지가 보이는 패턴을 만드는 방법을 소개하고 싶습니다.
↓이런 느낌의!
transform, transition-duration을 사용하여 이렇게 쉽게!
움직이고 싶은 요소에
translate와 transition-duration을 지정함으로써 쉽게 애니메이션을 구현할 수 있습니다.
■이쪽의 페이지로부터 움직이는 데모를 확인할 수 있습니다
App.vue
<template>
<div id="app">
<div class="sample">
<div class="sample__wrap">
//スライドさせたい要素のstyleにtransformを指定し、位置が動的に変わるように設定する(${position}pxの部分)
<ul
class="sample__list"
:style="{ transform: `translate(${position}px, 0)` }"
>
<li class="sample__item sample__item--pink">1</li>
<li class="sample__item sample__item--green">2</li>
<li class="sample__item sample__item--orange">3</li>
<li class="sample__item sample__item--blue">4</li>
<li class="sample__item sample__item--yellow">5</li>
<li class="sample__item sample__item--red">6</li>
</ul>
</div>
<div
class="sample__btn sample__btn--prev"
@click="moveContainer('left');"
:class="{ isDisabled: this.rightEnd }"
></div>
<div
class="sample__btn sample__btn--next"
@click="moveContainer('right');"
:class="{ isDisabled: this.leftEnd }"
></div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
itemWidth: 200,
position: 0,
leftEnd: true,
rightEnd: false
};
},
methods: {
moveContainer(turn) {
if (turn === "left") {
if (this.position < -(this.itemWidth * 4)) {
return;
}
this.position = this.position - this.itemWidth;
} else {
if (this.position === 0) {
return;
}
this.position = this.position + this.itemWidth;
}
this.leftEnd = this.position === 0 ? true : false;
this.rightEnd = this.position < -(this.itemWidth * 4) ? true : false;
}
}
};
</script>
<style lang="scss">
.sample {
position: relative;
margin: 100px auto;
width: 300px;
&__wrap {
overflow: hidden;
border: 5px solid #848484;
}
&__list {
//translateの値が変化した時に、
//ここのtransition-durationの指定でアニメーションしながら要素が動く
transition-duration: 0.8s;
margin: 0;
padding: 0;
display: flex;
width: 1200px;
}
&__item {
list-style: none;
width: 200px;
height: 200px;
line-height: 200px;
color: #fff;
font-size: 50px;
font-weight: bold;
text-align: center;
&--pink {
background: #ff69b4;
}
&--green {
background: #3cb371;
}
&--orange {
background: #ffa500;
}
&--blue {
background: #6495ed;
}
&--yellow {
background: #ffd700;
}
&--red {
background: #ff6347;
}
}
&__btn {
position: absolute;
width: 40px;
height: 40px;
background-color: rgba(0, 0, 0, 0.5);
border-radius: 50%;
&:hover {
opacity: 0.8;
}
&:before {
position: absolute;
top: 0;
bottom: 0;
left: 0;
margin: auto;
content: "";
vertical-align: middle;
}
&--prev {
bottom: 80px;
left: -60px;
&:before {
left: 13px;
width: 14px;
height: 14px;
border-bottom: 4px solid #fff;
border-left: 4px solid #fff;
-webkit-transform: rotate(45deg);
transform: rotate(45deg);
}
}
&--next {
bottom: 80px;
right: -60px;
&:before {
left: 9px;
width: 14px;
height: 14px;
border-top: 4px solid #fff;
border-right: 4px solid #fff;
-webkit-transform: rotate(45deg);
transform: rotate(45deg);
}
}
}
}
.isDisabled {
opacity: 0.2;
&:hover {
opacity: 0.2;
}
}
</style>
translate의 값을 동적으로 하는 것으로 유저가 클릭하면, 무엇인가 표시가 바뀌면, 등등 여러가지 응용을 할 수 있습니다.
요약
Vue의 애니메이션으로 검색하면, 「transition」의 기사만이 나오고, 하고 싶은 일을 할 수 없거나 했습니다만,
CSS를 사용하는 것으로 JQuery로 구현하고 있던 것 같은 UI도 구현할 수 있게 됩니다.
(「transition」으로 실장할 수 있는 부분은 「transition」을 사용해야 합니다만)
CSS의 애니메이션도 오이타 충실해 왔으므로, 잘 Vue.js와 함께 사용해 가고 싶네요.
Reference
이 문제에 관하여(Vue.js에서 요소를 표시하면서 애니메이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/aya02/items/21ed1a41fffe450368ee텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)