CSS动画属性性能详细介绍

  • CSS动画属性会触发整个页面的重排relayout、重绘repaint、重组recomposite
  • Paint通常是其中最花费性能的,尽可能避免使用触发paint的CSS动画属性,这也是为什么我们推荐在CSS动画中使用 webkit-transform: translateX(3em) 的方案代替使用 left: 3em ,因为left会额外触发layout与paint,而webkit-transform只触发整个页面composite

div {

-webkit-animation-duration: 5s;

-webkit-animation-name: move;

-webkit-animation-iteration-count: infinite;

-webkit-animation-direction: alternate;

width: 200px;

height: 200px;

margin: 100px;

background-color: #808080;

position: absolute;

}

@-webkit-keyframes move{

from {

left: 100px;

}

to {

left: 200px;

}

}

如下图使用left将持续触发页面重绘,表现为红色边框:

 

@-webkit-keyframes move{

from {

-webkit-transform: translateX(100px);

}

to {

-webkit-transform: translateX(200px);

}

}

附:《[韩顺平]轻松搞定网页设计(html+css+js)》 http://www.gooln.com/dir/16908.html

如下图使用-webkit-transform页面只发生重组,表现为橙色边框:

  • CSS属性在CSS动画中行为表

高性能 CSS3 动画

高性能移动Web相较PC的场景需要考虑的因素也相对更多更复杂,我们总结为以下几点: 流量、功耗与流畅度。 在PC时代我们更多的是考虑体验上的流畅度,而在Mobile端本身丰富的场景下,需要额外关注对用户基站网络流量使用的情况,设备耗电量的情况。

关于流畅度,主要体现在前端动画中,在现有的前端动画体系中,通常有两种模式:JS动画与CSS3动画。 JS动画是通过JS动态改写样式实现动画能力的一种方案,在PC端兼容低端浏览器中不失为一种推荐方案。 而在移动端,我们选择性能更优浏览器原生实现方案:CSS3动画。

然而,CSS3动画在移动多终端设备场景下,相比PC会面对更多的性能问题,主要体现在动画的卡顿与闪烁。

目前对提升移动端CSS3动画体验的主要方法有几点:

尽可能多的利用硬件能力,如使用3D变形来开启GPU加速

-webkit-transform: translate3d(0, 0, 0);

-moz-transform: translate3d(0, 0, 0);

-ms-transform: translate3d(0, 0, 0);

transform: translate3d(0, 0, 0);

如动画过程有闪烁(通常发生在动画开始的时候),可以尝试下面的Hack:

-webkit-backface-visibility: hidden;

-moz-backface-visibility: hidden;

-ms-backface-visibility: hidden;

backface-visibility: hidden;

-webkit-perspective: 1000;

-moz-perspective: 1000;

-ms-perspective: 1000;

perspective: 1000;

如下面一个元素通过translate3d右移500px的动画流畅度会明显优于使用left属性:

#ball-1 {

transition: -webkit-transform .5s ease;

-webkit-transform: translate3d(0, 0, 0);

}

#ball-1.slidein {

-webkit-transform: translate3d(500px, 0, 0);

}

#ball-2 {

transition: left .5s ease;

left: 0;

}

#ball-2.slidein {

left: 500px;

}

注:3D变形会消耗更多的内存与功耗,应确实有性能问题时才去使用它,兼在权衡

尽可能少的使用box-shadowsgradients

box-shadowsgradients往往都是页面的性能杀手,尤其是在一个元素同时都使用了它们,所以拥抱扁平化设计吧。

尽可能的让动画元素不在文档流中,以减少重排

 

position: fixed;

position: absolute;

优化 DOM layout 性能

我们从实例开始描述这个主题:

 

var newWidth = aDiv.offsetWidth + 10;

aDiv.style.width = newWidth + ‘px‘;

var newHeight = aDiv.offsetHeight + 10;

aDiv.style.height = newHeight + ‘px‘;

var newWidth = aDiv.offsetWidth + 10;

