Web动效实现手段

2024-01-16 10:48
文章标签 实现 web 手段 动效

本文主要是介绍Web动效实现手段,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

640?wx_fmt=jpeg

作者 | 大漠

来源 |  https://www.w3cplus.com/web/web-tips-14.html © w3cplus.com


前段时间在微信群聊了一个动效的话题:

鼠标悬浮的时候,三个区块依次显示;鼠标移开时,三个区块反向依次消失。如果使用CSS的triansition是否可以实现?

640?wx_fmt=gif

借此话题,在这一期中就围绕着Web的动效来展开。Web动效不管是从设计到实现都有很多的话题可聊,比如,动画的设计、交互、实现等等。甚至是实现的技术方案或工具。


Web动效实现手段

说到动效,可能大家都会觉得Web动效是现代Web才具有的特性,事实上并非如此,Web出现不久,甚至CSS还未来的时候,在Web上有动效的身影。


640?wx_fmt=gif


时至今日,有关于Web动效的实现手段常见的主要有:

  • 最为古老的HTML标签<blink>和<marquee>,前者可以实现闪烁的动效,后者可以实现跑马灯的动效

  • 在Web中引用.gif文件格式,让元素有动效

  • 在Web中引用视频

  • CSS的transition和animation实现动效

  • Web Animations API

  • Canvas和SVG相关的动效

  • WebGL动效(3D动效)

对于开发人员可能会更为关注怎么在Web中开发动效。事实上,要在Web上添加动效,除了技术实现之外,还有很多知识点可以讨论,比如。


如何设计出色的动效

有关于如何设计出色的动效,在互联网上有关于这方面的讨论非常的多,也有一些设计规范,比如:

  • Material Motion

  • IBM's Animation Principles

  • The UX in Motion Manifesto

这些规范可以让我们从设计的角度来理解Web的动效:

640?wx_fmt=gif



事实上要设计好出一个较为盒理的动效,在设计的阶段就需要对这方面有考虑。迪士尼经过基础工作练习的长时间累积,在 1981 年出版的 The Illusion of Life: Disney Animation 一书中发表了动画的十二个原则 (12 Principles of Animation) 。这些原则描述了动画能怎样用于让观众相信自己沉浸在现实世界中。


挤压和拉伸 (Squash and stretch)

640?wx_fmt=gif


预备动作 (Anticipation)

640?wx_fmt=gif


演出布局 (Staging)

640?wx_fmt=gif


连续运动和姿态对应 (Straight-Ahead Action and Pose-to-Pose)

640?wx_fmt=gif

跟随和重叠动作 (Follow Through and Overlapping Action)

640?wx_fmt=gif


缓入缓出 (Slow In and Slow Out)

640?wx_fmt=gif


弧线运动 (Arc)

640?wx_fmt=gif


次要动作 (Secondary Action)

640?wx_fmt=gif


时间节奏 (Timing)

640?wx_fmt=gif


夸张手法 (Exaggeration)

640?wx_fmt=gif


扎实的描绘 (Solid drawing)

640?wx_fmt=gif


吸引力 (Appeal)

640?wx_fmt=gif

如果你对Web动效设计和体验相关的话题感兴趣的话,可以花点时间阅读下面相关的文章:

  • Animation & UX Resources

  • The ultimate guide to proper use of animation in UX

  • 6 Animation Guidelines for UX Design

  • The Designer’s Guide to Adding Animation in UX Design

  • How to fix dragging animation in UI with simple math


Web动效实现技术方案

前面提到过,实现Web动效的技术手段有很多种,在现代Web中,常见的Web动效实现方案主要有CSS动效,JavaScript动效,SVG动效,WebGL动效等


CSS动效

在CSS中实现动效,除了我们熟悉的transition和animation之外还有motion-path等。


CSS transition

CSS的transition实现的动效相对而言是较为简单的。就是实现从一个状态到另一个状态过渡效果。简单地说,就是从状态A到状态B时过程中有一定的动画效果:

640?wx_fmt=jpeg

使用CSS的transition可以在一些交互上增添微动效的交互。该方案要控制动画的过程,那相对而言会较难控制。


CSS animation

640?wx_fmt=png

CSS中的animation和transiton相比最大不同是有一个@keyframes,可以通过@keyframes来定义帧动效,可以在每一帧指定动画元素的各种状态(在帧上设置元素的CSS样式):

640?wx_fmt=gif

如果你不想手撸一个@keyrames的话,可以借助Chrome的插件keyframes.app来辅助你。比如:

640?wx_fmt=png


CSS路径动效

