新手篇:如何用CSS实现简单骨骼动画(代码分享)

之前的文章《教你怎么使用shell脚本实现服务器快速设置(附代码)》中,给大家介绍了怎么使用shell脚本实现服务器快速设置。下面本篇文章给大家介绍如何用CSS实现简单骨骼动画,我们一起看看怎么做。

新手篇:如何用CSS实现简单骨骼动画(代码分享)

1、背景

某天设计师来找我说,“这个心愿牌傻傻地挂在那不好看,加个动效呗,就左右摆动一下就行,很简单的!”,我一想,行呀,提升用户视觉体验,开搞。

微信截图_20210918134731.png

十分钟后,不对呀,这个左右摆动好假,不像现实中风吹的效果。

注:此处加快了动画的速度和摆动的幅度。

立即学习“前端免费学习笔记(深入)”;

.animate-1 {    animation: swing1 1s ease-in-out infinite;    transform: rotate(-5deg);    transform-origin: top center;}@keyframes swing1 {    0% { transform: rotate(-5deg); }    50% { transform: rotate(5deg);}    100% { transform: rotate(-5deg);}}

14.gif

冷静思考,为啥这个摆动会没有灵魂。于是拿起工卡开始摆动,看看现实中的摆动效果是咋样的,最后豁然开朗:原来现实中的心愿牌(和工卡同理)在受力的时候,并不会整体摆动,而是会根据节点位置分成几部分有关联地摆动,这其实是个简单的骨骼动画!那到底怎么去实现呢?

2 、骨骼动画

这里将以这个心愿牌摆动动画为例,和大家一起研究如何使用css来实现。

2.1 分离元素

要让动画元素分开运动,首先需要拆分元素。拆分的依据是上面提到的节点,也就是骨骼动画中所谓的关节。例如这个心愿牌就有两个关节,分别在牌的上面和牌的下面,于是我们能拆分出3个动画元素:

微信截图_20210918135020.png

2.2 拼接元素

这里看似简单,但是如果对骨骼动画不了解的话,会掉到坑里,上面就是错误的示范。为了加深大家的理解,特地挖了一个坑

2.3 添加动效

在上面的基础上,我们就可以为每一部分添加不同幅度和方向的摆动动效啦。

.animate-2 .item-1 {    /* 设置margin是为了定位,使其部分重叠在一起 */    margin-bottom: -8px;    margin-left: 18px;    position: relative;    z-index: 1;    animation: swing2-1 1s ease-in-out infinite;    transform: rotate(-3deg);    transform-origin: top center;}.animate-2 .item-2 {    animation: swing2-2 1s ease-in-out infinite;    transform: rotate(5deg);    transform-origin: top center;}.animate-2 .item-3 {    margin-top: -5px;    margin-left: 17.5px;    position: relative;    animation: swing2-3 1s ease-in-out infinite;    transform: rotate(-5deg);    transform-origin: top center;}@keyframes swing2-1 {    0% { transform: rotate(-3deg); }    50% { transform: rotate(3deg);}    100% { transform: rotate(-3deg);}}@keyframes swing2-2 {    0% { transform: rotate(5deg); }    50% { transform: rotate(-5deg);}    100% { transform: rotate(5deg);}}@keyframes swing2-3 {    0% { transform: rotate(-5deg); }    50% { transform: rotate(5deg);}    100% { transform: rotate(-5deg);}}

大功告成?来看一下效果吧

14.gif

我的天,这是啥啊!!!看起来摆动确实要比整体摆动真实,不同元素有不同的摆动幅度和方向。但是错位了呀。

再继续冷静思考,问题出在,骨骼动画的每一个子动画都是有关联的,而我们上面设计的每一个动画都是独立的。举个例子,顶部的红绳摆动时,会牵引住下面的牌子,导致下面牌子位置发生变化。下面的牌子在位置发生变化的同时,播放自己摆动的动画,这才是骨骼动画!

2.4 填坑 – 从js实现骨骼动画来理解其原理

源码在这里,因为在油管,为了避免某些同学没能科学上网看不到,所以以下面的跑步动作为例,讲解一下js实现过程

https://github.com/bit101/CodingMath/tree/master/episode44

根据大腿的初始状态,当前旋转速度,计算大腿下一帧的位置;

