草庐IT

记录-一个栗子让你彻底弄懂CSS3补间动画和逐帧动画

林恒 2023-04-09 原文

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

CSS3提供了Animation关键帧动画,我们在工作中比较常用。但在写CSS动画的时候,其实Animation能实现两种动画模式:

补间动画

设置关键帧的初始状态,然后在另一个关键帧改变这个状态,比如大小、颜色、位置、透明度等,电脑将自动根据二者之间帧的值创建的动画。

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box{
            width:120px;
            height:63px;
            background-color: antiquewhite;
            /* animation: an1 2s linear 1; */
            /* 关键帧动画名称 */
            animation-name: an1;
            /* 一个动画周期的时长 */
            animation-duration:2s;
            /* 关键帧的 缓动函数 关键就在这里. 我们常用的有linear匀速 ease-in慢速开始 */
            animation-timing-function: linear;
            /* 动画执行次数 */
            animation-iteration-count: 1;
        }
        @keyframes an1{
            /* 这里定义了三个关键帧. */
            /* 第1帧和第2帧之间的中间效果由电脑计算后自动补全.  */
            /* 第2帧和第3帧之间的中间效果由电脑计算后自动补全.  */
            /* 这就是一个补间动画 */
            0%{
                transform: translateX(0px);
            }
            50%{
                transform: translateX(100px);
            }
            100%{
                transform: translateX(500px);
            }
        }
</style>
</head>
<body>
    <div class="box"></div>
</body>
</html>

执行效果:

逐帧动画

逐帧动画没有补间效果的,它不是电脑根据初始和结束状态的差异自动生成中间的过渡帧,而是每一帧都是关键帧,需要自己定义每一帧的状态。在Animation动画里面通过设置 animation-timing-function:step(number)来实现的。

比如下图(178 x 1122)里面有6只乌龟,实际上一只乌龟的游泳动作帧.。每张图连起来播放就是一只游泳的乌龟:

如果用补间动画通过改变图片的位置实现就是下面的效果:

用逐帧动画实现代码效果如下:

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .tortoise{
            width:178px;
            height:187px;
            background: url(./t.png) no-repeat;
            /* animation: an1 2s linear 1; */
            /* 关键帧动画名称 */
            animation-name: ani2;
            /* 一个动画周期的时长 */
            animation-duration:2s;
            /* 关键帧的 缓动函数 关键就在这里.*/
            /* 这里用step(6) 表示动画不是连续执行,而是间断地分成6段显示 因为我们的乌龟是6个动作. 
                如果是其它动画以此类推,分为几段关键帧显示.
            */
            animation-timing-function: steps(6);
            /* 动画执行次数 */
            animation-iteration-count: 1;
        }
        @keyframes ani2{
            /* 背景图片的Y轴位置变化.*/
            0%{
               background-position:0px 0px;
            }
            100%{
                background-position:0px -1122px;
            }
        }
</style>
</head>
<body>
    <div class="tortoise"></div>
</body>
</html>
通过上面的对比可以看出,逐帧动画一般用在动物或人的动作变化。动画里面比较多,主要偏向游戏类的,在大多数游戏动画里的角色效果都是逐帧动画。逐帧动画就像拍电影一样的,独立的每帧图显示,连续动起来就是一个动作,当然更多要和美术一起合作实现逐帧动画。

本文转载于:

https://juejin.cn/post/7218090232188698681

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

有关记录-一个栗子让你彻底弄懂CSS3补间动画和逐帧动画的更多相关文章

  1. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  2. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  3. ruby - capybara field.has_css?匹配器 - 2

    我在MiniTest::Spec和Capybara中使用以下规范:find_field('Email').must_have_css('[autofocus]')检查名为“电子邮件”的字段是否具有autofocus属性。doc说如下:has_css?(path,options={})ChecksifagivenCSSselectorisonthepageorcurrentnode.据我了解,字段“Email”是一个节点,因此调用must_have_css绝对有效!我做错了什么? 最佳答案 通过JonasNicklas得到了答案:No

  4. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  5. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  6. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  7. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  8. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  9. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  10. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

随机推荐