优化浏览器渲染

资源被下载到客户端后,浏览器仍需加载,解释,并渲染HTML、CSS和Javascript代码。只需利用现有浏览器的特性简单地编排你的代码和页面,就可以提升客户端的性能。

使用高效率的CSS选择器

概述

避免低效率的匹配大量元素的键选择器【key selectors】可以加快页面渲染。

详细信息

当浏览器解析HTML时首先构造一个内部文件树来代表所有显示的元素。然后浏览器根据标准的

CSS级联、继承和排序规则,为元素指定匹配的各种样式。在Mozilla里的执行情况(可能在其他浏览器也是这样),CSS搜索引擎通过样式规则为每个

元素找到匹配的样式。该引擎由右至左评估每个规则,从最右边的选择器开始(称为“键”【Key】),并通过移动每个选择器,直到找到一个匹配或丢弃的规

则。(“选择器”是应用规则的文档元素。)

基于此原则,引擎要评估的规则越少越好。所以提高渲染性能的重要一步就是删除未使用的CSS。在此之后,对包含大量的元素和/或CSS规则的页面来说,优化规则本身的定义就能够提高性能。优化规则的关键在于尽可能具体定义规则,并避免不必要的重复,让样式引擎快速找到匹配的规则,而不用花费时间查找不适用的规则。

下列各类规则被认为是低效的:

后代选择器的规则

例如:

通配选择器作为键的规则

body * {...}.hide-scrollbars * {...}

标签选择器作为键的规则

ul li a {...}#footer h3 {...}* html #atticPromo ul li a {...}

后代选择器是低效的,因为对于每个与键相匹配的元素,浏览器必须遍历DOM树,评估每一个祖先元素,直到找到一个匹配或到达根元素。键越不具体,需要进行评估的节点数量就越大。

子代选择器和相邻选择器的规则

例如:

通配选择器作为键的规则

body > * {...}.hide-scrollbars > * {...}

标签选择器作为键的规则

ul > li > a {...}#footer > h3 {...}

子代选择器和相邻选择器是低效的,因为对每个匹配的元素,浏览器必须评估另一个节点。这样导致规则中的每个子选择器加倍消耗。同样,键越不具体,需要进行评估的节点数量就越大。尽管如此,虽然同样效率低下,在性能方面相对后代选择器而言,它们仍然是可取的。

有多余修饰的规则

例如:

ul#top_blue_nav {...}form#UserLogin {...}

ID选择是唯一的定义。加上标签或类的限制只增加了多余的、引起不必要评估的信息。

对非链接元素应用

:hover

伪选择器的规则

例如:

h3:hover {...}.foo:hover {...}#foo:hover {...}div.faa:hover {...}

非链接元素上的:hover伪选择器在某些情况下*会使IE 7 和IE 8 变慢。当页面没有一个严格的doctype时,IE 7 和IE 8 将忽略除了链接外的任何元素的

:hover

。当页面有严格的doctype,在非链接元素上的

:hover

将导致性能下降。

建议

避免通配选择器。

允许元素继承祖先的样式,或者使用一个类来给多个元素应用样式。

使您的规则尽可能具体。

尽量使用class和ID选择器而非标签选择器。

删除多余的修饰语。

这些修饰语是多余的:

ID选择器被class选择器和/或者标签选择器限制。

class选择器被标签选择器限制(当一个类只是用于一个标签,无论如何这都是一个很好的设计实践)。

避免使用后代选择器,特别是那些指定多余祖先的。

例如,这一个规则

body ul li a {...}

指定了一个多余的body选择器, 因为所有的元素都是body标签的后代。

使用class选择器代替后代选择器。

例如,如果您需要有序列表项和无序列表项有不同的两个样式,而不是使用两个规则:

ul li {color: blue;}ol li {color: red;}

你可以将样式编码成两个类名并在规则中使用,例如:

.unordered-list-item {color: blue;}.ordered-list-item {color: red;}

