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 을 사용 하여 애니메이션 효 과 를 실현 하 는 소감 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기