vue 2.0 에서 transition 을 사용 하여 애니메이션 효 과 를 실현 하고 소감 을 사용 합 니 다.
14946 단어 vue2.0transition
여기 서 네 가지 실천 사례 를 통 해 css 과도,css 애니메이션,javascript 갈고리,목록 과도 응용 을 체험 하고 학습 할 것 입 니 다.사례 에 대한 지식 은 홈 페이지 문 서 를 스스로 공부 하 세 요.
1.css 과도 C 실천
데모 효과 먼저 보기:
이 사례 는 사실 매우 간단 하 다.하나의 transition 을 통 해 여러 개의 키 요소 의 과도 효 과 를 촉발 할 수 있다.우 리 는 요소 가 대응 하 는 과도 효 과 를 정의 하면 된다.다른 일 은 vue 가 우 리 를 도와 해결 하고 이 를 통 해 다른 멋 진 과도 장면 효 과 를 확대 할 수 있다.먼저 이 간단 한 사례 의 코드 실현 을 살 펴 보 자.
<template>
<div class="app">
<button @click="showMenu" class="btn">{{text}}</button>
<transition name="move">
<div class="menu" v-show="show">
<div class="inner inner-1">1</div>
<div class="inner inner-2">2</div>
<div class="inner inner-3">3</div>
</div>
</transition>
</div>
</template>
<script type="text/ecmascript-6">
export default {
data () {
return {
show: false
};
},
methods: {
showMenu () {
this.show = !this.show;
}
},
computed: {
text () {
return this.show ? ' ' : ' ';
}
}
};
</script>
<style lang="stylus" rel="stylesheet/stylus">
.app
.btn
position: fixed
bottom: 50px
right: 10px
z-index: 10
width: 50px
height: 50px
line-height: 50px
border-radius: 50%
border: none
outline: none
color: #fff
font-size: 18px
background: blue
.menu
position: fixed
bottom: 50px
right: 10px
width: 50px
height: 50px
border-radius: 50%
transition: all .7s ease-in
&.move-enter-active
.inner
transform: translate3d(0, 0, 0)
transition-timing-function: cubic-bezier(0, .57, .44, 1.97)
.inner-1
transition-delay: .1s
.inner-2
transition-delay: .2s
.inner-3
transition-delay: .3s
&.move-enter, &.move-leave-active
.inner
transition-timing-function: ease-in-out
.inner-1
transform: translate3d(0, 60px, 0)
transition-delay: .3s
.inner-2
transform: translate3d(40px, 40px, 0)
transition-delay: .2s
.inner-3
transform: translate3d(60px, 0, 0)
transition-delay: .1s
.inner
display: inline-block
position: absolute
width: 30px
height: 30px
line-height: 30px
border-radius: 50%
background: red
text-align: center
color: #fff
transition: all .4s
.inner-1
top: -50px
left: 10px
.inner-2
left: -30px
top: -30px
.inner-3
left: -50px
top: 10px
</style>
우리 의 코드 는 기본적으로 css 과도 효 과 를 완성 하 는 스타일 을 볼 수 있 습 니 다.과도 효 과 를 촉발 하 는 것 은 하나의 click 사건 을 통 해 간단하게 해결 되 었 습 니 다.vue 는 목표 요소 가 CSS 과도 나 애니메이션 이 있 는 지 자동 으로 냄새 를 맡 고 적당 할 때 CSS 클래스 이름 을 추가/삭제 합 니 다.다음 demo 는 css animation 을 사용 하여 과도 하 는 효 과 를 간단하게 실현 합 니 다.2.css 애니메이션 C 실천
데모 효과 먼저 보기:
이 사례 는 위의 demo 와 차이 가 많 지 않 습 니 다.다른 점 은 과도 효 과 는 css 애니메이션 을 사용 하여 이 루어 진 코드 를 보 는 것 입 니 다.
<template>
<div class="app">
<button @click="showball" class="btn">show</button>
<transition name="move" type="animation">
<div class="ball" v-show="show">
<div class="inner"></div>
</div>
</transition>
</div>
</template>
<script type="text/ecmascript-6">
export default {
data () {
return {
show: false
};
},
methods: {
showball () {
this.show = !this.show;
}
}
};
</script>
<style lang="stylus" rel="stylesheet/stylus">
@keyframes shape-change {
0%, 100% {
border-radius: 50%
background: red
}
50% {
border-radius: 0
background: blue
}
}
@keyframes moveball-in {
0% {
transform: translate3d(300px,-200px,0)
}
50% {
transform: translate3d(100px,-400px,0)
}
100% {
transform: translate3d(0,0,0)
}
}
@keyframes moveball-out {
0% {
transform: translate3d(0,0,0)
}
50% {
transform: translate3d(100px,-400px,0)
}
100% {
transform: translate3d(300px,-200px,0)
}
}
.app
.btn
width: 40px
height: 30px
margin-top: 40px
border: none
outline: none
background: red
color: #fff
.ball
position: absolute
bottom: 20px
left: 20px
width: 50px
height: 50px
transition: all 1s cubic-bezier(.22,-0.86,.97,.58)
&.move-enter-active
opacity: 1
animation: moveball-in 1s
.inner
animation: shape-change 1s
&.move-leave-active
opacity: 0.8
animation: moveball-out 1s
.inner
animation: shape-change 1s
.inner
display: inline-block
width: 30px
height: 30px
border-radius: 50%
background: red
transition: all 1s linear
</style>
css 코드 를 통 해 알 수 있 듯 이 우 리 는 vue 과도 류 명의 로 서로 다른 animation 을 추 가 했 을 뿐이다.홈 페이지 문 서 는 transition 이나 animation 중 하나 만 사용 할 때 vue 는 해당 하 는 유형 을 자동 으로 감청 할 수 있 음 을 명 확 히 설명 하지만 같은 요소 가 두 가지 효 과 를 동시에 사용 할 경우 감청 의 유형 을 명 확 히 지정 해 야 하지만 홈 페이지 에 서 는 구체 적 인 밤 을 제시 하지 않 았 다.사실 이 demo 는 두 가지 유형 을 동시에 사용 하 는 상황 을 간단하게 실현 하여 투명 한 변 화 를 볼 수 있 습 니 다.그러나 animation 에서 transform 을 사 용 했 고 밖에서 도 transform 을 사용 했다 면 요소 가 과도 할 때 애니메이션 효과 가 충돌 하고 효과 가 약간 다 를 수 있 습 니 다.3.JavaScript 갈고리 C 실천
앞의 두 밤 은 모두 들 어가 고 떠 나 는 과도 가 있 지만 일부 장면 이 과도 에 들 어가 기만 하면 끝난다 면 이때 자 바스 크 립 트 갈 고 리 를 CSS transitions/animations 와 결합 하여 실현 할 수 있 고 물론 단독으로 사용 할 수도 있다.데모 보기:
이 매우 낮은 시 뮬 레이 션 포탄 발사 장면 은 작은 공이 포물선 궤적 운동 의 과도 가 있 고 발사 되면 다시 돌아 오지 않 는 다 는 것 을 볼 수 있다.그러면 이 demo 는 자바 스 크 립 트 갈 고 리 를 사용 하여 css 와 결합 하여 이 루어 진 것 이다.다음은 관건 적 인 코드 를 보 자.
<template>
<div class="app">
<div class="gun" @click="launch($event)"></div>
<div class="shells-wrapper">
<transition v-for="shell in shells" name="launch-shell" @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter">
<div class="shell" v-show="shell.show">
<div class="inner"></div>
</div>
</transition>
</div>
<div class="goal"></div>
<!-- -->
<div class="ball-container">
<ul>
<li v-for="(ball,index) in balls" :key="index">
<transition :css="false" name="drop" @before-enter="beforeDrop" @enter="dropping" @after-enter="afterDrop">
<div class="ball" v-show="ball.show">
<div class="inner inner-hook"></div>
</div>
</transition>
</li>
</ul>
</div>
<!-- End-->
</div>
</template>
우선,이 demo 는 하나의 요소 의 과도 이기 때문에 어떤 어린이 신발 들 은 2.0 으로 제공 하 는 transition-group 을 사용 하면 되 지 않 겠 습 니까?그러나 transition-group 은 목록 과도 이다.나의 이 해 는 그 요소 가 서로 관련 되 고 서로 영향 을 미 치 는 것 이다.그러나 이 demo 의 요 소 는 모두 독립 적 이 고 하나의 독립 된 요소 과도 에 불과 하기 때문에 transition 을 사용 하 는 것 이 비교적 합 리 적 이다.그러면 v-for 를 사용 하면 똑 같은 과도 요 소 를 실현 할 수 있다.다음은 자 바스 크 립 트 갈고리 가 이 과 도 를 어떻게 실현 하 는 지 보 겠 습 니 다.
export default {
data () {
return {
shells: [
{
show: false
},
{
show: false
},
{
show: false
}
]
};
},
methods: {
launch (event) {
for (let i = 0; i < this.shells.length; i++) {
let shell = this.shells[i];
if (!shell.show) {
shell.show = true;
shell.target = event.target;
return;
}
}
},
beforeEnter (el) {
let count = this.shells.length;
while (count--) {
let shell = this.shells[count];
if (shell.show) {
let rect = shell.target.getBoundingClientRect();
let left = rect.left - 32;
let top = -(window.innerHeight - rect.top - 15);
el.style.display = '';
el.style.webkitTransform = `translate3d(0,${top}px,0)`;
el.style.transform = `translate3d(0,${top}px,0)`;
let inner = el.getElementsByClassName('inner')[0];
inner.style.webkitTransform = `translate3d(${left}px,0,0)`;
inner.style.transform = `translate3d(${left}px,0,0)`;
}
}
},
enter (el, done) {
/* eslint-disable no-unused-vars */
let refresh = el.offsetHeight;
this.$nextTick(() => {
el.style.webkitTransform = 'translate3d(0,0,0)';
el.style.transform = 'translate3d(0,0,0)';
let inner = el.getElementsByClassName('inner')[0];
inner.style.webkitTransform = 'translate3d(0,0,0)';
inner.style.transform = 'translate3d(0,0,0)';
});
done();
},
afterEnter (el) {
let ball = this.shells[0];
ball.show = false;
el.style.display = 'none';
}
}
};
css 스타일 코드:
.ball-container
.ball
position: absolute
left: 32px
bottom: 22px
z-index: 50
transition: all 0.4s cubic-bezier(0.49, -0.29, 0.75, 0.41)
.inner
width: 16px
height: 16px
border-radius: 50%
background: rgb(0, 160, 220)
transition: all 0.4s linear
과도 요 소 는 vue 의 과도 css 클래스 이름 을 추가 하지 않 아 도 됩 니 다.요소 자체 에 transition 을 추가 하면 됩 니 다.vue 는 이전 css 가 과도 할 때 자동 으로 해당 하 는 클래스 이름 을 추가 하여 과도 효 과 를 완성 할 수 있 습 니 다.그러나 자바 script 갈고리 로 우리 스스로 이 전말 상태의 설정 을 완성 해 야 합 니 다.우리 가 과 도 를 터치 하려 면 beforenter 에서 현재 요소 의 오프셋 위 치 를 가 져 온 다음 에 과도 요소 에 시작 위 치 를 설정 합 니 다.enter 에서 브 라 우 저의 재 그림 을 다시 터치 한 다음 에 다음 프레임 에서 요소 의 끝 위 치 를 다시 설정 해 야 합 니 다.이때 과도 효과 가 발생 합 니 다.과도 가 완 료 된 후에 우 리 는 현재 요 소 를 숨 기 면 됩 니 다.방금 말 한 목록 과 도 는 transition-group 을 사용 하 는 작은 demo 입 니 다.4.transition-group C 실천
데모 효과 먼저 보기:
사실은 간단 한 todo lists 의 작은 demo 입 니 다.그 중의 한 요소 가 과도 할 때 다른 요소 의 과도 에 영향 을 줄 수 있 습 니 다.물론 삭제 단 추 는 그 자체 도 transition 과도 입 니 다.즉,transition-group 에서 transition 을 사용 하여 관련 코드 를 볼 수 있 습 니 다.
<template>
<div class="app">
<button @click="add" class="add-btn">+</button>
<transition-group name="slide" tag="ul" class="list-wrapper">
<li class="list" v-for="(item, index) in lists" v-touch:swipeleft="showBtn.bind(this, index)" v-touch:swiperight="hideBtn.bind(this, index)" :key="item">
<span class="text">{{item.text}}</span>
<transition name="move">
<button class="del-btn" @click="delList(index)" v-show="item.show"> </button>
</transition>
</li>
</transition-group>
</div>
</template>
작은 구덩이 가 있 는 곳 은 홈 페이지 목록 이 넘 어 가 는 밤 을 보 는 것 입 니 다.하나의 배열 입 니 다.요 소 는 모두 숫자 이 고 모든 항목 에 유일한 key 값 을 설정 해 야 합 니 다.그래서 저 는 demo 를 완성 할 때 똑똑 하 게 색인 값 을 key 에 게 전 달 했 습 니 다.결 과 는 항상 틀 렸 습 니 다.나중에 해당 하 는 item 으로 바 꾸 면 정상 입 니 다.이 demo 는 vue-touch 를 사 용 했 습 니 다.github 에 서 는 2.0 버 전 을 지원 하지 않 는 다 고 했 지만 next 분기 가 지원 합 니 다.프로젝트 아래 에 설치 하면 됩 니 다.sudo npm install --save git: //github.com/vuejs/vue-touch.git#next
여기 서 주요 스타일 을 보 세 요.
.list
display: flex
width: 100%
height: 40px
line-height: 40px
margin-bottom: 10px
color: #666
font-size: 14px
background: #eee
transition: all .4s
&.slide-move
transition: transform 1s
&.slide-enter
transform: translate3d(-100%, 0, 0)
&.slide-leave-active
position: absolute
transform: translate3d(-100%, 0, 0)
&:last-child
margin-bottom: 0
.del-btn
flex: 0 0 60px
border: none
outline: none
color: #fff
background: red
transition: all .4s
&.move-enter, &.move-leave-active
transform: translate3d(70px, 0, 0)
.text
flex: 1
padding-left: 20px
포 지 셔 닝 과 도 를 바 꾸 는 duration 이 들 어 가 는 것 과 같다 면-move 를 사용 하지 않 아 도 됩 니 다.여기 서-move 의 과 도 를 설정 하 는 duration 은 요소 가 들 어 가 는 duration 과 달리 속도 가 떨 어 지고 편안 해 보 입 니 다.그리고-leve-active 는 position:absolute 를 설정 해 야 효과 가 있 습 니 다.지금 보면 리스트 과도 도 쉽게 이 루어 진다.ps:vue.js 2.*transition 을 사용 하여 애니메이션 효 과 를 실현 합 니 다.
<transition name="fade">
<div class="detail" v-show="detailShow"></div>
</transition>
<script type="text/ecmascript-6">
export default {
};
</script>
<style lang="stylus" ref="sheetstyle/stylus">
.fade-enter-active, .fade-leave-active
opacity:1
transition: all 1.0s
background:rgba(7,17,27,0.8)
.fade-enter, .fade-leave-active
opacity: 0
background:rgba(7,17,27,0)
</style>
총결산위 에서 말 한 것 은 편집장 이 소개 한 vue 2.0 에서 transition 을 사용 하여 애니메이션 효 과 를 실현 하 는 소감 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
vue2.0 마우스 바인딩 이동 이벤트 - 바인딩class텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.