根据当前大腿的位置和小腿当前的速度,计算小腿下一帧的位置;

…无限循环…

1452F.gif

从这里可以看出,小腿的位置是依赖大腿的位置的,这就不会出现我们上面的错位情况。所以说白了,骨骼动画的特性就是:

关键元素带着子元素一起运动,子元素在此基础上自己运动。

那么js实现中是通过先计算大腿位置,再由大腿位置计算小腿位置来实现联结的,而css该怎么实现呢?

2.5 纯css实现

回顾最关键的地方:关键元素带着子元素一起运动,子元素在此基础上自己运动。,要实现关键元素和子元素一起运动,在css里面,只要关键元素包裹子元素即可!,这就是css实现骨骼动画的基石。

.animate-3 .s-1 {    animation: swing3-1 1s ease-in-out infinite;    transform: rotate(-3deg);    transform-origin: top center;}.animate-3 .s-2 {    animation: swing3-2 1s ease-in-out infinite;    transform: rotate(-5deg);    transform-origin: top center;}.animate-3 .s-3 {    animation: swing3-3 1s ease-in-out infinite;    transform: rotate(-5deg);    transform-origin: top center;}@keyframes swing3-1 {    0% { transform: rotate(-3deg); }    50% { transform: rotate(3deg);}    100% { transform: rotate(-3deg);}}@keyframes swing3-2 {    0% { transform: rotate(5deg); }    50% { transform: rotate(-5deg);}    100% { transform: rotate(5deg);}}@keyframes swing3-3 {    0% { transform: rotate(-5deg); }    50% { transform: rotate(5deg);}    100% { transform: rotate(-5deg);}}

1445F.gif

这次终于大功告成了。这里有三个元素,更多元素也是同理的,不断嵌套即可。

3、最终动效演示

细心的同学会发现上面实现的骨骼动画看着也别扭,归根结底是各个元素摆动的方向和幅度没有调节好,这里附上调整完的效果,用心感受:

.animate-4 .s-1 {    animation: swing4-1 5s ease-in-out infinite;    transform: rotate(-2deg);    transform-origin: top center;}.animate-4 .s-2 {    animation: swing4-2 8s ease-in-out infinite;    transform: rotate3d(0, 1, 0, 20deg);    transform-origin: top center;}.animate-4 .s-3 {    animation: swing4-3 8s ease-in-out infinite;    transform: rotate(3deg);    transform-origin: top center;}@keyframes swing4-1 {    0% { transform: rotate(-2deg); }    50% { transform: rotate(2deg);}    100% { transform: rotate(-2deg);}}@keyframes swing4-2 {    0% { transform: rotate3d(0, 1, 0, 20deg); }    50% { transform: rotate3d(0, 1, 0, -20deg);}    100% { transform: rotate3d(0, 1, 0, 20deg);}}@keyframes swing4-3 {    0% { transform: rotate(3deg); }    50% { transform: rotate(-3deg);}    100% { transform: rotate(3deg);}}

14F.gif

4、End

纯CSS确实能实现骨骼动画,但仅限于简单的场景。在复杂场景中,例如前端游戏里面的骨骼动画,涉及到的节点比较多,用CSS虽然能实现,但效率不高,所以社区有很多从设计工具直接导出可用的骨骼动画信息,再用js来加载运行的方案,大家感兴趣可以Google一下。

本文主要通过简单的案例来加深大家对骨骼动画的原理性的认识,至于最后大家用CSS还是用JS来实现,就是“杀鸡要不要用牛刀”的问题了。

个人认为,只要屠龙刀在手,用不用已经不重要了。加油,希望大家能在各个方向找到自己的屠龙刀。

推荐学习:CSS视频教程

以上就是新手篇:如何用CSS实现简单骨骼动画(代码分享)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1621743.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月24日 07:36:46
下一篇 2025年12月24日 07:36:56