在某些场景之下,需要让一个动画对象按照我们指定的一个行动轨迹来运行:

640?wx_fmt=png

虽然借助@keyframes来绘制动画对象的运行轨迹,但相对而言会较为复杂,而且效果也较难还原。

但CSS的motion-path的出现,可以让这件事情变得更为简易:

CSS Houdini Animation

CSS Houdini可以说是一个好东东,对于广大CSSer而言更是一种福音。他能帮助我们扩展CSS的能力。对于Animation也是一样的,特意有一个Animation方面的内容,即Animation API

640?wx_fmt=png

比如下面这样的一个效果:

640?wx_fmt=png

暴露给CSSer使用的方式也很简单:

.el {    background-image: url(...);}.el::after {    background-color: hsla(300, 100%, 50%, .75);    mix-blend-mode: multiply;}.el.is-loaded::after {    mask-image: paint(circle);}el.addEventListener('mousemove', evt => {    el.style.cssText = `--size: 150; --x: ${evt.offsetX}; --y: ${evt.offsetY}`})el.addEventListener('mouseenter', evt => {    el.style.cssText = `--size: 150; --x: ${evt.offsetX}; --y: ${evt.offsetY}`})el.addEventListener('mouseleave', evt => {    el.style.cssText = `--size: 0; --x: ${evt.offsetX}; --y: ${evt.offsetY}`})

实现该效果的底层源码可以到这里查阅:https://css-houdini.rocks/posts/dynamic-hover-masks/paint.js


JavaScript实现动效

在Web中使用JavaScript实现动效也是最为常见的,而且这方面的能力也非常的强大。时至今日有Web Animation API,Canvas和WebGL等技术手段,而且还有各式各样式的动画库。

Web Animation API

640?wx_fmt=png

Web Animation API中提供了一些实现Web动效的API,比如:

  • Animation

  • KeyframeEffect

  • AnimationTimeline

  • AnimationEvent

  • DocumentTimeline

  • EffectTiming

  • document.timeline

  • document.getAnimations()

  • Element.animate()

  • Element.getAnimations()


这些API可以更好的帮助我们实现Web动效。比如使用KeyframeEffect这个API就可以像CSS中的@keyframes一样声明一个Keyframe:


var rabbitDownKeyframes = new KeyframeEffect(    whiteRabbit, // element to animate    [        { transform: 'translateY(0%)' }, // keyframe        { transform: 'translateY(100%)' } // keyframe    ],    { duration: 3000, fill: 'forwards' } // keyframe options);

如果你对Web Animation API相关的知识感兴趣的话,可以在Twitter上关注@rachelnabors

他可以说是Web Animation API之父,一直在致力于Web Animation API规范的推进。而且还录制了很多有关于这方面的视频和教程:

  • Web Animation API guide

  • Web Animations API Concepts

而且在Codepen上也有很多这方面的Demo可以供大家参考:

640?wx_fmt=png

有关于Web Animation API更多的教程可以阅读下面相关文章:

  • Web Animation API相关教程 @w3cplus

  • GETTING STARTED WITH THE WEB ANIMATIONS API

  • Advantages of the Web Animations API

  • Dan Wilson — When to Use the Web Animations API

  • Should you use CSS or JavaScript for web animations?


Canvas动画

<canvas>是HTML5的一个标签元素,可以被用来通过脚本绘制图形。比如,它可以被用来绘制图形,制作图片集合,甚至用来实现动画效果。比如下面这样的一个效果:


<canvas>中提供很多API,可以用来绘制图形,也可以实现一些基本动画,甚至一些高级动画

使用canvas来制作动画,需要对Canvas相关的API了解的透彻,而且需要知道一些有关于动画的一些实现逻辑和算法。特别是对象运动的轨迹、物理和数学相关的理论。

如果对Canvas相关的内容感兴趣的话,可以花点时间阅读:

  • Canvas 学习笔记(https://www.w3cplus.com/blog/tags/616.html)

  • HTML5 Canvas教程(https://www.html5canvastutorials.com/)

  • HTML5 Canvas半知半解(https://www.kancloud.cn/dennis/canvas/340110)

  • Canvas教程(https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial)


WebGL动画

WebGL允许你创建3D动画,它更适合沉浸式的全屏动画体验和VR。WebGL可以创建较为复杂的动画场景,但复杂程度也相应的大。


这里搜集了一些有关于WebGL相关的教程:

  • WebGL 理论基础

  • WebGL2 理论基础

  • Learn WebGL

  • WebGL 教程

  • WebGL Samples

另外收集了几个有关于Shaders相关的教程:

  • The Book of Shaders

  • Shader Lesson

  • Into Vertex Shaders

  • Shaders

  • Ronja's Shader Tutorials

  • Shadertoy

这里有一些关于计算机图形学以及计算机图形学中有用的数学。

SVG动效

SVG可以很好的用来绘制矢量图,而且允许使用SMIL(SVG动画的原生格式)创建动画。不过SMIL即将被Chrome弃用,但由于受到抵制,该团队暂进取消了这个决定。另外,该团队更想推动CSS动画和Web Animation API,而不是SMIL。

如果你对CSS和SVG结合起来制作动效相关的话题感兴趣的话,可以阅读下面相关的教程:

  • SVG 教程

  • 玩转 SVG 让设计更出彩

  • 16 SVG Animation Tutorials

  • Animating SVG with CSS

  • HTML5 SVG Fill Animation With CSS3 And Vanilla JavaScript

  • A Practical Guide To SVG And Design Tools

动画中的缓动函数

不管是CSS动画还是JavaScript动画,都会用到缓动函数。这些缓动函数可以帮助我们创建出更好的动画效果。

  • 缓动使您的动画感觉更自然

  • 为 UI 元素选择缓出动画

  • 避免缓入或缓入缓出动画,除非可以使其保持简短;这类动画可能让最终用户觉得很迟钝

640?wx_fmt=png

而Web动画和时间、速度和距离有关紧密的关系。有关于这方面更多的介绍可以阅读下面这些文章:


  • 曲线和弹性动画的定义与开发

  • 关于动画,你需要知道的

  • 缓动的基础知识

  • 自定义缓动

  • 在视图之间设置动画

  • 选择合适的缓动

  • Easing Functions in CSS3

  • S 动画与贝塞尔缓动函数的实现

  • 动画的内部原理和对接实践

  • 运动曲线提升CSS动画效果

  • 轨迹移动

  • Bezier curve

  • A Primer on Bézier Curves

  • Animated Bézier Curves

  • 三角函数在前端动画中的应用

  • 贝塞尔曲线的一些事情

Javascript动画库

时至今日,有关于Web动效有很多种实方案,同时在社区中有出现了很多优秀的有关于Web动画的库。

640?wx_fmt=gif

常见的库(或者说优秀的库)

  • AnimeJS

  • Three JS

  • Animate.css

  • Particles JS

  • Velocity.js

  • Bounce.js

  • Mo JS

  • GSAP

  • Kute.js

  • SVG.js

  • TweenJS

  • Ant Motion

  • Popmotion

  • Lottie

  • Loader CSS

  • Parallax JS

  • Bounce JS

  • P5 JS

  • Magic

  • Create JS

  • React-Motion

Web动效开发模式

最近几年一直在思考动效的开发模式,早期可能由于自己的认识,把动效的开发模式局限于手把手的撸,即根据设计师提供的稿子,一步一步的将动效转换成CSS或者JavaScript动效。

但随着技术的变革,我们开发动效的模式也在变化:

640?wx_fmt=gif

就开发模式而言,近几年经历了:

  • CSS驱动动效

  • JavaScript驱动动效

  • 数据驱动动效

640?wx_fmt=png

有关于这方面的话题,要是感兴趣的话,可以阅读:

  • Web Animation 制作指南

  • Web动画

  • 手淘互动动效的探索

  • 渐进式动画解决方案

  • 你离高效制作动画只差一篇文章的距离


小结

在这一期中我们主要围绕着Web动效展开,有关于实现Web动画的手段有很多种,比如大家熟悉的CSS transtion、animation,或者说CSS的路径动效;还有JavaScript动效,Canvas动效以及SVG动效。还有一此更为复杂的动效,比如WebGL实现的3D动效。


在是我们更为关心的是如何快速的实现动效,所以我们除了探讨如何实现动效之外,还需要一起探讨如何以最低成功的开发动效,甚至说以最低的成功,最快的方式,还原最好的动效。

这一切的一切都值得我们不断的去探讨。希望本文中提供的内容对大家有所帮助,如果你们在这方面有更多的经验,欢迎在下面的评论中一起分享。


640?wx_fmt=jpeg

640?wx_fmt=jpeg

这篇关于Web动效实现手段的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/612324

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Java Web指的是什么

Java Web指的是使用Java技术进行Web开发的一种方式。Java在Web开发领域有着广泛的应用,主要通过Java EE(Enterprise Edition)平台来实现。  主要特点和技术包括: 1. Servlets和JSP:     Servlets 是Java编写的服务器端程序,用于处理客户端请求和生成动态网页内容。     JSP(JavaServer Pages)

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、