put stylesheets at the top

法则5:将样式表放到HEAD中 Put Stylesheets at the Top

  在 Yahoo!,有一个小组在他们的项目中使用了一些DHTML特性。其中一个复杂的功能是是在发送邮件时会弹出一个DIV层。其实这个层并不影响其所在页 面的渲染,因为它是功能触发式的被渲染的页面部分,所以这个小组的前端工程师就把这个弹出层的CSS样式写到一个独立的样式表文件中,并把对该CSS的引 用放在页面的最下方的位置,以确保页面能较快的下载和渲染。
  我们知一个页面是由图片,样式表,scripts等组件渲染成的,而组件是按它们在页面中出现的顺序依次下载,把DHTML的动态功能的样式表文件放到后面,可以让更关健的组件先下载,这样能使页面更快的渲染显示给浏览者,好像事实应该是这样,不是吗。

事实是这样吗?

   其实采用上面的方式在IE下反而会更慢。经过不断尝试,我们还是把这个DHTML所需的样式表放到了页面的上方HEAD中,这时的页面载入是最快的。这 好像和我们所期望的有点相反,为什么我们把暂不渲染页面的CSS放到页面的上方位置,延缓了其它关健组件的下载,反而是加快了页面的载入速度呢?这就是我 们马上要开始介绍的法则5。

Progressive Rendering
逐步渲染


  前端工程师 总是希望他的页面能尽可能快的展示给用户,所以他们希望页面能够随着下载逐步渲染给用户,特别是在页面比较大或是用户使用较慢的网络连接时。有人曾经讨论 过给用户一个视觉反馈的重要性,提出要用视觉反馈来作为衡量进度的指标:让用户实实在在的感受到页面一块一块的渲染出来和让用户等着一个空白页让各组件下 载到本地再渲染,可能前一种方法的实际组件下载完的速度要慢,但用户会觉得这要快的多。

  把样式表放到页面的下方,在一些浏览器中(包 括IE)会阻止我们上面所期望的逐步渲染。因为浏览器如果发现页面中的下方有样式表的引用,就会不进行逐步的渲染以避免样式表的的变更所带来的重新渲染, 所以这个时候用户可能会看到一个空白页(其实可能网速并不慢,服务响应也够快,但您还是等一个空白页的过程)。Firefox则不会这样。

  在 HTML规范中 就清楚的说明了样式表要声明或引用在页面的HEAD中:"Unlike A, [LINK] may only appear in the HEAD section of a document, although it may appear any number of times."

  下面我们用数据来分析:
  CSS在页面的下方: http://stevesouders.com/hpws/css-bottom.php
  CSS在HEAD中: http://stevesouders.com/hpws/css-top.php
  CSS在HEAD中,并用 @import的方式引入: http://stevesouders.com/hpws/css-top-import.php
(注意,这种用@import引入的方式,即使您将css写在HEAD中,也会出现类似将css放在页面下方的情况,出现一个空白的页等待中)
  以上的三个页面中,组件和个数都一样。看看下面的三个页面的组件下载时序图:
5-1.gif

  第一个和第三个,都是在最后才下载样式表,这样就会导致在IE中,页面在6.3秒前都是不会被渲染的,而第二个页面,会最先下载样式表,这时页面就会开始渲染了。
  
  现在我们知道该怎么做了。把样式表以link文件的形式放进HEAD吧。 
`document.styleSheets` 是一个只读属性,它返回一个包含当前文档所有样式表的 StyleSheetList 对象。可以使用这个对象来获取和修改样式表。 下面是一些常用的 `styleSheets` 的用法: 1. 获取样式表列表 ```javascript const styleSheets = document.styleSheets; console.log(styleSheets); // 返回一个包含当前文档所有样式表的 StyleSheetList 对象。 ``` 2. 获取指定样式表 ```javascript const styleSheets = document.styleSheets; const styleSheet = styleSheets[0]; // 获取第一个样式表 console.log(styleSheet); // 返回第一个样式表 ``` 3. 获取样式规则列表 ```javascript const styleSheets = document.styleSheets; const styleSheet = styleSheets[0]; // 获取第一个样式表 const rules = styleSheet.cssRules || styleSheet.rules; // 获取样式规则列表 console.log(rules); // 返回样式规则列表 ``` 4. 插入新样式规则 ```javascript const styleSheets = document.styleSheets; const styleSheet = styleSheets[0]; // 获取第一个样式表 styleSheet.insertRule('.new-rule { color: red; }', 0); // 在第一个位置插入一条新的样式规则 ``` 5. 修改样式规则 ```javascript const styleSheets = document.styleSheets; const styleSheet = styleSheets[0]; // 获取第一个样式表 const rules = styleSheet.cssRules || styleSheet.rules; // 获取样式规则列表 const rule = rules[0]; // 获取第一个样式规则 rule.style.color = 'red'; // 修改样式规则的颜色为红色 ``` 总之,`document.styleSheets` 提供了一种非常灵活的方式来操作样式表中的样式规则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值