前端动画实现笔记

简介: 前端动画实现笔记

前端动画实现笔记

参加字节跳动的青训营时个人写的笔记。这部分是蒋翔老师讲的课。

动画:动画是通过快速连续排列彼此差异极小的连续图像来制造运动错觉和变化错觉的过程。

  • 快速
  • 连续排列
  • 彼此差异极小
  • 制造错觉

动画都需要定义两个基本状态,即起始状态和结束状态,然后填补两者之间的空白,让动画连贯。

空白的补全方法有两种:

  • 补间动画:传统动画。主画师绘制关键帧,补间动画师补充关键帧。(而在前端中,补间动画师就由浏览器来当,如keyframe和transition)
  • 逐帧动画:每一帧都由主画师绘制。(如由steps实现的精灵动画)

常见的前端动画技术:Sprite动画、CSS动画、JS动画、SVG动画、WebGL动画

1. CSS动画

CSS animation是常见的CSS动画实现方式

  • animation-name:应用的一系列动画。每个名称代表一个由@keyframes定义的动画序列
  • animation-duration:一个动画周期的时长(默认是0s,表示无动画)
  • animation-timing-function:CSS动画在每一动画周期中执行的节奏
  • animation-delay:动画延时播放
  • animation-iteration-count:动画在结束前运行的次数,可以是1次,也可以是无限循环
  • animation-direction:动画是否反向播放
  • animation-play-state:定义一个动画是否运行或暂停

1.1 translate(移动)

定义元素的平移变换。

div {
  width: 200px;
  height: 200px;
  background-color: red;
  animation: Translate infinite 4s linear;
}
​
@keyframes Translate {
  0% {
    transform: translate(0, 0);
  }
  25% {
    transform: translate(0, 200px);
  }
  50% {
    transform: translate(200px, 200px);
  }
  75% {
    transform: translate(200px, 0);
  }
  100% {
    transform: translate(0, 0);
  }
}

动画

1.2 scale(缩放)

定义元素的缩小放大

div {
  width: 200px;
  height: 200px;
  background-color: red;
  animation: Scale infinite 2s linear;
  transform-origin: 0 0; /*缩放基准点*/
}
​
@keyframes Scale {
  from {
    transform: scale(1, 1);
  }
  to {
    transform: scale(0.5, 0.5); /*第一个、第二个参数分别是x轴、y轴缩放的倍数*/
  }
}

动画1

1.3 rotate(旋转)

定义元素的旋转

div {
  width: 200px;
  height: 200px;
  margin: 200px;
  background-color: red;
  animation: Scale infinite 4s linear;
}
​
@keyframes Scale {
  from {
    transform: rotate(0);
  }
  100% {
    transform: rotate(360deg);
  }
}

动画

1.4 skew(倾斜)

定义元素的倾斜

div {
  width: 200px;
  height: 200px;
  margin: 200px;
  background-color: red;
  animation: Translate 1s linear forwards;
}
​
@keyframes Translate {
  from {
    transform: skew(0, 0);
  }
  to {
    transform: skew(0, 45deg); /* 第一个参数是水平方向的倾斜角度,第二个参数是垂直方向的倾斜角度 */
    /* transform: skew(45deg, 0); */
  }
}

动画

1.5 CSS 精灵动画

CSS steps实现逐帧动画

效果(直接打开可能会看不了,可能要科学上网,蒋翔老师的这张图片好像是放到github上的)

动画

1.6 CSS动画优缺点

优点:简单、高效。不依赖于主线程,采用硬件加速(GPU)。

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

使用场景:简单的H5活动/宣传页

相关库:animation.css、shake.css

1.7 CSS属性

filter CSS属性

这部分不知道为什么放在了SVG部分,不过个人又放到了CSS这边。(感觉以后可能能用上)

2. SVG动画

SVG是基于XML的矢量图形描述语言,可以和CSS、JS很好的配合。

实现SVG动画有三种方式:

  • SMIL
  • JS
  • CSS

2.1 line

JS笔画的原理:stroke-dashoffset、stroke-dasharray配合使用实现笔画效果。

  • 属性stroke-dasharray可控制用来描边的点画线的图案。它是一个数列,指定短划线和空白的长度。如果提供奇数个值,则这个值的数列重复一次。如1,2,3等同于1,2,3,1,2,3
  • 属性stroke-dashoffset属性指定dash模式到路径开始的距离
<line stroke-dasharray="10, 5"
      x1="10" y1="10" x2="100" y2="10" />       
<!--  10像素短划线,5像素空白。起点是(10, 10), 终点是(100, 10)  -->

image-20220122184357682

更多例子

2.2 path

这部分待后续填坑

image-20220122184551802

例子

2.3 演示

不是本人写的。属于是分享链接

文字变形

写字效果

