搜索
首页web前端css教程使用CSS3实现60 fps移动动画3

Achieve 60 FPS Mobile Animations with CSS3

关键要点

  • 流畅的移动端动画需要关注关键渲染路径(CRP)中的合成步骤,使用transformopacity等属性,避免增加之前步骤的负担。
  • 避免使用lefttoprightbottom属性进行动画过渡,它们会导致不流畅的动画;应使用影响合成步骤的transform属性,让浏览器在动画开始前确定图层稳定性。
  • 为了达到每秒60帧的稳定帧率,使用GPU渲染动画,通过will-change属性将元素提升到另一个图层,避免浏览器处理布局渲染或绘制。

本文最初发表于OutSystems。感谢支持SitePoint的合作伙伴。

在移动应用中制作动画很容易。如果遵循以下技巧,在移动应用中正确地制作动画也很容易……尽管如今每个人都在移动设备上使用CSS3动画,但许多人使用方式不正确。开发人员经常忽略最佳实践。这是因为人们不理解这些实践存在的原因以及为什么它们受到如此强烈的支持。设备规格范围很广。因此,如果不优化代码,就会为大部分用户提供低于标准的体验。记住:一些高端旗舰设备功能强大,但世界上大多数人使用的设备与这些高性能设备相比,就像带有LCD屏幕的算盘。我们希望帮助您正确地利用CSS3的强大功能。为此,我们需要先了解一些事情。

理解时间线

浏览器在渲染和处理元素时会做什么?这个时间线称为关键渲染路径:

Achieve 60 FPS Mobile Animations with CSS3 图片来源:www.csstriggers.com

为了实现流畅的动画,我们需要专注于更改影响合成步骤的属性,而不是增加之前步骤的负担。

  1. 样式 Achieve 60 FPS Mobile Animations with CSS3 浏览器开始计算要应用于元素的样式——重新计算样式。

  2. 布局 Achieve 60 FPS Mobile Animations with CSS3 在接下来的步骤中,浏览器生成每个元素的形状和位置——布局。在这里,浏览器设置页面属性,例如宽度和高度,以及例如其边距或lefttoprightbottom

  3. 绘制 Achieve 60 FPS Mobile Animations with CSS3 浏览器将每个元素的像素填充到图层中。它参考这些属性:box-shadowborder-radiuscolorbackground-color等。

  4. 合成 这是您想要执行动画的地方,因为这是浏览器将所有图层绘制到屏幕上的时候。Achieve 60 FPS Mobile Animations with CSS3 现代浏览器可以很好地动画化四个样式属性,利用transformopacity属性。

    • 位置 — transform: translateX(n) translateY(n) translateZ(n);
    • 缩放 — transform: scale(n);
    • 旋转 — transform: rotate(ndeg);
    • 不透明度 — opacity: n;

如何达到每秒60帧

记住这一点,现在是撸起袖子加油干的时候了。让我们从HTML开始。我们将创建一个非常简单的结构并将我们的app-menu放在一个layout类中。

<div>
  <div></div>
  <div>
    <div></div>
  </div>
</div>

Achieve 60 FPS Mobile Animations with CSS3

错误的方法

.app-menu {
  left: -300px;
  transition: left 300ms linear;
}

.app-menu-open .app-menu {
  left: 0px;
  transition: left 300ms linear;
}

看到我们更改的属性了吗?应避免使用lefttoprightbottom属性进行过渡。这些不会创建流畅的动画,因为它们每次都会强制浏览器执行布局传递,这会影响所有元素的子元素。结果是这样的:

Achieve 60 FPS Mobile Animations with CSS3

该动画不够流畅。我们使用DevTools时间线检查幕后发生了什么,结果如下:

Achieve 60 FPS Mobile Animations with CSS3

绿色区域表示渲染动画所花费的时间。此数据显示帧率不规则且性能缓慢。“绿色条表示FPS。高条表示动画以60 FPS渲染。低条表示低于60 FPS。因此,理想情况下,您希望绿色条在整个时间线上始终保持较高。红色条也表示卡顿,因此,另一种衡量进度的方法是消除这些红色条。”感谢Kayce Basques!

使用Transform

.app-menu {
  -webkit-transform: translateX(-100%);
  transform: translateX(-100%);
  transition: transform 300ms linear;
}
.app-menu-open .app-menu {
  -webkit-transform: none;
  transform: none;
  transition: transform 300ms linear;
}

transform属性影响合成步骤,而不是布局。在这里,我们告知浏览器我们的图层在动画开始前是稳定的,因此在渲染动画时遇到的障碍更少。

Achieve 60 FPS Mobile Animations with CSS3

时间线正是这样反映的:

Achieve 60 FPS Mobile Animations with CSS3

结果开始变得更好,帧率似乎已经稳定,因此动画运行更流畅。

在GPU中运行动画

然后,让我们更上一层楼。为了真正使其运行流畅,我们将使用GPU渲染动画。

<div>
  <div></div>
  <div>
    <div></div>
  </div>
</div>

