La transición Vue y Animación

La transición Vue y Animación

transición

Vue inserta, actualiza o se elimina cuando el DOM, la aplicación proporciona un número de diferentes formas de efectos de transición.

Vue proporciona componentes del conjunto de paquete incorporados transitorio para la aplicación un efecto de transición a ser envuelto.

sintaxis

<transition name = "nameoftransition">
   <div></div>
</transition>

De hecho, la transición es un efecto de fundido de salida a desvanecerse. Vue mostrar y ocultar los elementos de transición, se proporciona una clase 6 conmutada:

  • v-introduzca: definir en el comienzo del estado de transición. Antes de que el elemento se inserta en efecto, después de la eliminación de la siguiente elemento de bastidor se inserta.

  • v-enter-activo: la definición en el estado de efecto de transición. A lo largo de la aplicación en la etapa de transición, antes de la entrada en vigor de los elementos a ser insertado, eliminado después de la transición / animación es completa. Esta clase puede ser usada para definir la transición en el retardo de tiempo de proceso y la función curva.

  • v-enter-a: versión 2.1.8 y por encima de, la definición de la final de la transición al estado. Después de que el elemento se inserta en la trama siguiente es activa (v-entrar al mismo tiempo se elimina) se retira después de la transición / animación es completa.

  • v-licencia: dejar la definición del principio del estado de transición. Se tiene efecto inmediatamente a la salida de la transición se activa, se elimina la trama siguiente.

  • V-dejar-activa: dejar la definición del efecto de transición de estados. A lo largo de la solicitud de permiso fase de transición, con efecto inmediato a la salida de la transición se activa, se quitó después de la transición / animación es completa. Esta clase puede ser usada para definir el tiempo lejos del proceso de transición, y la función de curva de retardo.

  • V-dejar-a: Versión 2.1.8 y superiores, dejando la definición del fin del estado de transición. Después de salir de la transición se activa la siguiente trama en vigor (se suprime mientras tanto v-licencia), eliminado después de la transición / animación es completa.

Ejemplos
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="./lib/vue-2.4.0.js"></script>
  <!-- 2. 自定义两组样式,来控制 transition 内部的元素实现动画 -->
  <style>
    /* v-enter 【这是一个时间点】 是进入之前,元素的起始状态,此时还没有开始进入 */
    /* v-leave-to 【这是一个时间点】 是动画离开之后,离开的终止状态,此时,元素 动画已经结束了 */
    .v-enter,
    .v-leave-to {
      opacity: 0;
      transform: translateX(150px);
    }
    /* v-enter-active 【入场动画的时间段】 */
    /* v-leave-active 【离场动画的时间段】 */
    .v-enter-active,
    .v-leave-active{
      transition: all 0.8s ease;
    }
    .my-enter,
    .my-leave-to {
      opacity: 0;
      transform: translateY(70px);
    }
    .my-enter-active,
    .my-leave-active{
      transition: all 0.8s ease;
    }
  </style>
</head>
<body>
  <div id="app">
    <input type="button" value="toggle" @click="flag=!flag">
    <!-- 需求: 点击按钮,让 h3 显示,再点击,让 h3 隐藏 -->
    <!-- 1. 使用 transition 元素,把 需要被动画控制的元素,包裹起来 -->
    <!-- transition 元素,是 Vue 官方提供的 -->
    <transition>
      <h3 v-if="flag">这是一个H3</h3>
    </transition>
    <hr>
    <input type="button" value="toggle2" @click="flag2=!flag2">
    <transition name="my">
      <h6 v-if="flag2">这是一个H6</h6>
    </transition>
  </div>
  <script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        flag: false,
        flag2: false
      },
      methods: {}
    });
  </script>
</body>
</html>

Para estas clases fueron cambiados en la transición, si se utiliza un no-name <transition>, el V- es el nombre de prefijo por defecto de estas clases. Si se utiliza el <nombre de la transición = "mi-transición">, será reemplazado entonces el v-entrar por mi transición a entrar.

v-enter-activo v-leave-activo y puede controlar la curva de transición de entrada / salida de las diferentes transiciones.

El uso de bibliotecas de terceros para lograr la animación

Podemos utilizar las bibliotecas de terceros animate.css lograr la animación.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="./lib/vue-2.4.0.js"></script>
  <link rel="stylesheet" href="./lib/animate.css">
  <!-- 入场 bounceIn    离场 bounceOut -->
</head>

<body>
  <div id="app">
    <input type="button" value="toggle" @click="flag=!flag">
    <transition 
    enter-active-class="bounceIn" 
    leave-active-class="bounceOut" 
    :duration="{ enter: 200, leave: 400 }">
      <h3 v-if="flag" class="animated">这是一个H3</h3>
    </transition> 
  </div>
  <script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        flag: false
      },
      methods: {}
    });
  </script>
</body>
</html>

gancho de JavaScript

Se puede declarar gancho de JavaScript en la propiedad:
Código HTML

<transition
  v-on:before-enter="beforeEnter"
  v-on:enter="enter"
  v-on:after-enter="afterEnter"
  v-on:enter-cancelled="enterCancelled"
 
  v-on:before-leave="beforeLeave"
  v-on:leave="leave"
  v-on:after-leave="afterLeave"
  v-on:leave-cancelled="leaveCancelled"
>
</transition>

código JavaScript:


// ...
methods: {
  // --------
  // 进入中
  // --------
 
  beforeEnter: function (el) {
    // ...
  },
  // 此回调函数是可选项的设置
  // 与 CSS 结合时使用
  enter: function (el, done) {
    // ...
    done()
  },
  afterEnter: function (el) {
    // ...
  },
  enterCancelled: function (el) {
    // ...
  },
 
  // --------
  // 离开时
  // --------
 
  beforeLeave: function (el) {
    // ...
  },
  // 此回调函数是可选项的设置
  // 与 CSS 结合时使用
  leave: function (el, done) {
    // ...
    done()
  },
  afterLeave: function (el) {
    // ...
  },
  // leaveCancelled 只用于 v-show 中
  leaveCancelled: function (el) {
    // ...
  }
}

Estas funciones se pueden combinar transiciones gancho CSS / animaciones usan, se pueden usar solos.

Cuando se utiliza única transición JavaScript, hay que hacerlo en el entran y salen de la devolución de llamada . De lo contrario, van a ser llamada sincrónica, la transición se completará inmediatamente.

Recomendado para agregar v-bind utilizando sólo los elementos JavaScript transición: css = "false", Vue omitirá la prueba de CSS. También se evita el impacto del proceso de transición en el CSS.

Ejemplos
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue钩子实例</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.3/velocity.min.js"></script>
</head>
<body>
<div id = "databinding">
<button v-on:click = "show = !show">点我</button>
<transition
    v-on:before-enter="beforeEnter"
    v-on:enter="enter"
    v-on:leave="leave"
    v-bind:css="false"
  >
    <p v-if="show">我的未来不是梦,哈哈哈哈!!!!</p>
</transition>
</div>
<script type = "text/javascript">
new Vue({
  el: '#databinding',
  data: {
    show: false
  },
  methods: {
    beforeEnter: function (el) {
      el.style.opacity = 0
      el.style.transformOrigin = 'left'
    },
    enter: function (el, done) {
      Velocity(el, { opacity: 1, fontSize: '1.4em' }, { duration: 300 })
      Velocity(el, { fontSize: '1em' }, { complete: done })
    },
    leave: function (el, done) {
      Velocity(el, { translateX: '15px', rotateZ: '50deg' }, { duration: 600 })
      Velocity(el, { rotateZ: '100deg' }, { loop: 2 })
      Velocity(el, {
        rotateZ: '45deg',
        translateY: '30px',
        translateX: '30px',
        opacity: 0
      }, { complete: done })
    }
  }
})
</script>
</body>
</html>

La prestación inicial de transición

Por prestar el nodo inicial puede aparecer en el conjunto de características de transición

<transition appear>
  <!-- ... -->
</transition>

Lo normal aquí y entrar / salir de la misma transición, también puede personalizar el nombre de la clase CSS.

<transition
  appear
  appear-class="custom-appear-class"
  appear-to-class="custom-appear-to-class" (2.1.8+)
  appear-active-class="custom-appear-active-class"
>
  <!-- ... -->
</transition>

instancias de lista de Animación

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="./lib/vue-2.4.0.js"></script>
  <style>
    li {
      border: 1px dashed #999;
      margin: 5px;
      line-height: 35px;
      padding-left: 5px;
      font-size: 12px;
      width: 100%;
    }

    li:hover {
      background-color: hotpink;
      transition: all 0.8s ease;
    }



    .v-enter,
    .v-leave-to {
      opacity: 0;
      transform: translateY(80px);
    }

    .v-enter-active,
    .v-leave-active {
      transition: all 0.6s ease;
    }

    /* 下面的 .v-move 和 .v-leave-active 配合使用,能够实现列表后续的元素,渐渐地漂上来的效果 */
    .v-move {
      transition: all 0.6s ease;
    }
    .v-leave-active{
      position: absolute;
    }
  </style>
</head>

<body>
  <div id="app">

    <div>
      <label>
        Id:
        <input type="text" v-model="id">
      </label>

      <label>
        Name:
        <input type="text" v-model="name">
      </label>

      <input type="button" value="添加" @click="add">
    </div>

    <!-- <ul> -->
      <!-- 在实现列表过渡的时候,如果需要过渡的元素,是通过 v-for 循环渲染出来的,不能使用 transition 包裹,需要使用 transitionGroup -->
      <!-- 如果要为 v-for 循环创建的元素设置动画,必须为每一个 元素 设置 :key 属性 -->
      <!-- 给 ransition-group 添加 appear 属性,实现页面刚展示出来时候,入场时候的效果 -->
      <!-- 通过 为 transition-group 元素,设置 tag 属性,指定 transition-group 渲染为指定的元素,如果不指定 tag 属性,默认,渲染为 span 标签 -->
      <transition-group appear tag="ul">
        <li v-for="(item, i) in list" :key="item.id" @click="del(i)">
          {{item.id}} --- {{item.name}}
        </li>
      </transition-group>
    <!-- </ul> -->

  </div>

  <script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        id: '',
        name: '',
        list: [
          { id: 1, name: '赵高' },
          { id: 2, name: '秦桧' },
          { id: 3, name: '严嵩' },
          { id: 4, name: '魏忠贤' }
        ]
      },
      methods: {
        add() {
          this.list.push({ id: this.id, name: this.name })
          this.id = this.name = ''
        },
        del(i) {
          this.list.splice(i, 1)
        }
      }
    });
  </script>
</body>

</html>
Publicado 87 artículos originales · ganado elogios 198 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/low666/article/details/104904185
Recomendado
Clasificación