首页 > web前端 > css教程 > 如何使CSS框阴影动画并优化性能

如何使CSS框阴影动画并优化性能

Joseph Gordon-Levitt
发布: 2025-02-11 08:24:10
原创
939 人浏览过

如何使CSS框阴影动画并优化性能

>在本文中,您将学习如何在不降低浏览器性能的情况下对CSS框阴影进行动画。

在CSS中,Box-Shadow属性用于将阴影添加到Web元素中,这些阴影可以是动画的。但是,影子动画会影响浏览器的性能,从而在渲染页面时会滞后。

本指南旨在针对具有HTML的工作知识和CSS动画的前端开发人员。

钥匙要点

    >动画CSS框阴影会影响浏览器性能,可能导致页面渲染期间滞后。因此,至关重要的是优化这些动画以维持快速的页面加载时间,这是用户满意度和转换率的关键因素。
  • >
  • > css伪造动画触发了三个主要过程:绘画,布局和合成。绘画涉及浏览器填充颜色的像素,是资源最密集的。布局更改涉及重新计算页面的结构,还消耗了大量资源。仅影响页面部分的组合是要求最少的过程。 为了优化性能,开发人员可以采用多种技术。其中包括仅动画阴影的不透明度而不是更改其偏移值,从而减少了重新粉刷的需求;使用多个盒子阴影层,动画时表现出色。并为提供阴影的伪元素进行动画,从而大大减少重新粉刷和总体CPU工作量的数量。
  • >保持阴影动画的最小化和仅动画交互式元素以减少CPU工作量。如果需要阴影动画,开发人员应权衡深度视觉吸引力与仅更改不透明度的性能优势之间的权衡。他们还应考虑为提供阴影的伪元素动画所需的额外代码。
  • 为什么这很重要
  • >一个网页必须有很短的负载时间,理想情况下是五秒钟。研究表明,快速的页面加载可以极大地提高转化率。进一步的研究表明,有70%的用户表示网站的速度会影响他们从在线商店购买的意愿。基本上,快速站点平等快乐的用户。
  • >
>在进一步之前,这里有一个演示盒子阴影动画可以在网页上运行的演示。您可以滚动浏览并与Web元素进行交互。

参见笔

通过sitepoint(@sitepoint)

的带有阴影动画的Web元素 在Codepen上。

>三个主要CSS盒子暗示动画事件

由于幕后发生的事情,CSS弹幕动画可能会很重。在Box Shadow Animation(或任何形式的动画)中触发了三个主要过程或事件。这些事件是绘画,布局和合成。

  • 绘画。在绘画中,浏览器充满了颜色的像素,而Box-Shadow是触发此事件的CSS属性之一。基本上,它在动画的每个帧中都会创建一个新的阴影。根据Mozilla的说法,理想的CSS动画应在60fps。

  • 布局。一些动画会改变页面的结构,这可能会导致许多样式的重新计算。一个很好的例子是侧边栏在扩展时将其他元素推开。引起的CSS属性包括填充,边距,边框。

    >

    简单地说,如果动画属性影响其他元素,它将改变页面的布局,导致重新计算 - 使用大量系统资源。

  • >合成。在合成中,只有页面的一部分更改。 CSS属性(如不透明度和转换)仅影响其应用于的元素。这将意味着更少的样式重新计算,并且动画更顺畅。组合是所有三个中的任务最少的过程。
  • >

  • >使用浏览器的检查器工具,您可以实时观察此过程。首先,打开检查器工具(如下图所示),然后单击选项卡右上角的三个点。检查更多工具并选择渲染。

如何使CSS框阴影动画并优化性能在此示例中,选择了油漆闪烁。每次有绘画事件时,屏幕都会闪烁绿色:

> navbar:

  • 如何使CSS框阴影动画并优化性能文本卡:

  • 如何使CSS框阴影动画并优化性能导航链接:

  • 如何使CSS框阴影动画并优化性能
  • >您会发现,当您悬停在绿色时,或者刷新页面时,每个元素都会闪烁绿色。您也可以对布局进行相同的实验:只需取消选中的油漆闪烁并选择布局偏移区域。

>

请注意,涂料闪烁可能在Codepen演示中不起作用,因此您需要使用文本编辑器的实时预览尝试一下。下面的视频显示了您应该看到的内容。

目标是最大程度地减少绘画和布局的变化,因为它们使用了更多的系统资源。

检查性能

作为开发人员,您可能没有任何问题,因为您有一台快速计算机。但是,您必须考虑使用较慢的PC和不可靠的Internet连接的用户。仅仅因为它在您的计算机上看起来不错,并不意味着其他地方都一样。

> 一个盒子阴影具有四个值和一个颜色。这四个值分别是阴影的水平位置(x偏移),垂直位置(y偏移),扩展和模糊半径。典型的阴影动画将涉及其中一个或多个值的更改:>

让我们创建一个简单的盒子阴影动画,从一些html开始:

<span>box-shadow: <x-offset> <y-offset> <spread> <blur> <color>;
</span>
登录后复制
登录后复制
登录后复制
>这是一些首字母和最终阴影的CSS:

这是结果:
<span><span><span><body</span>></span>
</span>  <span><span><span><div</span> class<span>="box"</span>></span><span><span></div</span>></span>
</span><span><span><span></body</span>></span>
</span>
登录后复制
登录后复制
登录后复制

>

参见笔
<span><span>.box</span> {
</span>  <span>box-shadow: 0px 5px 10px 0px <span>rgba(0, 0, 0, 0.5)</span>;
</span>  <span>transition: transform ease 0.5s, box-shadow ease 0.5s;
</span><span>}
</span><span><span>.box:hover</span> {
</span>  <span>transform: translateY(-5px);
</span>  <span>box-shadow: 0px 10px 20px 2px <span>rgba(0, 0, 0, 0.25)</span>;
</span><span>}
</span>
登录后复制
登录后复制
sitepoint(@sitepoint)的动画盒子阴影

在Codepen上。


对于动画,我们正在更改Y偏移,模糊和传播的值。我们也将带有更透明的最终阴影。

>现在让我们来看看幕后的情况,我们运行了0.5s的动画。在浏览器上,通过右键单击和选择“检查”打开开发人员工具。工具打开后,请转到“性能”选项卡。您可以记录影子动画;只有几秒钟就足以看到发生了什么。

>

下面的屏幕截图显示了您从Chrome的Devtools中找到的。

>阴影的动画周期悬停在上下,在顶部突出显示,并且发生的过程分解在底部显示。分解表明,脚本需要7ms,渲染需要55毫秒,绘画持续30ms。

现在,这些数字看起来还可以,但是当CPU慢四倍时会发生什么?您可以从“性能”选项卡中防止CPU速度。

>以下图显示了使用较慢的CPU运行相同动画时会发生什么。如何使CSS框阴影动画并优化性能

在这个新过程中,加载需要6ms。脚本最高为52毫秒,渲染已翻了一番,达到117ms,现在绘画为72毫秒。

>您还可以节流网络速度,并使CPU甚至更慢。影子动画使用了大量系统资源,我们将寻求消除一些负载。>

>重要的是要注意,转换属性在CPU执行方式中起着作用。稍后再详细介绍。

>

如何保持最佳性能

如果您必须在网页上进行动画阴影,则值得使它们更具性能。在本节中,您将了解可以调整阴影动画的各种方式,以便降低性能。

我们将介绍以下内容:

    动画不透明度
  1. 有多个盒子层
  2. >
  3. 动画伪元素
  4. 使用变换属性
动画不透明度

使用RGBA颜色时,Alpha通道控制不透明度。在CPU上进行动画阴影时,仅更改Alpha频道就不会像更改阴影的偏移和传播值那样难。

在第一个动画中,只有阴影的不透明度在变化,而在第二个动画中,y offset从10px变为20px,差异从20px变为40px。

>在6倍放缓时他们的性能(因此您可以清楚地看到性能图),从动画开始,只有不透明度正在改变:
<span>box-shadow: <x-offset> <y-offset> <spread> <blur> <color>;
</span>
登录后复制
登录后复制
登录后复制

>大约需要两秒钟才能悬停在盒子上和盒子上。现在将其与第二个影子动画进行比较。

如何使CSS框阴影动画并优化性能

再次开出两秒钟,所有事件的时间都有明显的增加。绘画之前是96毫秒,现在翻了一番,达到187毫秒。渲染是合成的一部分,也从97ms上升到178ms。 因此,仅更改阴影的不透明度会产生更具性能的动画。

这是这两个动画的现场演示。如何使CSS框阴影动画并优化性能

参见笔

sitepoint(@sitepoint)

的动画不透明度与动画偏移 在Codepen上。

>层状阴影


如果您观察到桌子周围的阴影或将物体提起上面,您会注意到其最黑暗的阴影区域最接近物体,并且随着它向外扩散时,它变得越来越轻。 一个盒子阴影,复制这种效果并不容易。分层阴影看起来好多了。即使增加了阴影层,它们也会产生更多的性能动画。

让我们比较单个盒子阴影和多层阴影的性能:

这个动画具有148ms的渲染和133ms的绘画。

现在,让我们有一个带有两个盒子阴影层的阴影动画:>

<span><span><span><body</span>></span>
</span>  <span><span><span><div</span> class<span>="box"</span>></span><span><span></div</span>></span>
</span><span><span><span></body</span>></span>
</span>
登录后复制
登录后复制
登录后复制

差异很明显。分层阴影不仅会产生看起来更好的阴影效果,而且在动画时表现出色。渲染已从148ms降低到74ms,绘画也从133ms降至74ms。

这是两者的现场演示。

>

参见笔

单个阴影与层面阴影动画按SitePoint(@SitePoint)
在Codepen上。

现在,让我们尝试一些不同的东西,在动画过程中添加第二个阴影:

<span>box-shadow: <x-offset> <y-offset> <spread> <blur> <color>;
</span>
登录后复制
登录后复制
登录后复制

如何使CSS框阴影动画并优化性能>在动画过程中添加第二个阴影层的性能不如从一开始就拥有两层,但它的绘画仍然具有100毫秒的绘画,而单个盒子射击动画则是133毫秒,这是一个改进。

>最终,由您决定您的影子外观以及将使用哪种方法来创建它。

动画伪元素

这次,我们将在不更改盒子阴影属性的情况下复制影子动画。从以前的演示中,我们可以看到影子动画期间仍有很多重新粉刷。如果您要更改盒子阴影值,则无法避免此过程。

>您会在本节的末尾看到绘画将几乎完全消除。它将涉及更多的代码行,但是我们将获得更多性能的影子动画。

>因此,在盒子的基本样式之后,创建一个:伪元素之后并给它给它一个盒子阴影,这将是动画之后阴影的最终状态

现在,您要做的就是更改伪元素的不透明度:悬停:

>让我们在常规的影子动画旁边看一下。
<span><span><span><body</span>></span>
</span>  <span><span><span><div</span> class<span>="box"</span>></span><span><span></div</span>></span>
</span><span><span><span></body</span>></span>
</span>
登录后复制
登录后复制
登录后复制

<span><span>.box</span> {
</span>  <span>box-shadow: 0px 5px 10px 0px <span>rgba(0, 0, 0, 0.5)</span>;
</span>  <span>transition: transform ease 0.5s, box-shadow ease 0.5s;
</span><span>}
</span><span><span>.box:hover</span> {
</span>  <span>transform: translateY(-5px);
</span>  <span>box-shadow: 0px 10px 20px 2px <span>rgba(0, 0, 0, 0.25)</span>;
</span><span>}
</span>
登录后复制
登录后复制

参见笔

sitepoint(@sitepoint)

在Codepen上。


>在此处视觉上没有太多要进行的。真正的区别在于他们的表现。常规盒子动画的结果如下所示。
>

>它具有230ms的渲染时间,绘画的211毫秒。现在是伪阴影动画。

如何使CSS框阴影动画并优化性能

这次,我们有148ms的渲染,只有51毫秒的绘画。还有更多代码,但结果值得。

使用变换属性

>这主要适用于将具有阴影的主要元素,即盒子。使用变换属性,而不是更改诸如保证金之类的布局属性,将减少样式重计的数量。

此属性可以与翻译或比例属性一起使用,以模拟将元素从页面上抬起,从而产生深度的幻觉。

一些有用的提示

>已经确定,任何涉及盒子阴影属性的动画都会影响性能。因此,如果您必须拥有CSS盒子影画动画,这里有一些有用的技巧可以牢记。

>

首先,保持最小。为此,不要在每个元素上扔阴影。其次,仅动画交互式元素。无需动画任何没有功能的东西。这将减少CPU的工作量并大大提高性能。

结论

阴影可以视觉上增强您的网站,但它们也会影响性能,尤其是在动画方面。在本文中,我们测试了有关动画阴影的各种方法,并比较了它们的性能。动画阴影触发了三个事件 - 绘画,布局更改和合成 - 首先是任务最多的事件。

理想的解决方案是完全不动画阴影(因为它们看起来不错!)。如果您真的想为盒子阴影属性做动画,而只是更改不透明度而不是更改偏移值将减少重新粉刷。捕获是,您会失去阴影要提供的深度幻想。另一种方法是使两个盒子阴影层动画。该解决方案在视觉上令人愉悦,即使具有额外的阴影。

>最后一个选项是动画不是盒子阴影,而是一个提供阴影的伪元素。这大大减少了重新粉刷的数量以及CPU在运行动画方面所做的整体工作。您将编写更多代码,但这是确保表现良好的最好的选择。

>

相关内容:

> css:is,:where and:

>将元素隐藏在CSS

中的10种方法
    book:
  • > css master
  • CSS中的REM:理解和使用REM单位
  • 关于CSS Shadow的常见问题解答 >
  • CSS中的盒子阴影是什么? >>盒子阴影属性中的值是什么意思?

    值代表:水平偏移:阴影的水平距离。
    垂直偏移:阴影的垂直距离。
    模糊半径:施加到阴影的模糊量: 选修的。
    颜色:阴影的颜色。

    我可以使用盒子遮阳元素应用多个阴影吗?

    是的,您可以通过逗号分隔每个阴影来应用多个阴影。

    >我可以在任何HTML元素上使用盒子阴影吗?

    es,您可以将盒子阴影应用于大多数HTML元素,例如Divs,段落,标题等。它是一种用途属性,用于增强元素的可视化呈现。

    使用盒子阴影时的性能注意事项?

    >过度使用盒子阴影,尤其是具有较大的模糊值,可能会影响性能。建议明智地使用阴影来保持光滑的用户体验,尤其是在功能较低的设备上。

以上是如何使CSS框阴影动画并优化性能的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板