尽管一些浏览器仍然需要translateZ()translate3d()作为后备,但will-change属性是未来。此属性将元素提升到另一个图层,因此浏览器不必考虑布局渲染或绘制。

Achieve 60 FPS Mobile Animations with CSS3

看到它有多流畅了吗?时间线证实了这一点:

Achieve 60 FPS Mobile Animations with CSS3

动画的帧率更恒定,动画渲染速度更快。但在开头仍然有一个很长的帧运行:开头有点瓶颈。还记得我们一开始创建的HTML结构吗?让我们看看我们如何在JavaScript中控制app-menudiv:

.app-menu {
  left: -300px;
  transition: left 300ms linear;
}

.app-menu-open .app-menu {
  left: 0px;
  transition: left 300ms linear;
}

啊哈!我们在这里通过向layoutdiv添加类导致了一个问题。这迫使浏览器重新生成我们的样式树——这影响了渲染性能。

每秒60帧的黄油般顺滑的解决方案

如果我们将菜单创建在视口区域之外呢?将菜单放在隔离区域将确保我们只影响我们希望动画化的元素。因此,我们建议使用以下HTML结构:

.app-menu {
  -webkit-transform: translateX(-100%);
  transform: translateX(-100%);
  transition: transform 300ms linear;
}
.app-menu-open .app-menu {
  -webkit-transform: none;
  transform: none;
  transition: transform 300ms linear;
}

现在我们必须以稍微不同的方式控制菜单的状态。我们将使用JavaScript中的transitionend函数来操作在动画结束时删除的类中的动画。

.app-menu {
  -webkit-transform: translateX(-100%);
  transform: translateX(-100%);
  transition: transform 300ms linear;
  will-change: transform;
}

让我们将所有内容放在一起并检查结果。这是一个完整的启用CSS3的示例,所有内容都放在正确的位置:

function toggleClassMenu() {
  var layout = document.querySelector(".layout");
  if(!layout.classList.contains("app-menu-open")) {
    layout.classList.add("app-menu-open");
  } else {
    layout.classList.remove("app-menu-open");
  }
}
var oppMenu = document.querySelector(".menu-icon");
oppMenu.addEventListener("click", toggleClassMenu, false);

Achieve 60 FPS Mobile Animations with CSS3

时间线向我们展示了什么?

Achieve 60 FPS Mobile Animations with CSS3

全是绿色的条,宝贝。想看一个实际例子吗?点击这里。(此处应插入实际链接)

(此处应添加关于移动动画的常见问题解答部分,内容与原文档中的FAQs部分一致)

以上是使用CSS3实现60 fps移动动画3的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
揭开屏幕读取器的神秘面纱:可访问的表格和最佳实践揭开屏幕读取器的神秘面纱:可访问的表格和最佳实践Mar 08, 2025 am 09:45 AM

这是我们在形式可访问性上进行的小型系列中的第三篇文章。如果您错过了第二篇文章,请查看“以:focus-visible的管理用户焦点”。在

使用智能表单框架创建JavaScript联系表格使用智能表单框架创建JavaScript联系表格Mar 07, 2025 am 11:33 AM

本教程演示了使用智能表单框架创建外观专业的JavaScript表单(注意:不再可用)。 尽管框架本身不可用,但原理和技术仍然与其他形式的建筑商相关。

将框阴影添加到WordPress块和元素将框阴影添加到WordPress块和元素Mar 09, 2025 pm 12:53 PM

CSS盒子阴影和轮廓属性获得了主题。让我们查看一些在真实主题中起作用的示例,以及我们必须将这些样式应用于WordPress块和元素的选项。

比较5个最佳的PHP形式构建器(和3个免费脚本)比较5个最佳的PHP形式构建器(和3个免费脚本)Mar 04, 2025 am 10:22 AM

本文探讨了Envato Market上可用的PHP表单构建器脚本,比较了其功能,灵活性和设计。 在研究特定选项之前,让我们了解PHP形式构建器是什么以及为什么要使用一个。 PHP形式

使用GraphQL缓存使用GraphQL缓存Mar 19, 2025 am 09:36 AM

如果您最近开始使用GraphQL或审查了其优点和缺点,那么您毫无疑问听到了诸如“ GraphQl不支持缓存”或

使您的第一个自定义苗条过渡使您的第一个自定义苗条过渡Mar 15, 2025 am 11:08 AM

Svelte Transition API提供了一种使组件输入或离开文档(包括自定义Svelte Transitions)时动画组件的方法。

展示,不要说展示,不要说Mar 16, 2025 am 11:49 AM

您花多少时间为网站设计内容演示文稿?当您撰写新的博客文章或创建新页面时,您是在考虑

优雅且酷的自定义CSS卷轴:展示柜优雅且酷的自定义CSS卷轴:展示柜Mar 10, 2025 am 11:37 AM

在本文中,我们将深入研究滚动条。我知道,这听起来并不魅力,但请相信我,一个精心设计的页面是齐头并进的

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

仓库:如何复兴队友
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。