var newHeight = aDiv.offsetHeight + 10;

aDiv.style.width = newWidth + ‘px‘;

aDiv.style.height = newHeight + ‘px‘;

这是两段能力上完全等同的代码,显式的差异正如我们所见,只有执行顺序的区别。但真是如此吗?下面是加了说明注释的代码版本,很好的阐述了其中的进一步差异:

 

// 触发两次 layout

var newWidth = aDiv.offsetWidth + 10;   // Read

aDiv.style.width = newWidth + ‘px‘;     // Write

var newHeight = aDiv.offsetHeight + 10; // Read

aDiv.style.height = newHeight + ‘px‘;   // Write

// 只触发一次 layout

var newWidth = aDiv.offsetWidth + 10;   // Read

var newHeight = aDiv.offsetHeight + 10; // Read

aDiv.style.width = newWidth + ‘px‘;     // Write

aDiv.style.height = newHeight + ‘px‘;   // Write

从注释中可找到规律,连续的读取offsetWidth/Height属性与连续的设置width/height属性,相比分别读取设置单个属性可少触发一次layout。

从结论看似乎与执行队列有关,没错,这是浏览器的优化策略。所有可触发layout的操作都会被暂时放入 layout-queue 中,等到必须更新的时候,再计算整个队列中所有操作影响的结果,如此就可只进行一次的layout,从而提升性能。

关键一,可触发layout的操作,哪些操作下会layout的更新(也称为reflow或者relayout)?

我们从浏览器的源码实现入手,以开源Webkit/Blink为例, 对layout的更新,Webkit 主要通过 Document::updateLayout 与Document::updateLayoutIgnorePendingStylesheets 两个方法:

void Document::updateLayout()

{

ASSERT(isMainThread());

FrameView* frameView = view();

if (frameView && frameView->isInLayout()) {

ASSERT_NOT_REACHED();

return;

}

if (Element* oe = ownerElement())

oe->document()->updateLayout();

updateStyleIfNeeded();

StackStats::LayoutCheckPoint layoutCheckPoint;

if (frameView && renderer() && (frameView->layoutPending() || renderer()->needsLayout()))

frameView->layout();

if (m_focusedNode && !m_didPostCheckFocusedNodeTask) {

postTask(CheckFocusedNodeTask::create());

m_didPostCheckFocusedNodeTask = true;

}

}

void Document::updateLayoutIgnorePendingStylesheets()

{

bool oldIgnore = m_ignorePendingStylesheets;

if (!haveStylesheetsLoaded()) {

m_ignorePendingStylesheets = true;

HTMLElement* bodyElement = body();

if (bodyElement && !bodyElement->renderer() && m_pendingSheetLayout == NoLayoutWithPendingSheets) {

m_pendingSheetLayout = DidLayoutWithPendingSheets;

styleResolverChanged(RecalcStyleImmediately);

} else if (m_hasNodesWithPlaceholderStyle)

recalcStyle(Force);

}

updateLayout();

m_ignorePendingStylesheets = oldIgnore;

}

从 updateLayoutIgnorePendingStylesheets 方法的内部实现可知,其也是对 updateLayout 方法的扩展,并且在现有的 layout 更新模式中,大部分场景都是调用 updateLayoutIgnorePendingStylesheets 来进行layout的更新。

时间: 2024-10-10 14:42:06

CSS动画属性性能详细介绍的相关文章

css动画属性--小球移动

