相关文章推荐
绅士的创口贴  ·  震惊! ...·  3 月前    · 
善良的回锅肉  ·  pgsql ...·  1 年前    · 
豪气的板栗  ·  Python。在json.load()与js ...·  2 年前    · 

动画的历史

动画的出现最早可以追溯到五千年:以下是在伊朗沙赫尔伊苏赫塔发现的画作,这是艺术家试图通过动画来表现图形运动的最早例子之一。

这是五张山羊走向一棵树、爬上它、吃掉树叶然后又下来的照片。

通过现代动画技术将五张图拼接起来循环播放,一个山羊吃草的动画就实现了。

计算机动画原理

计算机图形学 : 计算机视觉的基础,主要关注数字合成与操作视觉的图形内容,涵盖点、线、面、体、场的数学构造方法。

计算机动画 : 又称计算机绘图,是通过使用计算机制作动画的技术。它是计算机图形学和动画的子领域,,主要包含2D、3D动画。

无论动画多么简单,始终需要定义两个基本状态,即【开始状态】和【结束状态】。没有它们,我们将无法定义插值状态,从而填补了两者之间的空白

动画的一些术语 :

【帧】 :连续变换的多张画面,其中的每一幅画面都是一帧。

【帧率】 :用于度量一定时间段内的帧数,通常的测量单位是FPS (frameper second)

【帧率与人眼】 :一般每秒10-12帧人 会认为画面是连贯的,这个现象称为视觉暂留。对于一些电脑动画和游戏来说低于30FPS会感受到明显卡顿,目前主流的屏幕、显卡输出为60FPS,效果会明显更流畅。

