狠狠撸

狠狠撸Share a Scribd company logo
CSS 性能优化 ——  林小志  linxz
选择符的性能 <div id='outerdiv'> <div> <div><p class='pclass0001'><a id='id0001' class='class0001'>0001</a></p></div>  ... <div><p class='pclass1000'><a id='id1000' class='class1000'>1000</a></p></div> </div> </div>  1000 次 多层嵌套
div div div p.className a.className div div div p.pclass 0001  a.class 0001  { background: #CFD; } … div div div p.pclass 1000  a.class 1000  { background: #CFD; }
div div div p a.className div div div p a.class 0001  { background: #CFD; } … div div div p a.class 1000  { background: #CFD; }
div div div p * div div div p * { background: #CFD; }
div#outerdiv div div p.className a.className div#outerdiv div div p.pclass 0001  a.class 0001  { background: #CFD; } … div#outerdiv div div p.pclass 1000  a.class 1000  { background: #CFD; }
div#outerdiv div div p * div#outerdiv div div p * { background: #CFD; }
a a { background: #CFD; }
className .class 0001  { background: #CFD; } … .class 1000  { background: #CFD; }
选择符的性能
如何选择选择符??
浏览器的渲染和操作顺序
浏览器的渲染和操作顺序
浏览器的渲染和操作顺序
浏览器的渲染和操作顺序
页面加载、 reflow 过程示意
reflow 对于 DOM 结构中的各个元素都有自己的盒子(模型),这些都需要浏览器根据各种样式(浏览器的、开发人员定义的等)来计算,并 根据计算结果将元素放到它该出现的位置 ,这个过程称之为 reflow
页面加载、 reflow 过程示意 reflow_video_1.html   ? reflow_video_2.html   ?
触发  reflow  的原因 改变窗囗大小 改变文字大小 添加 / 删除样式表 内容的改变,如用户在输入框中敲字 激活伪类,如 :hover (IE 里是一个兄弟结点的伪类被激活 ) 操作 class 属性 脚本操作 DOM 计算 offsetWidth 和 offsetHeight 设置 style 属性 —— 来自于 Yahoo! 性能工程师 Nicole Sullivan 的总结
减少  reflow  的触发 尽可能限制 reflow 的影响范围 最好通过设置 style 的方式 实现元素的动画, position 属性应当设为 fixed 或 absolute 权衡速度的平滑 不要用 table 布局 不要使用 IE 私有的 css expression  —— Yahoo! 性能工程师 Nicole Sullivan 对减小 reflow 影响的建议
继续减少  reflow  的触发 把 CSS 放在 <head></head> 区域内 设定图片的尺寸大小 不用 @import 方式引入 CSS
repaint 当各种盒子的位置、大小以及其他属性,例如颜色、字体大小等都确定下来后, 浏览器于是便把这些元素都按照各自的特性绘制了一遍 ,于是页面的内容出现了,这个过程称之为 repaint
常见的触发  repaint  因素 visibility outline  color …
selector reflow repaint .link1  {  color:#0053aa;  text-decoration:none;font-size:22px;display:block; height:26px; } .link1:hover  { text-decoration:underline; color:red; height:36px; } div ul div span a  {  color:#0053aa;  text-decoration:none;font-size:22px;display:block; height:26px; } div ul div span a:hover  { text-decoration:underline; color:red; height:36px; }
div ul div span a
.link1
如何选择才会有收获!?
?

More Related Content

颁蝉蝉性能优化

Editor's Notes

  • #2: 这是多么一个扯淡的话题啊
  • #4: 选择符的应用都是 从右自左 ,关键的一个选择符就是 a.class0001 … a.class1000
  • #11: 从右到左的读取方式,最右边的是“目标选择器”,也就是最终会被 CSS 渲染的对象 从目前测试中看到的结果,直接标签选择符 a 标签这个是最快的(从数量上对比而言 4 个 ) 最慢的是那条最长的选择符(从数量上对比而言 3 个 )
  • #12: 该怎么用就怎么用,别嵌套太多就是了,现在这年头的页面,如果不是已经被优化到极限的页面,这么一点选择符的性能会对页面产生多少性能上的影响呢。
  • #13: 可以看出 javascript 脚本是可以在 dom 构造之前运行的
  • #14: 可以看出 javascript 脚本是可以在 dom 构造之前运行的
  • #15: 可以看出 javascript 脚本是可以在 dom 构造之前运行的
  • #16: 可以看出 javascript 脚本是可以在 dom 构造之前运行的
  • #18: 对于 DOM 结构中的各个元素都有自己的盒子(模型),这些都需要浏览器根据各种样式(浏览器的、开发人员定义的等)来计算并根据计算结果将元素放到它该出现的位置,这个过程称之为 reflow ;
  • #20: 激活伪类,尤其是 IE7 和 8 中使用 div:hover 的这类方式,而不是 a:hover 的方式
  • #21: reflow 是不可避免的,只能将 reflow 对性能的影响减到最小。 Css expression 除了 IE5-7 以外,其他的浏览器是不支持的, IE8 已经开始弃用了
  • #22: 图片的尺寸固定,避免浏览器对图片大小的 reflow 和 repaint 的过程 如果图片的大小不固定的话,那么可以考虑让图片的父级设置为块级元素,并给予一个宽高值
  • #24: repaint( 重绘 ) 是在一个元素的外观被改变,但没有改变布局的情况下发生,如改变 visibility 、 outline 、前景色。
  • #25: 在 IE8 中表现出来的结果 div ul div span a 显得比较卡,而 .link1 则显得相对比较流畅
  • #26: 在 IE8 中表现出来的结果 div ul div span a 显得比较卡,而 .link1 则显得相对比较流畅
  • #27: 在 IE8 中表现出来的结果 div ul div span a 显得比较卡,而 .link1 则显得相对比较流畅
  • #28: 在尽量减少 reflow 产生的前提下,选择符的嵌套层级尽可能少,最好不要超过三层