首先介绍一下HTML文档与CSS 的关联常见有4种方式:
1、使用link标记
<linkrel="stylesheet"type="text/css"href="sheet.css"/>
2、使用style元素
<styletype="text/css">
body{background:#fff;}
h1{font-size:2em;}
</style>
3、使用@import指令
<styletype="text/css">
@importurl(sheet1.css);
@import"sheet2.css";
</style>
4、使用style属性的内联样式(inlinestyle)
<pstyle="color:#f00;">这是红色的字</p>
在实际应用中,使用style属性的内联样式是不推荐使用的,XHTML1.1已经将其标准为不建议使用,原因很简单这种方式不比font标记强多少,削弱了CSS集中控制整个文档外观的优点。
前3种方式利用了link标记和style标记,在IE(包括IE6、IE7和IE8beta1)中有如下限制:
◆文档中只有前31个link或style标记关联的CSS能够应用。
从第32个开始,其标记关联的CSS都将失效。IE的官方文档Allstyletagsafterthefirst30styletagsonanHTMLpagearenotappliedinInternetExplorer也提及这个限制,包括在使用.xsl的.xml文件也有这个限制。但是似乎写错了数量。请在IE看:
◆一个style标记只有前31次@import指令有效应用。
从第32个@import指令开始忽略。
◆一个css文件只有前31次@import指令有效应用。
从第31个@import指令开始忽略。
◆一个CSS文件的不能超过288kb?
这个消息来自InternetExplorerCSSFileSizeLimit。
IE对CSS的限制在绝大部分情况下是不会遇到的,即使遇到最佳的解决方案也应该是手动或者通过后端程序对CSS文件和响应的标记进行合并,最小化的http请求数是优化页面呈现的第一原则。
在IE中,可以通过document.styleSheets对象(Firefox、Opera9和Safari3.1都支持)修改内联和嵌入样式的值。该对象仅在文档包含style或link元素时可用,其实用document.styleSheets.length就可以看出IE下这个值最大是31。下面是利用Javascript来合并link和style标记来解决IE下的限制:
varfnMergeStyleSheet=function(){
if(!document.styleSheets){
return;
}
varaSheet=document.styleSheets,
aStyle=document.getElementsByTagName('style'),
aLink=document.getElementsByTagName('link');
if(aStyle.length aLink.length<32||!aSheet[0].cssText){
//document.styleSheets.cssText只有IE支持
return;
}
varaCssText=[],aCloneLink=[];
//把style标签中的样式存入,然后删掉该标签,但保留第一个
//因为由getElementsByTagName方法返回值是nodeList,所以删除时循环用倒序
for(vari=aStyle.length-1;i>-1;–i){
varo=aStyle[i];
aCssText.push(o.innerHTML);
if(i>0){
o.parentNode.removeChild(o);
}
}
//在IE中只有在31之内的link标签才能通过其styleSheet.cssText获取样式
//无法的获取复制到一个数组aCloneLink中
for(vari=aLink.length-1;i>-1;–i){
varo=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);
}
}
}
varoHead=document.getElementsByTagName(’head’)[0];
//通过前面的删除,前31个link或者style标记最多只剩下2个
//通过重新增加link节点的方法激活其styleSheet属性,从而获取样式
for(vari=aCloneLink.length-1;i>-1;–i){
varo=aCloneLink[i];
oHead.appendChild(o);
aCssText.push(o.styleSheet.cssText);
oHead.removeChild(o);
}
//把所有的样式都复制给第一个标签
aSheet[0].cssText =aCssText.join(”);
}
上面仅仅是一个简单的粗糙的解决方案,可以改进的地方还有:
1、没有考虑media这个属性,如果有多个media应该分别合并,当然更没有考虑link标记的rel="alternatestylesheet"带来的影响。但我更建议通过@media指令把相应的样式写在同一个文件中,至少可以减少HTTP连接数。
2、没有解决@import指令31次限制的问题,其实可以提取其href值然后进行激活处理。但是实际应用在建议用link标记来替代@import指令,应为在IE中@import指令相当与把link标记写在文档的底部。
3、一般来讲页面之所有出现大量的link或者style标签很可能有很多是相同的,可以在aCssText合并前除掉相同的项,减少代码量。
1、使用link标记
<linkrel="stylesheet"type="text/css"href="sheet.css"/>
2、使用style元素
<styletype="text/css">
body{background:#fff;}
h1{font-size:2em;}
</style>
3、使用@import指令
<styletype="text/css">
@importurl(sheet1.css);
@import"sheet2.css";
</style>
4、使用style属性的内联样式(inlinestyle)
<pstyle="color:#f00;">这是红色的字</p>
在实际应用中,使用style属性的内联样式是不推荐使用的,XHTML1.1已经将其标准为不建议使用,原因很简单这种方式不比font标记强多少,削弱了CSS集中控制整个文档外观的优点。
前3种方式利用了link标记和style标记,在IE(包括IE6、IE7和IE8beta1)中有如下限制:
◆文档中只有前31个link或style标记关联的CSS能够应用。
从第32个开始,其标记关联的CSS都将失效。IE的官方文档Allstyletagsafterthefirst30styletagsonanHTMLpagearenotappliedinInternetExplorer也提及这个限制,包括在使用.xsl的.xml文件也有这个限制。但是似乎写错了数量。请在IE看:
◆一个style标记只有前31次@import指令有效应用。
从第32个@import指令开始忽略。
◆一个css文件只有前31次@import指令有效应用。
从第31个@import指令开始忽略。
◆一个CSS文件的不能超过288kb?
这个消息来自InternetExplorerCSSFileSizeLimit。
IE对CSS的限制在绝大部分情况下是不会遇到的,即使遇到最佳的解决方案也应该是手动或者通过后端程序对CSS文件和响应的标记进行合并,最小化的http请求数是优化页面呈现的第一原则。
在IE中,可以通过document.styleSheets对象(Firefox、Opera9和Safari3.1都支持)修改内联和嵌入样式的值。该对象仅在文档包含style或link元素时可用,其实用document.styleSheets.length就可以看出IE下这个值最大是31。下面是利用Javascript来合并link和style标记来解决IE下的限制:
varfnMergeStyleSheet=function(){
if(!document.styleSheets){
return;
}
varaSheet=document.styleSheets,
aStyle=document.getElementsByTagName('style'),
aLink=document.getElementsByTagName('link');
if(aStyle.length aLink.length<32||!aSheet[0].cssText){
//document.styleSheets.cssText只有IE支持
return;
}
varaCssText=[],aCloneLink=[];
//把style标签中的样式存入,然后删掉该标签,但保留第一个
//因为由getElementsByTagName方法返回值是nodeList,所以删除时循环用倒序
for(vari=aStyle.length-1;i>-1;–i){
varo=aStyle[i];
aCssText.push(o.innerHTML);
if(i>0){
o.parentNode.removeChild(o);
}
}
//在IE中只有在31之内的link标签才能通过其styleSheet.cssText获取样式
//无法的获取复制到一个数组aCloneLink中
for(vari=aLink.length-1;i>-1;–i){
varo=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);
}
}
}
varoHead=document.getElementsByTagName(’head’)[0];
//通过前面的删除,前31个link或者style标记最多只剩下2个
//通过重新增加link节点的方法激活其styleSheet属性,从而获取样式
for(vari=aCloneLink.length-1;i>-1;–i){
varo=aCloneLink[i];
oHead.appendChild(o);
aCssText.push(o.styleSheet.cssText);
oHead.removeChild(o);
}
//把所有的样式都复制给第一个标签
aSheet[0].cssText =aCssText.join(”);
}
上面仅仅是一个简单的粗糙的解决方案,可以改进的地方还有:
1、没有考虑media这个属性,如果有多个media应该分别合并,当然更没有考虑link标记的rel="alternatestylesheet"带来的影响。但我更建议通过@media指令把相应的样式写在同一个文件中,至少可以减少HTTP连接数。
2、没有解决@import指令31次限制的问题,其实可以提取其href值然后进行激活处理。但是实际应用在建议用link标记来替代@import指令,应为在IE中@import指令相当与把link标记写在文档的底部。
3、一般来讲页面之所有出现大量的link或者style标签很可能有很多是相同的,可以在aCssText合并前除掉相同的项,减少代码量。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
岱庙资源网 Copyright www.zgmyg.com
暂无“IE对网页中引入CSS样式表的限制”评论...
更新日志
2024年11月15日
2024年11月15日
- 群星《2024好听新歌14》十倍音质 U盘音乐 [WAV分轨][966M]
- s14全球总决赛T1战队队员都有谁 LOLs14全球总决赛T1战队介绍
- 英雄联盟faker身价有10亿吗 英雄联盟faker身价介绍一览
- faker大魔王称号怎么来的 faker大魔王称号来源介绍
- PS5 Pro上的蒂法更美了!博主盛赞新机1000%值得购买
- 腾讯互娱再离职一员大将!或因供应商贪腐
- Ayaneo3游戏掌机预热:旗舰定位、造型圆润自带底键
- 动力火车.1999-背叛情歌【上华】【WAV+CUE】
- 刘力扬.2019-Neon.Lit虹【摩登天空】【FLAC分轨】
- 群星.2002-恋爱物语情歌对唱精选2CD(引进版)【滚石】【WAV+CUE】
- 群星《闽南情24K德国HD金碟》2CD[WAV+CUE]
- 周传雄《恋人创世纪》环球唱片[WAV+CUE]
- 关淑怡-《真假情话K2HD》(日本压制)【WAV+CUE】
- 王菲 -《Faye Wong》雨果LPCD45 [WAV+分轨][1G]
- 陈百强《世纪10星·永恒篇》环球[WAV+CUE][1G]