【补间动画(关键帧动画)】 : 传统动画,主画师绘制关键帧,交给清稿部门,清稿部门的补间动画师补充关键帧进行交付。

  • 类比到这里,补间动画师由浏览器来担任,如keyframe, transition
  • 【逐帧动画(Frame By Frame)】 : 从词语来说意味着全片每一 帧逐帧都是纯手绘。

  • 如steps实现雪碧图
  • 在2维计算机动画中,运动物体常被称为 精灵 。一个精灵是一个有位置的图像。每个帧之间的精灵的位置稍有改变,使得精灵看起来像在动

    前端动画分类

    CSS动画

    CSS的形体变换-Transform API

    只能转换由盒模型定位的元素。根据经验,如果元素具有display: block,则由盒模型定位元素。

    <transform-function> = <matrix()> | <translate()> | <translateX()> | translateY()> | <scale()> | <scaleX()>| <scaleY()> |<rotate()> | <skew()> | <skewX()> | <skewY()> |  <matrix3d()> | <translate3d()> |<translateZ()> | <scale3d()> <scaleZ()> | <rotate3d()> | <rotateX()> | <rotateY()> | <rotateZ()>|  <perspective()>
    

    Translate (移动)

    该变换由二维向量构成。它的坐标定义了元素在每个方向,上移动了多少

    transform: translate(200px);
    

    scale (缩放)

    transform: scale(0.5)
    

    rotate (旋转)

    transform: rotate(30deg)
    

    skew (倾斜)

      transform: skew(20deg, 10deg)
    

    参数表示倾斜角度,单位deg

  • 一个参数时:表示水平方向的倾斜角度;
  • 两个参数时:第一个参 数表示水平方向的倾斜角度,第二个参数表示垂直方向的倾斜角度。
  • CSS实现补间动画(Transition API、Keyframe)

    Transition API(过渡动画)

    dom加载完成或class发生变化时触发。

    div {
       transition: <property> <duration> <timing-function> <delay> ;
    transition-property
    指定哪个或哪些CSS属性用于过渡。
    transition-duration
    指定过渡的时长。
    transition-timing -function
    指定一个函数,定义属性值怎么变化。
    transition-delay
    指定延迟,即属性开始变化时与过渡开始发生时之间的时长。
    

    keyframe实现动画

    关键帧@keyframes at-rule 规则通过在动画序列中定义关键帧(或waypoints)的样式来控制CSS动画序列中的中间步骤。

  • 和转换transition相比,关键帧keyframes可以控制动画序列的中间步骤。
  • @keyframes slidein {
        from {
          transform: translateX(0%);
          transform: translateX(100%);
    

    CSS动画总结

    优点:简单、高效声明式的不依赖于主线程,部分采用硬件加速(GPU),简单的控制keyframe animation播放和暂停。

    缺点:不能动态修改或定义动画内容,不同的动画无法实现同步,多个动画彼此无法堆叠。

    适用场景:简单的h5活动/宣传页。

    推荐库:animation.css、shake.css等 。

    开始你的第一个动画

    CSS之详解2D转换

    SVG实现动画

    svg是基于XML的矢量图形描述语言,它可以与CSS和JS较好的配合,实现svg动画通常有三种方式: SMIL、JS、CSS

    Synchronized Multimedia Integration Language (同步多媒体集成语言)

    <svg xmlns="http://www.w3.org/2000/svg" width="300" height="100">
      <title>SVG SMIL Animate with Path</title>
      <rect x="0" y="0" width="300" height="100" stroke="black" stroke-width="1" />
      <circle cx="0" cy="50" r="15" fill="blue" stroke="black" stroke-width="1">
        <animateMotion
           path="M 0 0 H 300 Z"
           dur="3s" repeatCount="indefinite" />
      </circle>
    

    结论:兼容性不理想,这里不过多讨论,当然有polyfill的方案

    使用JS来操作SVG动画

    这个自不必多说,网上已经有很多现成的类库。

  • 老牌的Snap.svg以及anime.js,都能让我们快速制作SVG动画。
  • 当然,除了这些类库,HTML本身也有原生的Web Animation实现。
  • 使用Web Animation也能让我们方便快捷地制作动画。
  • 文字溶解动画

    Path实现写字动画

    【JS笔画的原理】

    SVG 使用stroke-dashoffset和stroke-dashoffset实现笔画效果

    stroke-dashoffset、stroke-dasharray配合使用实现笔画效果。
    stroke-dasharray : <length> | <percentage> ( 需要填充的路径)
    stroke-dashoffset: <length>  | <percentage> (dash模式开始位置的偏移量)
    

    path路径- d属性(路径描述)

  • *大写字母跟随的是绝对坐标x,y,小写为相对坐标dx,dy
  • M/m绘制起始点。
  • L/I绘制一条线段。
  • C/c为绘制贝塞尔曲线。
  • Z/z将当前点与起始点用直线连接。
  • 计算path的长度 — path.getTotallength();
  • 计算path上某个点的坐标 — path.getPointAtLength(lengthNumber)
  • CSS操作svg

    这里主要是使用animation, transform, transition来实现动画,它比JS更加简单方便。

    JS实现动画

    JS可以实现复杂的动画,也可以操作canvas动画API上进行绘制。

    如何做选择

    CSS优缺点

    浏览器会对CSS3动画做一些优化,导致CSS3动画性能上稍有优势(新建一个图层来跑动画)

    CSS3动画的代码相对简单

    动画控制上不够灵活,CSS3动画只能暂停,不能在动画中寻找一个特定的时间点。

    兼容性不佳,部分动画无法实现(视差效果、滚动动画)

    CSS很难做到两个以上的状态转化(要么使用关键帧,要么需要多个动画延时触发,再想到要对动画循环播放或暂停倒序等,复杂度极高)

    JS优缺点

    使用灵活,同样在定义一个动画的keyframe序列时,可以根据不同的条件调节若干参数(JS动画函数)改变动画方式。(CSS会 有非常多的代码冗余)

    对比与CSS的keyframe粒度更粗,css本身的时间函数是有限的,这块JS都可做弥补。

    JavaScript动画控制能力很强, 可以在动画播放过程中对动画进行控制:开始、暂停、回放、终止、取消都是可以做到的

    【JS缺点】

    使用到JS运行时,调优方面不如CSS简单,CSS调优方式固定。

    对于性能和兼容性较差的浏览器,CSS可以做到优雅降级,而JS需要额外代码兼容。

    JS动画代码复杂度高于CSS动画

    svg优缺点

    【svg优点】

    通过矢量元素实现动画,不同的屏幕下均可获得较好的清晰度。

    可以实现一些特殊的效果:描字,形变,墨水扩散等。

    【svg缺点】

  • 使用方式较为复杂,过多使用可能会带来性能问题。
  • 简单切换CSS/复杂控制JS/特定场景SVG

  • 当您为UI元素采用较小的独立状态时,只是简单的状态切换,不需要中间过程控制,使用CSS。
  • 在需要对动画进行大量控制时,使用JavaScript.
  • 在特定的场景下可以使用SVG,可以使用CSS或JS去操作SVG变化。
  • 字节青训营

    本节课的讲师:字节电商前端—蒋翔

    如以上有错误的地方,请在评论区中指出!

    如果有收获的话,就留个鼓励一下吧!😘

    分类:
    阅读
  •