首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前端动画实现笔记

前端动画实现笔记

作者头像
赤蓝紫
发布于 2023-01-02 08:57:44
发布于 2023-01-02 08:57:44
1.7K00
代码可运行
举报
文章被收录于专栏:clzclz
运行总次数:0
代码可运行

前端动画实现笔记

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

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

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

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

空白的补全方法有两种:

  • 补间动画:传统动画。主画师绘制关键帧,补间动画师补充关键帧。(而在前端中,补间动画师就由浏览器来当,如 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(移动)

定义元素的平移变换。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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(缩放)

定义元素的缩小放大

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.3 rotate(旋转)

定义元素的旋转

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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(倾斜)

定义元素的倾斜

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 模式到路径开始的距离
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<line stroke-dasharray="10, 5"
      x1="10" y1="10" x2="100" y2="10" />
<!--  10像素短划线,5像素空白。起点是(10, 10), 终点是(100, 10)  -->

更多例子

2.2 path

这部分待后续填坑

例子

2.3 演示

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

文字变形

写字效果

2.4 SVG 优点与缺点

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

3. JS 动画

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:缓动函数。决定执行进度在时间增加的过程中的变化,可以是线性的,也可以是非线性的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
easing(timeFraction) {
  return timeFraction * 100;
},

draw:绘制函数。相当于画笔,会一直反复被调用。入参是当前执行的进度 progress,是一个介于 0 到 1 之间的数字

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const draw = (progress) => {
  ball.style.transform = `translate(${progress}px, 0)`;
};

duration:持续时间

3.1 匀速运动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const draw = (progress) => {
  ball.style.transform = `translate(${progress * 100}px, 0)`; // 一秒走100像素
};

animate({
  easing(timeFraction) {
    return timeFraction;
  },
  draw,
  duration: 1000,
});

更多

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

4. 优化

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
go-https的简单实现
X.509 Certificate Signing Request (CSR) Management.
fnatic
2022/07/22
24.7K0
Go 语言网络编程系列(五)—— HTTP 编程篇:HTTP/HTTPS 请求处理
本篇教程我们将介绍 HTTP 服务端技术,包括如何处理 HTTP 请求和 HTTPS 请求。
学院君
2019/11/12
2.3K0
Go 语言网络编程系列(五)—— HTTP 编程篇:HTTP/HTTPS 请求处理
golang源码分析:分布式链路追踪
在上一节搭完分布式追踪的采集展示链路后,这一节开始分析分析分布式链路追踪的核心源码。我们知道分布式追踪的原理是通过traceId串联调用链路上的所有服务和日志,每个服务都有一个自己的spanId,每一次rpc调用都需要生成一个子spanId,通过父子spanID的对应关系,构建一个有向无环图实现分布式追踪的。因此在业务代码的接入过程中需要实现如下功能,父子span关系的构建,父子span关系的传递(包括context内部传递和rpc服务之间的传递有可能跨协议比如http和grpc协议之间传递),rpc日志的采样,上报等等。每一个厂商都有自己的实现,opentrace定义了统一的标准接口,我们按照标准实现即可。在业务代码中实现包括四步:
golangLeetcode
2022/12/17
8520
golang源码分析:分布式链路追踪
go https 笔记
理解为运行在SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议所构建的安全层之上的HTTP协议
solate
2019/07/22
9030
Go每日一库之126:h2c(明文https)
net/http包默认支持http2的,而HTTP/2强制使用TLS的,所以在使用的时候必须指定证书,正好最近玩过,在这写一下:
luckpunk
2023/09/30
7720
Golang(十二)TLS 相关知识(三)理解并模拟简单代理
0. 前言 前面的介绍我们理解了数字签名等知识,同时学习了 OpenSSL 生成私钥和证书并验证 之前提过我们基于 BitTorrent 协议开发了一个 docker 镜像分发加速插件 中间涉及到了配置 docker 的代理 下面我们简单介绍下 Golang 的 http.transport 配置了网络代理后的网络行为并编写一个简单的代理转发,加深理解代理转发行为 1. http.Transport 配置代理 http 代理配置代码如下: func TLSTransport(caFile string)
西凉风雷
2022/11/23
7120
Golang(十二)TLS 相关知识(三)理解并模拟简单代理
go 原生代码搞定https双向认证客户端私钥加密
最近有一个https双向认证的项目,客户端的证书是加密的,之前用python requests 做原型测试发现不支持加密,需要运行的时候在终端输入密码。
有福
2019/02/22
3.1K0
go 原生代码搞定https双向认证客户端私钥加密
有关[Http持久连接]的一切,卷给你看
上文中我的结论是: HTTP Keep-Alive 是在应用层对TCP连接进行滑动续约复用, 如果客户端/服务器稳定续约,就成了名副其实的长连接。
有态度的马甲
2021/12/05
4990
有关[Http持久连接]的一切,卷给你看
Go 每日一库之 rpcx
在之前的两篇文章rpc和json-rpc中,我们介绍了 Go 标准库提供的rpc实现。在实际开发中,rpc库的功能还是有所欠缺。今天我们介绍一个非常优秀的 Go RPC 库——rpcx。rpcx是一位国人大牛开发的,详细开发历程可以在rpcx官方博客了解。rpcx拥有媲美,甚至某种程度上超越gRPC的性能,有完善的中文文档,提供服务发现和治理的插件。
用户7731323
2020/09/08
9540
KubeEdge云边隧道Stream源码解析
Stream是KubeEdge中提供云边隧道的模块,目前支持ApiServer向Kubelet发起的containerLog、exec和metrics请求。云边隧道基于WebSocket建造,支持双向传输和流式传输。
CNCF
2021/05/07
1.5K0
KubeEdge云边隧道Stream源码解析
Go代码打通HTTPs
TL;DR 手工创建CA证书链,手写代码打通HTTPs的两端 HTTPs最近是一个重要的话题,同时也是一个有点难懂的话题。所以网上有大量的HTTPs/TLS/SSL的教程。关于这些的原理,这里不做讲解,有兴趣的可以自行搜索。 本文介绍一个自己创建证书,并编写 Go 代码实现 client/server 两端的过程。从实践的角度帮助理解。 构建 CA 证书链 我们首先要创建 client/server 使用的证书。创建证书的方法有很多种:有不怕麻烦,直接通过 openssl 创建的,有通过 cfssl 创建的
李海彬
2018/03/16
1.5K0
【实践】如何在本地环境用GO实现HTTPS链接?
本篇文章是基于实操,如何在本地环境用GO实现HTTPS链接。原理部分请参考文章《【深度知识】HTTPS协议原理和流程分析》。
辉哥
2019/05/15
2.6K0
【实践】如何在本地环境用GO实现HTTPS链接?
gRPC如何在Golang和PHP中进行实战?7步教你上手!
导语 | gRPC也是RPC技术家族的一种,它由Google主导开发,是一个跨平台的调用框架,其中和go语言结合的是最紧密的,在go语言的开发和调用中占据主导地位。gRPC采用protobuf作为配置载体来实现通讯和调用。本文主要实战演示一下gRPC的几种调用通讯模式(普通、客户端流、服务端流、双向流)以及和PHP客户端的联通调用。 在学习gRPC之前,我们需要了解一下ptorobuf语法和protoc的命令,能帮助我们更加深入的学习和理解gRPC。 一、需求分析 我们这次只搞个很简单的需求,搞个用户
腾讯云开发者
2021/10/20
3K1
gRPC,爆赞
gRPC 这项技术真是太棒了,接口约束严格,性能还高,在 k8s 和很多微服务框架中都有应用。
AlwaysBeta
2021/10/12
1.2K0
Go实战--golang中使用RethinkDB(gorethink/gorethink.v3)
生命不止,继续go go go !!! 关于golang中操作数据库,曾经介绍了不少: Go实战–go语言操作sqlite数据库(The way to go) Go实战–go语言操作MySQL数据库
程序员的酒和故事
2018/03/12
1.9K0
Go实战--golang中使用RethinkDB(gorethink/gorethink.v3)
Go语言 如果实现http重连?
怎样做到每次使用一个连接发送和接收前就设置超时呢?我想了个办法是在Dial回调返回自己包装过的TimeoutConn,间接的调用真实的Conn,这样就可以再每次Read和Write之前设置超时时间了。 以下是修改后的实验代码: // // How to set timeout for http.Get() in golang // package main import ( "io" "io/ioutil" "log" "net" "net/ht
李海彬
2018/03/19
1.2K0
Golang|记录一些踩坑笔记
var xhr = new XMLHttpRequest(); xhr.open('get', 'https://v1.hitokoto.cn/'); xhr.onreadystatechange = function () { if (xhr.readyState === 4) { var data = JSON.parse(xhr.responseText); var hitokoto = document.getElementById('hitokoto'); hitokoto.innerText = data.hitokoto; } } xhr.send();
TRY博客-简单的网络技术
2022/09/08
2810
客户端禁用Keep-Alive, 服务端开启Keep-Alive,会怎么样?
之前我有结论:HTTP keep-alive 是在应用层对TCP连接的滑动续约复用,如果客户端、服务器稳定续约,就成了名副其实的长连接。
有态度的马甲
2022/03/30
1.3K0
客户端禁用Keep-Alive, 服务端开启Keep-Alive,会怎么样?
如何用Golang模拟客户端发送Http请求
在Golang中web开发中net/http是经常用到的包,在这个包中包含了各种请求与响应的方式,下面我会一一进行介绍。
陌无崖
2019/08/16
8.1K0
go: grpc tls 应用一览
在go 1.15以上版本,必须使用SAN方式,否则会报"transport: authentication handshake failed: x509: certificate relies on legacy Common Name field, use SANs instead"
超级大猪
2023/01/31
1.3K0
推荐阅读
相关推荐
go-https的简单实现
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 前端动画实现笔记
    • 1. CSS 动画
      • 1.1 translate(移动)
      • 1.2 scale(缩放)
      • 1.3 rotate(旋转)
      • 1.4 skew(倾斜)
      • 1.5 CSS 精灵动画
      • 1.6 CSS 动画优缺点
      • 1.7 CSS 属性
    • 2. SVG 动画
      • 2.1 line
      • 2.2 path
      • 2.3 演示
      • 2.4 SVG 优点与缺点
    • 3. JS 动画
      • 3.1 匀速运动
    • 4. 优化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档