主体只有一个div <body> <div></div> </body> 样式部分(测试:目前的浏览器还是需要加前缀才能兼容) <style> * { margin: 0; padding: 0; } div { position: absolute; top: 0; left: 0; width: 100px; height: 100px; border-radius: 50px; border: 2px solid red; backgrou

[转]图解CSS的padding,margin,border属性(详细介绍及举例说明)

图解CSS的padding,margin,border属性 W3C组织建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来控制这个盒的属性,这些对像包括段落.列表.标题.图片以及层.盒模型主要定义四个区域:内容(content).边框距(padding).边界(border)和边距(margin). 对于初学者,经常会搞不清楚margin,background-color,background-image,padding,content,border之间的层次.关系和相互影响

【转】图解CSS的padding,margin,border属性(详细介绍及举例说明)

W3C组织建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来控制这个盒的属性,这些对像包括段落.列表.标题.图片以及层.盒模型主要定义四个区域:内容(content).边框距(padding).边界(border)和边距(margin). 对于初学者,经常会搞不清楚margin,background-color,background-image,padding,content,border之间的层次.关系和相互影响.这里提供一张盒模型的3D示意图,希望便于你的理解和记忆.

CSS3动画属性:动画(animation)

一:动画(animation)的参数详解 由于上面用到了animation动画,这里详细介绍下这个animation的参数. 简介 CSS动画(Animations)简单说就是在一段固定的动画时间内暗中在某一频率内改变其CSS某个或某些值,从而达到视觉上的转换动画效果.Animations的很多方面都是可以控制的,包括动画运行时间,开始值和结束值,还有动画的暂停和延迟其开始时间等. 语法 <single-animation> = <single-animation-name> ||

css3动画的性能优化

目前对提升移动端CSS3动画体验的主要方法有几点:尽可能多的利用硬件能力,如使用3D变形来开启GPU加速 -webkit-transform: translate3d(0, 0, 0); -moz-transform: translate3d(0, 0, 0); -ms-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); 一个元素通过translate3d右移500px的动画流畅度会明显优于使用left属性: 原因是

CSS3动画(性能篇)

写在前面 高性能移动Web相较PC的场景需要考虑的因素也相对更多更复杂,我们总结为以下几点: 流量.功耗与流畅度. 在PC时代我们更多的是考虑体验上的流畅度,而在Mobile端本身丰富的场景下,需要额外关注对用户基站网络流量使用的情况,设备耗电量的情况. 关于流畅度,主要体现在前端动画中,在现有的前端动画体系中,通常有两种模式:JS动画与CSS3动画. JS动画是通过JS动态改写样式实现动画能力的一种方案,在PC端兼容低端浏览器中不失为一种推荐方案. 而在移动端,我们选择性能更优浏览器原生实现方

css动画(transition/transform/animation)

在开发中,一个好的用户操作界面,总会夹杂着一些动画.css用对少的代码,来给用户最佳的体验感,下面我总结了一些css动画属性的使用方法及用例代码供大家参考,在不对的地方,希望大佬直接拍砖评论. 1 transition(过渡) 使用语法: transition: property duration timing-function delay; 参数: (1) property(设置过渡效果的css属性名称):none | all | property.none表示没有属性获得过渡效果:all表示

css常用样式属性详细介绍

对于初学css的来说,肯定会觉得这么多样式不好记,而且记住了也容易忘,其实刚开始我们不用去记这么多的样式,确实是记了也会忘,刚开始只需记住一些常用的就可以了,然后在慢慢的使用过程当中接触并学习一些高级点的,这才是一个靠谱的渐进过程,下面列出一些css常用属性,仅供参考 “文字”属性共有8项: 1.“字体”(font-family),设定时,需考虑浏览器中有无该字体. 2.“大小”(font-size),注意度量单位. 3.“粗细”(font-weight),除了normal(正常).bold(粗

Css3之高级-7 Css动画(概述、关键帧、动画属性)

一.动画概述 动画概念 - 过渡属性只能模拟动画效果 - animation 属性可以制作类似 Flash 动画 - 通过关键帧控制动画的每一步 - 使元素从一种样式逐渐变化为另一种样式 - 实现复杂的动画效果 - 浏览器兼容性 - 最新版本支持良好 - Chrome 和 Safari 需要前缀 -webkit- - FireFox 需要前缀 -moz- - Opera 需要前缀 -o- 动画示例 - 声明动画 - 创建一个已命名的动画 - 使用 @keyframes 声明动画的关键帧 - 为元