王朝网络
分享
 
 
 

IE对网页中引入CSS样式表的限制

王朝html/css/js·作者佚名  2008-06-01
宽屏版  字体: |||超大  

首先介绍一下HTML文档与CSS 的关联常见有4种方式:

1、使用link标记

<link rel="stylesheet" type="text/css" href="sheet.css" />

2、使用style元素

<style type="text/css">

body{background:#fff;}

h1{font-size:2em;}

</style>

3、使用@import指令

<style type="text/css">

@import url(sheet1.css);

@import "sheet2.css";

</style>

4、使用style属性的内联样式(inline style)

<p style="color:#f00;">这是红色的字</p>

在实际应用中,使用style属性的内联样式是不推荐使用的,XHTML1.1已经将其标准为不建议使用,原因很简单这种方式不比font标记强多少,削弱了CSS集中控制整个文档外观的优点。

前3种方式利用了link标记和style标记,在IE(包括IE6、IE7和IE8 beta1)中有如下限制:

◆ 文档中只有前31个link或style标记关联的CSS能够应用。

从第32个开始,其标记关联的CSS都将失效。IE的官方文档All style tags after the first 30 style tags on an HTML page are not applied in Internet Explorer也提及这个限制,包括在使用.xsl的.xml文件也有这个限制。但是似乎写错了数量。请在IE看:

◆ 一个style标记只有前31次@import指令有效应用。

从第32个@import指令开始忽略。

◆ 一个css文件只有前31次@import指令有效应用。

从第31个@import指令开始忽略。

◆ 一个CSS文件的不能超过288kb?

这个消息来自Internet Explorer CSS File Size Limit。

IE对CSS的限制在绝大部分情况下是不会遇到的,即使遇到最佳的解决方案也应该是手动或者通过后端程序对CSS文件和响应的标记进行合并,最小化的http请求数是优化页面呈现的第一原则。

在IE中,可以通过document.styleSheets对象(Firefox、Opera9和Safari3.1都支持)修改内联和嵌入样式的值。该对象仅在文档包含style或link元素时可用,其实用document.styleSheets.length就可以看出IE下这个值最大是31。下面是利用Javascript来合并link和style标记来解决IE下的限制:

var fnMergeStyleSheet = function(){

if(!document.styleSheets){

return;

}

var aSheet = document.styleSheets,

aStyle = document.getElementsByTagName('style'),

aLink = document.getElementsByTagName('link');

if(aStyle.length + aLink.length < 32 !aSheet[0].cssText){

//document.styleSheets.cssText只有IE支持

return;

}

var aCssText = [],aCloneLink = [];

//把style标签中的样式存入,然后删掉该标签,但保留第一个

//因为由getElementsByTagName方法返回值是nodeList,所以删除时循环用倒序

for(var i=aStyle.length-1;i>-1;–i){

var o = aStyle[i];

aCssText.push(o.innerHTML);

if(i>0){

o.parentNode.removeChild(o);

}

}

//在IE中只有在31之内的link标签才能通过其styleSheet.cssText获取样式

//无法的获取复制到一个数组aCloneLink中

for(var i=aLink.length-1;i>-1;–i){

var o = aLink[i];

if(o.getAttribute && o.getAttribute(’rel’)===’stylesheet’){

if(o.styleSheet){

aCssText.push(o.styleSheet.cssText);

}else{

aCloneLink.push(o.cloneNode(true));

}

if(i>0){

o.parentNode.removeChild(o);

}

}

}

var oHead = document.getElementsByTagName(’head’)[0];

//通过前面的删除,前31个link或者style标记最多只剩下2个

//通过重新增加link节点的方法激活其styleSheet属性,从而获取样式

for(var i = aCloneLink.length-1;i>-1;–i){

var o = aCloneLink[i];

oHead.appendChild(o);

aCssText.push(o.styleSheet.cssText);

oHead.removeChild(o);

}

//把所有的样式都复制给第一个标签

aSheet[0].cssText += aCssText.join(”);

}

上面仅仅是一个简单的粗糙的解决方案,可以改进的地方还有:

1、没有考虑media这个属性,如果有多个media应该分别合并,当然更没有考虑link标记的rel="alternate stylesheet"带来的影响。但我更建议通过@media指令把相应的样式写在同一个文件中,至少可以减少HTTP连接数。

2、没有解决@import指令31次限制的问题,其实可以提取其href值然后进行激活处理。但是实际应用在建议用link标记来替代@import指令,应为在IE中@import指令相当与把link标记写在文档的底部。

3、一般来讲页面之所有出现大量的link或者style标签很可能有很多是相同的,可以在aCssText合并前除掉相同的项,减少代码量。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有