相关推荐

  • 深入解析CSS中的绝对定位,彻底理解它!

    本篇文章给大家解析一下css中的绝对定位,带大家彻底理解它,希望对大家有所帮助! 与其说定位一个元素是定位元素自身的位置,不如说是元素的容器位置。为了能够定位自己,它必须知道自己将相对于哪个父div 来定位。【相关推荐:《css视频教程》】 下面的代码展示了4个嵌套的 div , .box-1 到 …

    2025年12月24日 好文分享
    000
  • 如何利用CSS background系列属性实现一些花式的文字效果

    如何利用css实现花式文字效果?下面本篇文章给大家介绍一下利用 background 系列属性实现一些花式文字效果的方法,希望对大家有所帮助! 本文将讲解如何利用 background 系列属性,巧妙的实现一些花式的文字效果。通过本文,你将可以学到: 通过 background-size 与 bac…

    2025年12月24日 好文分享
    000
  • 手把手教你使用纯CSS绘制可爱玉兔(附代码)

    如何使用纯css画一只可爱玉兔?下面本篇文章就手把手教你使用纯css绘制可爱玉兔,希望对大家有所帮助! 这里有段小故事跟大家科普一下哦: 玉兔本是后羿,因为嫦娥奔月,而又思念后羿,后羿为了和嫦娥在一起,情愿变成了她最爱的小动物–玉兔.可惜嫦娥始终不知玉兔就是她日夜思念的后羿! 下面就让我…

    2025年12月24日
    000
  • 深入学习CSS中的 :is() 和 :where(),让样式代码更简洁!

    本篇文章带大家深入了解css中的两个比较高效的选择器,通过它们可以用更少的代码去更有效地选择元素,进而简化代码,下面一起来看看吧! 新人在入门CSS的时候,往往最困惑的就是两件事情(个人想法):1. CSS是基于文档流的,有些时候编写的代码,并不符合自己的预期!2.复杂的选择器,什么场景用什么选择器…

    2025年12月24日 好文分享
    000
  • CSS怎么实现瀑布流?两种方式介绍

    css怎么实现瀑布流?下面本篇文章给大家介绍一下使用css实现瀑布流的两种方式,希望对大家有所帮助! 瀑布流又称瀑布流式布局,是比较流行的一种网站页面布局方式。在手机端进行多图片展示时会经常用到。即多行等宽元素排列,后面的元素依次添加到其后,等宽不等高,根据图片原比例缩放直至宽度达到我们的要求,依次…

    2025年12月24日
    000
  • 给文字添加渐变、描边、投影效果的两种方式(CSS和SVG)

    本篇文章给大家介绍一下使用css和svg给文字添加渐变、描边、投影效果的方法,希望对大家有所帮助! 在一些 web 活动页中经常能看到特殊处理的标题文字,比如这样的 暂时忽略掉特殊字体,通过设计稿的图层样式可以发现,共有 3 个文字特效,分别是渐变、描边、投影 立即学习“前端免费学习笔记(深入)”;…

    2025年12月24日 好文分享
    000
  • 手把手带你通过5个例子来熟悉CSS变量!

    大家对css变量熟悉吗?如果不熟悉,不要紧!下面本篇文章就来给大家介绍一下css变量,通过5个例子来带大家熟悉css变量,希望对大家有所帮助! 随着 Web应用程序变得越来越大,CSS变得越来越大,越来越冗长,而且混乱不堪。 在良好的上下文中使用CSS变量,可为我们提供重用和轻松更改重复出现的CSS…

    2025年12月24日 好文分享
    000
  • 纯CSS做一个烟花绽放动画(代码示例)

    本篇文章带大家使用纯css做一个烟花绽放动画,希望对大家有所帮助! 最近项目上需要做一个烟花动画,要求是随机大小,不同地方出现,先看效果 一、选择合适的动画 什么样的场景决定使用什么样的动画。比如一些比较轻量、装饰性的动画,CSS 动画就足够了,而一些对动画要求比较高的运营活动,创意小游戏等,JS …

    2025年12月24日 好文分享
    000
  • css数字文本过长被隐藏了怎么办

    css数字文本过长被隐藏的解决方法:1、打开相应的HTML文件;2、使用“word-break”属性,给包含数字的元素添加“word-break:break-all;”样式,让数字文本自动换行即可全部显示出来即可。 本教程操作环境:windows7系统、CSS3&&HTML5版、De…

    2025年12月24日 好文分享
    000
  • css怎么去掉表格重复的边框

    在css中,可以使用border-collapse属性来去掉表格中重复的边框,该属性可以设置表格边框是折叠为单一边框还是分开的,只需要将值设置为collapse即可把重叠的边框合并在一起,成为一个边框,实现单线边框的效果。 本教程操作环境:windows7系统、CSS3&&HTML5…

    2025年12月24日
    000
  • 巧用css filter的drop-shadow()函数创建线条光影效果

    本文将介绍一种利用 css 滤镜 filter 的 drop-shadow(),实现对 html 元素及 svg 元素的部分添加阴影效果,以实现一种酷炫的光影效果,用于各种不同的场景之中。 通过本文,你可以学到: 如何利用 filter: drop-shadow() 对元素的部分内容添加单重及多重阴…

    2025年12月24日 好文分享
    000
  • 让网站更酷炫的CSS filter使用小技巧,值得收藏!

    巧用css filter,可以让网站更加酷炫。本篇文章就来给大家分享一些css filter使用小技巧,希望对大家有所帮助! 下面就来开始本篇文章的内容吧! 我们在处理图片时,经常使用的一个功能就是滤镜,它能使一张图像呈现各种不同的视觉效果。 立即学习“前端免费学习笔记(深入)”; 在 CSS 中,…

    2025年12月24日 好文分享
    000
  • 用css怎么画树

    绘制方法:1、定义3个div标签,使用border属性将其修饰成3个大小不同的三角形;2、使用margin属性控制3个三角形的位置,形成树冠;3、定义1个div标签制作树干,使用margin属性将其定位到树冠下方即可。 本教程操作环境:windows7系统、CSS3&&HTML5版、…

    2025年12月24日 好文分享
    000
  • css中如何将行元素转为块元素,块元素转为行元素

    css中可以利用display属性实现行元素和块元素的相互转换:给行元素添加“display:block;”样式可以将其转为块元素;给块元素添加“display:inline;”样式可以将其转为行元素。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电…

    2025年12月24日
    000
  • 怎么设置css文本不可选中

    css文本不可选中的设置方法:1、创建一个HTML示例文件;2、创建div并定义文字内容;3、通过设置“user-select: none;”属性来设置文本不可选中即可。 本文操作环境:windows7系统、HTML5&&CSS3版、Dell G3电脑。 怎么设置css文本不可选中?…

    2025年12月24日
    000
  • css怎么写六边形

    css写六边形的方法:1、把正六边形分成三部分,然后设置before部分,p部分和after部分;2、把正六边形分成三个宽高相同的p,然后使用定位以及css3 transform:rotate分别向左右旋转60deg形成正六边形即可。 本文操作环境:windows7系统、HTML5&&amp…

    2025年12月24日 好文分享
    000
  • css如何让字改变透明度

    css让字改变透明度的方法:1、使用opacity属性,给文字元素添加“opacity:透明度值;”样式即可;2、使用rgba()函数,给文字元素添加“color:rgba(red, green, blue, 透明度值);”样式即可。 本教程操作环境:windows7系统、CSS3&&amp…

    2025年12月24日
    000
  • css隐藏元素的方式有哪些

    方式:1、设置“display:none”语句;2、设置“visibility:hidden”语句;3、设置“opacity:0”语句;4、设置盒模型属性为0;5、利用“position:absolute;top:-9999px;”语句。 本教程操作环境:windows7系统、CSS3&&a…

    2025年12月24日
    000
  • css中如何设置元素宽度

    设置方法:1、使用width属性设置宽度,语法“width:宽度值;”;2、使用min-width属性设置最小宽度,语法“min-width:宽度值;”;3、使用max-width属性设置最大宽度,语法“max-width:宽度值;”。 本教程操作环境:windows7系统、CSS3&&am…

    2025年12月24日 好文分享
    000
  • 手把手教你使用css制作表格边框设置效果(附代码)

    之前的文章《一招教你使用css3制作按钮添加动态效果(代码分享)》中,给大家介绍了怎么使用css3制作按钮添加动态效果。下面本篇文章给大家介绍怎么使用css制作表格边框设置效果,我们一起看看怎么做。 网页中常常有这样的表格布局边框,给大家分享一下看效果图看完效果,我们来研究一下是怎么实现呢,给大家用…

    2025年12月24日 好文分享
    000

发表回复

登录后才能评论
关注微信