2.4 SVG优点与缺点

  • 优点:通过矢量元素实现动画,不同的屏幕下都有较好的清晰度。可以实现描字、形变等特殊效果
  • 缺点:使用复杂(个人现阶段属于是一头雾水)

3. JS动画

JS可以实现很多复杂的动画,还可以操作canvas进行绘制。

JS动画函数封装(蒋翔老师讲课用上的):

function animate ({easing, draw, duration}) {
​
  let start = performance.now();    // 不使用Date.now()的原因是performance.now()以恒定速度自增,精确到微秒级别,不易被篡改
  
  return new Promise(resolve => {
     requestAnimationFrame(function animate(time) {
        // timeFraction goes from 0 to 1
        let timeFraction = (time - start) / duration;
        if (timeFraction > 1) timeFraction = 1;
​
        // calculate the current animation state
        let progress = easing(timeFraction)
​
        draw(progress); // draw it
​
        if (timeFraction < 1) {
          requestAnimationFrame(animate);
           /*
            * 使用RequestAnimationFrame而不是使用setTimeout或setInterval的原因:
            * 该方法允许回调函数在浏览器准备重绘时运行,而且很快
            * 当页面在后台时,也就不会有重绘,所以回调函数也不会运行,所以动画会暂停,不会消耗资源
           */
        } else {
          resolve();
        }
​
     });
  });
​
}

参数:

  • easing:缓动函数。决定执行进度在时间增加的过程中的变化,可以是线性的,也可以是非线性的

    easing(timeFraction) {
      return timeFraction * 100;
    },
  • draw:绘制函数。相当于画笔,会一直反复被调用。入参是当前执行的进度progress,是一个介于0到1之间的数字

    const draw = (progress) => {
      ball.style.transform = `translate(${progress}px, 0)`;
    }
  • duration:持续时间

3.1 匀速运动

const draw = (progress) => {
  ball.style.transform = `translate(${progress * 100}px, 0)`;   // 一秒走100像素
}
​
animate({
    easing(timeFraction) {
        return timeFraction;
    },
    draw,
    duration: 1000
})

更多

这部分还不是很明白,和数学挂上钩了(累)。

4. 优化

性能角度:页面渲染的一般过程:JS -> CSS -> 计算样式 -> 布局 -> 绘制->渲染层合并。其中,布局(重排)和绘制(重绘)是最耗时的两部分,所以应尽可能减少这两部分。

image-20220122215918667

目录
相关文章
|
14天前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
|
14天前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
30 0
|
14天前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
|
14天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
14天前
|
机器学习/深度学习 弹性计算 自然语言处理
前端大模型应用笔记(二):最新llama3.2小参数版本1B的古董机测试 - 支持128K上下文,表现优异,和移动端更配
llama3.1支持128K上下文,6万字+输入,适用于多种场景。模型能力超出预期,但处理中文时需加中英翻译。测试显示,其英文支持较好,中文则需改进。llama3.2 1B参数量小,适合移动端和资源受限环境,可在阿里云2vCPU和4G ECS上运行。
|
14天前
|
前端开发 算法 测试技术
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
本文对比测试了通义千文、文心一言、智谱和讯飞等多个国产大模型在处理基础计数问题上的表现,特别是通过链式推理(COT)提示的效果。结果显示,GPTo1-mini、文心一言3.5和讯飞4.0Ultra在首轮测试中表现优秀,而其他模型在COT提示后也能显著提升正确率,唯有讯飞4.0-Lite表现不佳。测试强调了COT在提升模型逻辑推理能力中的重要性,并指出免费版本中智谱GLM较为可靠。
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
|
2月前
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
|
3月前
|
iOS开发 Android开发 MacOS
从零到全能开发者:解锁Uno Platform,一键跨越多平台应用开发的神奇之旅,让你的代码飞遍Windows、iOS、Android、macOS及Web,技术小白也能秒变跨平台大神!
【8月更文挑战第31天】从零开始,踏上使用Uno Platform开发跨平台应用的旅程。只需编写一次代码,即可轻松部署到Windows、iOS、macOS、Android及Web(通过WASM)等多个平台。Uno Platform为.NET生态带来前所未有的灵活性和效率,简化跨平台开发。首先确保安装了Visual Studio或VS Code及.NET SDK,然后选择合适的项目模板创建新项目。项目结构类似传统.NET MAUI或WPF项目,包含核心NuGet包。通过简单的按钮示例,你可以快速上手并构建应用。Uno Platform让你的技术探索之旅充满无限可能。
56 0
|
3月前
|
存储 前端开发 JavaScript
前端语言串讲 | 青训营笔记
前端语言串讲 | 青训营笔记
38 0
|
4月前
|
前端开发 JavaScript API
只会用插件可不行,这些前端动画技术同样值得收藏-JavaScript篇(下)
只会用插件可不行,这些前端动画技术同样值得收藏-JavaScript篇(下)
48 0