如果您必须使用后代选择器,尽量使用子代选择器,这最少只需评估一个额外的节点,而非中间直至祖先的所有节点。

在IE中避免对非链接元素应用:hover。

如果您对非链接元素应用:hover,请在IE7和IE8中测试并确保页面可用。如果您发现:hover导致性能问题,可以考虑条件性的为IE使用JavaScript onmouseover事件(只对IE写mouseover事件)。

附加资源

避免CSS expressions

概述

CSS表达式会降低浏览器的渲染性能;用其他方案替换它们将会改善IE浏览器的渲染性能。

注意:本节最佳实践只适用于Internet Explorer 5到7,它们支持CSS表达式。Internet Explorer 8放弃使用CSS表达式,而其他浏览器是不支持的。

详细信息

作为一种动态改变文档属性来响应各种事件的的手段,Internet Explorer 5引入了CSS表达式或 “动态属性”。它们由在CSS声明中的CSS属性值里嵌入JavaScript表达式构成。在大多数情况下,它们用于以下目的:

模拟其他浏览器支持但IE浏览器尚未支持的标准CSS属性。

使用比编写全面JavaScript注入式样式更小巧,更便捷的方法,来提供动态样式和高级的事件处理。

不幸的是,CSS表达式对于性能的不良影响是相当大的,因为每当有事件触发,浏览器都要重新计

算每个表达式,如一个窗口改变大小,鼠标移动等。CSS表达式的低性能表现是IE

8弃用它们的原因之一。如果你在网页里使用CSS表达式,应该尽一切努力来消除它们并且使用其他方法来达到同样的功能。

建议

尽可能使用标准的CSS属性。

IE 8已高度兼容标准CSS;IE

8只有在“兼容”模式才支持运行CSS表达式,而在“标准”模式下则不支持。如果你不需要向后兼容旧版本的IE,你应该转换成标准的CSS属性来替换所有

对应的CSS表达式。如需CSS属性和支持它们的IE版本的完整列表,请参见MSDN的CSS属性索引。如果你确实需要支持所需CSS属性不可用的旧版本IE浏览器,请使用JavaScript来实现等效的功能。

使用JavaScript脚本样式。

如果你正在使用CSS表达式来实现动态样式,用纯JavaScript重写它们是很有意义的,因为这样既能提高IE性能,同时在其他浏览器获得相同效果的支持。在这个由MSDN动态属性页提供的例子里,下面的CSS表达式用于在浏览器里居中一个HTML块元素,并且该元素的尺寸可以在运行时改变,每次调整窗口大小都能重新定位在浏览器中心:

Example DIV

下面是一个使用JavaScript和标准CSS的等价例子:

// Check for browser support of event handling capability  if

(window.addEventListener) {  window.addEventListener("load", centerDiv,

false); window.addEventListener("resize", centerDiv, false);  } else if

(window.attachEvent) {  window.attachEvent("onload", centerDiv);  window.attachEvent("onresize", centerDiv);  } else {  window.onload

= centerDiv;  window.resize = centerDiv;  }  function centerDiv() {

var myDiv = document.getElementById("oDiv");  var myBody =

document.body;  var bodyWidth = myBody.offsetWidth;  //Needed for

Firefox, which doesn't support offsetHeight  var bodyHeight; if

(myBody.scrollHeight) bodyHeight = myBody.scrollHeight; else bodyHeight =

myBody.offsetHeight;  var divWidth = myDiv.offsetWidth;  if

(myDiv.scrollHeight)   var divHeight = myDiv.scrollHeight;   else var

divHeight = myDiv.offsetHeight; myDiv.style.top = (bodyHeight -

divHeight) / 2;  myDiv.style.left = (bodyWidth - divWidth) / 2;

}

如果您使用CSS表达式来模拟早期IE版本中不可用的CSS属性,你应该提供版本测试的javascript代码,为支持CSS的浏览器禁止CSS表达式。举例来说,max-width属性,这个属性在一定数量的像素范围内强制文本换行,在IE 7前是不支持的。下面的CSS表达式作为一种解决方法,为IE 5和6提供了这个功能:

p { width: expression( document.body.clientWidth > 600 ? "600px" : "auto" ); }

为不支持此属性的IE浏览器版本使用等价的JavaScript替换CSS表达式,可以使用类似于下面的内容:

if ((navigator.appName == "Microsoft Internet Explorer") &&

(parseInt(navigator.appVersion) < 7))  window.attachEvent("onresize",

setMaxWidth);  function setMaxWidth() {  var paragraphs =

document.getElementsByTagName("p");  for ( var i = 0; i <

paragraphs.length; i++ )  paragraphs[i].style.width = (

document.body.clientWidth > 300 ? "300px" : "auto" );

将样式放在页面头部

概述

将内联样式块和

元素从页面

移动到页面

中,这样能提高渲染性能。

详细信息

在HTML文件

中指定外部样式表和内联样式块可能对浏览器的渲染性能产生不利影响。浏览器阻塞渲染网页直到所有外部的样式表都已被下载。(用

标记指定的)内联样式块可能会导致reflows和页面跳动。因此,把外部样式表和内联样式块放在页面的

中是很重要的。通过确保样式表首先被下载和解析,可以让浏览器逐步渲染页面

建议

HTML 4.01规范(第12.3节)规定,始终把使用

标签的外部样式表放在

部分里。不要使用

@import

。还要确保您指定的样式有正确的顺序。

区块放在

部分里。

指定图片尺寸

概述

为页面中所有图片指定宽度和高度可以消除不必要的reflows和重新绘制页面【repaints】,使页面渲染速度更快。

详细信息

当浏览器勾画页面时,它需要能够流动的,如图片这样的可替换的元素。提供了图片尺寸,浏览器知

道去环绕附近的不可替换元素,甚至可以在图片下载之前开始渲染页面。如果没有指定的图片尺寸,或者如果指定的尺寸不符合图片的实际尺寸,一旦图片下载,浏

览器将需要reflows和重新绘制页面。为了防止reflows,在HTML的

标签中或在CSS中为所有图片指定宽度和高度。

建议

指定与图片本身相一致的尺寸

不要使用非图片原始尺寸来缩放图片。如果一个图片文件实际上的大小是60×60像素,不要在HTML或CSS里设置尺寸为30×30像素。如果图片需要较小的尺寸,在图像编辑软件中,设置成相一致的尺寸(详见优化图像。)

一定要指定图片或它的块级父元素的尺寸

一定要设置

元素本身,或它的块级父元素的尺寸。如果父元素不是块级元素,尺寸将被忽略。不要在一个非最近父元素的祖先元素上设置尺寸。

注:浏览器为了重新渲染部分或整个页面,重新计算页面元素位置和几何结构的进程叫做reflow

java浏览器渲染_优化浏览器渲染相关推荐

  1. ajax div 赋值重新渲染_优化向:单页应用多路由预渲染指南

    前言 Ajax 技术的出现,让我们的 Web 应用能够在不刷新的状态下显示不同页面的内容,这就是单页应用.在一个单页应用中,往往只有一个 html 文件,然后根据访问的 url 来匹配对应的路由脚本, ...

  2. java判断浏览器类型_判断浏览器类型

    一.判断是否为IE 以前判断是否IE浏览器用的是window.navigator.userAgent,跟踪这个信息,发现在开发环境,识别为IE10,但访问服务器则识别为IE11,但IE11的userA ...

  3. qq浏览器主页_安卓浏览器哪家强?这些小众好用的手机浏览器你知道吗

    前言 无论手机还是电脑,浏览器都可以说是最重要的软件之一了.最流行的 Chrome 和 Firefox,国内常见的还有 UC.QQ.360 浏览器等. 手机上可供选择的优秀浏览器还有很多,这次就推荐些 ...

  4. 后端数据成功返回 页面不渲染_在浏览器地址栏输入地址到页面渲染完成发生了什么?(下)...

    上一篇讲了前三步,本篇从第四步开始.下面是正文: 四.进行tcp三次握手,建立tcp连接. 简述一下,第三步我们找到了目标ip,并获得了服务器ip的mac地址.此时浏览器就会请求和服务器连接,用来传输 ...

  5. 谷歌浏览器如何启用java小脚本_各种浏览器开启JavaScript脚本方法

    随着网站设计技术的发展,为了用户友好体验,大部分网站使用了JavaScript脚本设计,如果您的浏览器禁用或关闭的JavaScript支持,那么可能造成网站体验差或网站部分功能无法使用 下面提供10种 ...

  6. 浏览器运行java的方法_通过浏览器运行java程序的两种方法

    方法一:Applet技术 现在有一个application,要把它转换成Applet. 首先,用eclipse打开这个项目. 然后找到要改的java类,让这个类继承Applet类或者JApplet类. ...

  7. Java插件自动保存浏览器书签_多浏览器书签同步插件EverSync

    有时上网时会遇到浏览器不能正常显示的问题.(比如我的火狐浏览器无法正确显示微信公众号管理后台,在chrome上可以正常显示),所以我的电脑里安装了chrome和firefox两个浏览器.但是时间长了, ...

  8. java返回字符串浏览器换行_解决浏览器显示页面长字符串换行问题总结

    问题产生 在web页面HTML中,容器(div,table等)中如果放入过长的字符串(英文.数字和部分标点符号组成,无空格),将会撑大容器,破坏页面外观. 出现这种情况基本有两个可能: 1. 人为的恶 ...

  9. vantabs多页渲染_选择引擎渲染页面

    X-UA-Compatible是针对ie8新加的一个设置,对于ie8之外的浏览器是不识别的,这个区别与content="IE=7"在无论页面是否 包含指令,都像是使用了 Windo ...

最新文章

  1. CT流程与CT图像的windowing操作(转载+整理)
  2. Multi-tenant or multi-instance?
  3. 突发,这个国家进入紧急状态!数十年来最严重经济危机、每天停电13小时!外交部发出提醒...
  4. 互联网晚报 | 4月12日 星期二 | ​A股三大指数集体收涨;国产游戏版号时隔8月重启核发;央行开展200亿元7天期逆回购操作...
  5. 解决eclipse模块导入后不识别为java项目
  6. python入门经典100题-Python基础训练100题(带答案)[DOC][47KB]
  7. 【TOGAF】DAY 1:如何通过 TOGAF 9 认证
  8. 嵌入式硬件转职软件开发,这十点是必不可少的技能
  9. 采用大规模或超大规模集成电路的计算机,采用大规模或超大规模集成电路的计算机属于_____计算机。...
  10. 怎么把蓝狐上的代码转为html,Ajax动态调用用户控件输出html
  11. 代码还是要亲自动手写才行啊
  12. Lake Shore低温温度传感器之Cernox
  13. 深入浅出--何为多线程(引用自大神Kyrie lrving)
  14. 来晚了,秋招五投大厂,成功拿下三家Offer,最终入职美团,分享我的美团1-4面(Java岗)
  15. 编写模板类时注意一点 2007-12-06 11:22
  16. gcc -Wl,--wrap,malloc 替换系统函数
  17. ADO 与ADO.NET
  18. JAVA简易网页浏览器
  19. linux美元符号切换为井号,MyBatis中井号与美元符号的区别
  20. Visual Studio Code(code)修改背景图片

热门文章

  1. [转载] 正则表达式“派别”简述
  2. POJ-2226 Muddy Fields 最小点集覆盖
  3. Bailian4004 数字组合【递归+DP】
  4. UVALive2245 POJ1131 HDU1376 ZOJ1086 Octal Fractions【进制】
  5. python 标准库 —— http(http.cookiejar)
  6. TCP/IP 协议 —— ARP
  7. Python 动图、动画制作 —— moviepy、matplotlib.animation
  8. 对数的应用 —— 数位(digits)的个数
  9. Tricks(十七) —— 数组与字典(map)
  10. Shell 操作(一)