颁蝉蝉性能优化2. 选择符的性能 <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 次 多层嵌套 3. 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; } 4. div div div p a.className div div div p a.class 0001 { background: #CFD; } … div div div p a.class 1000 { background: #CFD; } 5. div div div p * div div div p * { background: #CFD; } 6. 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; } 8. a a { background: #CFD; } 17. reflow 对于 DOM 结构中的各个元素都有自己的盒子(模型),这些都需要浏览器根据各种样式(浏览器的、开发人员定义的等)来计算,并 根据计算结果将元素放到它该出现的位置 ,这个过程称之为 reflow 19. 触发 reflow 的原因 改变窗囗大小 改变文字大小 添加 / 删除样式表 内容的改变,如用户在输入框中敲字 激活伪类,如 :hover (IE 里是一个兄弟结点的伪类被激活 ) 操作 class 属性 脚本操作 DOM 计算 offsetWidth 和 offsetHeight 设置 style 属性 —— 来自于 Yahoo! 性能工程师 Nicole Sullivan 的总结 20. 减少 reflow 的触发 尽可能限制 reflow 的影响范围 最好通过设置 style 的方式 实现元素的动画, position 属性应当设为 fixed 或 absolute 权衡速度的平滑 不要用 table 布局 不要使用 IE 私有的 css expression —— Yahoo! 性能工程师 Nicole Sullivan 对减小 reflow 影响的建议 21. 继续减少 reflow 的触发 把 CSS 放在 <head></head> 区域内 设定图片的尺寸大小 不用 @import 方式引入 CSS 24. 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; } 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 产生的前提下,选择符的嵌套层级尽可能少,最好不要超过三层