您现在的位置:主页 > 网站制作 > CSS+DIV >

InternetExplorer对CSS样式的限制以及解决方案-Div+CSS教程

来源:建站吧 责任编辑:Jzq8 发表时间:2011-12-22 点击:
  Internet Explorer对CSS样式的限制以及解决方案

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

1、使用link标记

div css xhtml xml Example Source Code Example Source Code [www.mb5u.com] <link rel="stylesheet" type="text/css" href="sheet.css" />
2、使用style元素

div css xhtml xml Example Source Code Example Source Code [www.mb5u.com] <style type="text/css">
body{background:#fff;}
h1{font-size:2em;}
</style>
3、使用@import指令

div css xhtml xml Example Source Code Example Source Code [www.mb5u.com] <style type="text/css">
@import url(sheet1.css);
@import "sheet2.css";
</style>
4、使用style属性的内联样式(inline style)

div css xhtml xml Example Source Code Example Source Code [www.mb5u.com] <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下的限制:

div css xhtml xml Example Source Code Example Source Code [www.mb5u.com] 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合并前除掉相同的项,减少代码量。

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      评价:
      表情:
      验证码:点击我更换图片

      推荐图文

      • Div+CSS布局入门教程-页面顶部制作之一
      • Div+CSS布局入门教程-页面布局与规划
      • 建站吧:精简高效的CSS命名准则和方法
      • CSS初学者技巧:谈CSS的标准和最佳示例-Div+CSS教程
      • Google谷歌的CSS前景图片合并技术-Div+CSS教程
      • WEB标准网页布局中HTML结构化漫谈-Div+CSS教程
      • CSS网页布局经验:CSS框架思维雏形与CSS文件精简-Div+CSS教程
      • CSSSprites工作原理及其对CSS布局的意义、优点和缺点介绍-Div+CS
      • CSS布局之再谈CSSDiv的居中实现方法-Div+CSS教程

      新闻关注排行榜

      热门推荐 最新推荐
      Alexa - 客户服务 - 联系方法 - 招聘信息 - 友情链接 - 网站地图 - TAG标签 - RSS订阅
      Copyright © 2010-2012 JZQ8.COM. 建站吧|建站去吧 版权所有
      冀ICP备09002514号
      冀ICP备09002514号 网络报警 企业法人营业执照 中国互联网协会 支付宝付款 网银在线付款