vue-动画基础-velocity

1.前言

之前在公司上班 ,或者接私活 整体上动画其实几乎某用到
最近看文档 又梳理了下,那就记下来吧


2. transition

vue 在插入、更新或者移除 DOM 时,提供多种不同方式的应用过渡效果。包括以下工具:
1 .在 CSS 过渡和动画中自动应用 class

  1. 可以配合使用第三方 CSS 动画库,如 Animate.css 案例
  2. 在过渡钩子函数中使用 JavaScript 直接操作 DOM
  3. 可以配合使用第三方 JavaScript 动画库,如 Velocity.js

3.Vue 提供了 transition 的封装组件

动画的 钩子 生命周期可以看文档解释非常清除 ,这里简单说几个点
v-enter-active 简单理解为 标签出现的动画
v-leave-active 标签离开的动画
上面2个里面 一般定义 动画的时长 延迟和 曲线函数 就是那个贝塞尔曲线
例如 {animation: moveOne 1s;}
{transition: all 2s;}
v-enter-to 进入过渡的结束状态 比如出现后位置在哪颜色等
v-leave-to 离开过渡的结束状态 比如最后消失的位置 在哪

注意

v 就是 transitionname属性对应的值
比如下面的案例 nameyzs 那么写 样式动画的时候 就用yzs代替 v

<template>
  <div>
    <button @click="show = !show">点击</button>
    <!-- 在vue中提供了一个transition组件,让哪部分执行过渡动画,则使用transition包裹起来 -->
    <transition name="yzs">
      <div :class="styA" v-show="show">vue动画</div>
    </transition>
  </div>
</template>

<script>
export default {
  data: function () {
    return {
      show: true,
      styA: "classA",
    };
  },
};
</script>

<style lang="less" scoped>
.classA {
  width: 200px;
  height: 200px;
  background-color: red;
  font-size: 50px;
  color: white;
  text-align: center;
  line-height: 200px;
}
/* 设置不同的进入和离开动画时的状态,设置了动画过渡时长 */
.yzs-enter-active,
.yzs-leave-active {
  transition: all 2s;
}
/*  .yzs-leave-to,.yzs-enter{
                width: 50px;
                height: 50px;
                opacity: 0.2;
                font-size: 16px;
                transform: translate(500px,300px);
            } */
/* 或者 */
.yzs-leave-to {
  width: 50px;
  height: 50px;
  opacity: 0.2;
  font-size: 16px;
  transform: translate(0px, 0px);
}
.yzs-enter {
  width: 80px;
  height: 80px;
  border-radius: 50%;
  transform: translate(800px, 200px);
}
</style>

3.js动画

这里没有使用定时器 而是用了 requestAnimationFrame 这个api
js动画主要就是给vue自带的钩子 绑定上自己的 动画函数就行

<template>
  <div>
    <input type="checkbox" v-model="show" />

    <!-- transition还可以设置js动画,使用js设置动画时,需要监听transition组件的@leave事件,这个事件在元素需要做离场动画时调用。在事件绑定的函数中使用js进行动画 -->
    <transition name="js-ani" @leave="leaveAniStart" @enter="enterAniStart">
      <div id="box" v-show="show"></div>
    </transition>
  </div>
</template>

<script>
export default {
  data: function () {
    return {
      show: true,
    };
  },
  methods: {
    // transtion组件的动画时间函数有两个参数,第一个是要做动画的元素。第二个是动画结束时的回调函数,必须在动画结束时调用。
    leaveAniStart(el, callback) {
      var opacity = 1;
      function ani() {
        opacity -= 0.02;
        el.style.opacity = opacity;
        if (opacity <= 0) {
          callback();
        } else {
          requestAnimationFrame(ani);
        }
      }
      requestAnimationFrame(ani);
    },
    enterAniStart(el, callback) {
      var opacity = 0;
      function ani() {
        opacity += 0.02;
        el.style.opacity = opacity;
        if (opacity >= 1) {
          callback();
        } else {
          requestAnimationFrame(ani);
        }
      }
      requestAnimationFrame(ani);
    },
  },
};
</script>

<style lang="less" scoped>
#box {
  width: 100px;
  height: 100px;
  background-color: red;
}
</style>


4.Velocity

4.1简介

Velocity 是一个简单易用、高性能、功能丰富的轻量级JS动画库。它能和 jQuery完美协作,并和$.animate()有相同的API, 但它不依赖jQuery,可单独使用。Velocity不仅包含了$.animate()的全部功能, 还拥有:颜色动画、转换动画(transforms)、循环、 缓动、SVG 动画、和 滚动动画 等特色功能。

它比 $.animate()更快更流畅,性能甚至高于CSS3 animation, 是 jQueryCSS3 transition的最佳组合,它支持所有现代浏览器,最低可兼容到IE8Android 2.3


4.2 引入方式 1

直接脚本引入

<script src="https://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.3/velocity.min.js"></script>

4.3 脚手架项目

npm安装 注意 安装这个velocity-animate

npm install velocity-animate -S

哪个组件使用哪个组件可以引入 ,
也可以作为全局引入

import Velocity from "velocity-animate";

4.4 使用方式都一样

   <transition
      v-on:before-enter="beforeEnter"
      v-on:enter="enter"
      v-on:leave="leave"
    >
      <div id="box" v-show="showView"></div>
    </transition>

钩子

 methods: {
   beforeEnter (el) {
      el.style.opacity = 0
    },
    enter (el, done) {
      Velocity(el, { opacity: 1}, { duration: 3000,complete:done })
    },
    leave (el, done) {
      Velocity(el, { opacity: 0}, { duration: 3000,complete:done })
    }
}

比原生JS简单方便多了,可以多用用哦


5.列表动画

列表动画我觉得官网写的也挺好的 建议看看
注意key值的写法 不要 用索引.因为索引永远不会变,不管你是插入,还是删除,第一个位置永远是0,第二个永远是1,监听不到key的变化,自然也就无法做动画,其实就是底层 diff虚拟 DOM触发不了

<template>
<!--  这个列表动画 官网写的挺好的 -->
  <div>
    <button @click="addClick">添加数字</button>
    <div>
      <!-- 对于列表的添加删除动画,必须使用transition-group标签 -->
      <transition-group name="list" tag="ul">
        <!-- 列表项参与动画时,必须有一个唯一的key属性
  这里不建议使用 i ,因为用i作为,key的话,这个不会变化,
i是索引 不管怎么插入第一个位置索引永远是0,第二个位置索引永远是1,监听不到改变,不会进行动画
 -->
        <li v-for="(n, i) in arr" :key="n">{{ n }}</li>
      </transition-group>
    </div>
  </div>
</template>

<script>
export default {
  data: function () {
    return {
      arr: [1, 2, 3],
      max: 4,
    };
  },
  methods: {
    addClick() {
      var num = this.max++;
      var index = Math.floor(Math.random() * (this.arr.length + 1));
      this.arr.splice(index, 0, num);
    },
  },
};
</script>

<style lang="less" scoped>
li {
  background-color: orange;
  /* 如果列表中添加新元素时,其他元素“让位置”时也带动画,那么列表项元素必须设置transition过度,而且不能是inline元素 */
  transition: all 0.7s;
  width: 100px;
}

.list-enter {
  transform: translate(-100%, 0);
}

.list-enter-active {
  transition: all 0.7s;
}

.list-enter-to {
  transform: translate(0, 0);
}
</style>

参考资料

vue-动画
Velocity


初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理;
如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
共勉
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容