vue中的过渡动画

时间: 2019-06-08阅读: 39标签: 动画

前言

记一次vue 组件中使用 transition 和 transition-group 设置过渡动画,总结来说可分为分为 name 版, js 钩子操作类名版, js 钩子操作行内样式版...


template模板结构

  // 单个元素
    <transition name="自定义名字">
      <p v-if="show">hello</p>
    </transition>
  // 列表元素: 注意group的直接子元素是v-for渲染出来的
    <ul class="list">
      <transition-group name="list">
        <li v-for="(item, index) in gameList" :key="item.id">
          <app-horizontal :itemData="item"></app-horizontal>
        </li>
      </transition-group>
    </ul>


name 版,name 为组件中的属性

出现的过程: name-enter(初始态) => name-enter-active(中间态) => name-enter-to(终止态)
消失的过程: name-leave => name-leave-active => name-leave-to

以进场过渡动画为例子

我们可以分别设置 enter 阶段 和 enter-to 阶段的动画
  1.设置进入时需要过渡的属性
  .name-enter
  {
    opacity: 0;
    transform: translateY(30px)
  }
  2.然后在 name-enter-active中设置过渡时间
  .name-enter-active {
    transition: all .3s;
  }
  3.最后在 name-enter-to 中写上终止态属性
    其实终止态的opacity: 1;transform: none; 是默认的,可以不用写
  .name-enter-to {
    opacity: 1;
    transform: translateY(0);
  }
  如果要给列表中的元素设置交错的效果, 元素不多的话可以添加 delay 属性
  .name-enter-active:nth-child(3n+1) {
    transition-delay: 0s;
  }
  .name-enter-active:nth-child(3n+2) {
    transition-delay: .1s;
  }
  .name-enter-active:nth-child(3n+3) {
    transition-delay: .2s;
  }
  离场动画同理...


js 钩子实现过渡动画: 通过操作类名; 就是 name 版的 js 实现

// 例如实现上述列表依次显示
  <ul class="list">
    <transition-group
      v-bind:css="false"
      v-on:before-enter="beforeEnter"
      v-on:enter="enter"
      v-on:after-enter="afterEnter">
      <li v-for="(item, index) in gameList" 
        :key="item.id" 
        :data-delay="index*100" 
      >
          <app-horizontal :itemData="item"></app-horizontal>
      </li>
    </transition-group>
  </ul>  
  // 
  methods: {
    // 事先定义上述类名
    // 在beforeEnter enter afterEnter 钩子中手动操作上述类名
    
    // 初始态
    beforeEnter(dom) {
      dom.classList.add('list-enter', 'list-enter-active');
    },
    // 中间态
    enter(dom,done) {
      // 通过 setTimeout + dataset 实现过渡
      let delay = dom.dataset.delay;
      setTimeout(function () {
        dom.classList.remove('list-enter');
        dom.classList.add('list-enter-to');
        //监听 transitionend 事件
        var transitionend = window.ontransitionend ? "transitionend" : "webkitTransitionEnd";
        dom.addEventListener(transitionend, function onEnd() {
          // 移除事件
          dom.removeEventListener(transitionend, onEnd);
          //调用done(),表示动画已完成
          done()
        });
      }, delay)
    },
    // 终止态
    afterEnter(dom) {
      dom.classList.remove('list-enter-to', 'list-enter-active');
    }
  }


js 钩子过渡动画: 通过操作行内属性, 自定义动画

   <ul class="list">
    <transition-group
      v-bind:css="false"
      v-on:before-enter="beforeEnter"
      v-on:enter="enter"
      v-on:after-enter="afterEnter">
      <li v-for="(item, index) in gameList" 
        :key="item.id" 
        :data-delay="index*100"
        data-y = "100%" 
      >
          <app-horizontal :itemData="item"></app-horizontal>
      </li>
    </transition-group>
  </ul>  
  // 对应的操作方法; 添加自定义的 dataset,给dom设置css样式;根据需求添加
   methods: {
     // 初始态
    beforeEnter(dom) {
      let { x = 0, y = 0, opacity = 0 } = dom.dataset;
      dom.style.cssText = `transition: .3s;opacity: ${opacity};transform: translateX(${x}) translateY(${y});`;
    },
    // 中间态
    enter(dom,done) {
      let delay = dom.dataset.delay;
      setTimeout(function () {
        dom.style.cssText = `transition: .3s;opacity: 1;transform: translateX(0) translateY(0);`;
        //监听 transitionend 事件
        var transitionend = window.ontransitionend ? "transitionend" : "webkitTransitionEnd";
        dom.addEventListener(transitionend, function onEnd() {
             dom.removeEventListener(transitionend, onEnd);
             done(); 
        });
      }, delay)
    },
    // 终止态
    afterEnter(dom) {
      dom.style.cssText = "";
    }
  }

这里记录一下监听css3的animation动画和transition事件:

webkit-animation动画有三个事件:
    开始事件: webkitAnimationStart
    结束事件: webkitAnimationEnd
    重复运动事件: webkitAnimationIteration

css3的过渡属性transition: 一个事件
    过渡结束: webkitTransitionEnd


CSS动画@keyframes的用法

CSS动画允许大多数HTML元素的动画,而无需使用JavaScript或Flash!IE10+支持该属性的。其他低浏览器版本数字后跟-ms-, -webkit-,-moz-或-o-指定使用前缀的第一个版本。

12款优秀的 jQuery 动画库

Textillate.js 是一个简单的 CSS3 文本动画插件。结合了一些非常棒的库,把 CSS3 动画轻松应用到任何文本;Lazy Line Painter 这款 jQuery 插件使用 Raphaël 库来创建路径动画 CSS3

值得你收藏的10个CSS3动画工具

在CSS3中引入了全新的动画语法,它能够帮助你在设计中实现许多有趣的事情。通常构建炫酷的动画是非常复杂和费时的,而使用动画库和生成器则可以帮助你完美处理这一切

设计师10大必备HTML动画工具

HTML 5已经成为Web开发者当中最流行的语言之一,“健壮的”语言有很大的生产优质万维网内容的能力。HTML 5在近三年的增长迅猛,新引入HTML 5的技术更加的优秀。HTML 5技术被现代浏览器所支持

css3 动画的暂停和重新开始

CSS3的animation直接提供一个 animation-play-state 属性规定动画正在运行还是暂停 。写动画样式的时候特别注意下不同浏览器的兼容性,加上对应的前缀 :

CSS 动画分类

CSS 动画主要分为CSS 动画分类和CSS 常用动画库简介与JS 动画;然后CSS 动画分类又分为过渡动画transition和关键帧动画keyframes,keyframes主要是从keyframes规则和keyframes属性来介绍

CSS3动画总结

常用特效/变换(transform)scale(2D缩放) rotate(2D旋转) translate(2D位移)skew(2D倾斜);keyframes这个属性用来定义一系列关键帧

Transform(CSS动态属性的开始)

transform 属性向元素应用 2D 或 3D 转换;该属性允许我们对元素进行旋转、缩放、移动或倾斜。这两点是Transform的概念和应用场景,重点在于2D和3D的转换,那么呢?

CSS3实现简易牛顿摆动画

最近在练习CSS3的关键帧动画(keyframes),于是做了一个简单的牛顿摆(听名字可能陌生,但你一定见过它),实现起来并不复杂,只需对最左和最右的小球进行关键帧动画处理,同时注意应该将绳子与小球作为一个整体

window.requestAnimationFrame 使用方式

window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数

fly63.com版权所有,内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权,请与小编联系!情况属实本人将予以删除!

广告赞助文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全