IE对CSS样式表的限制和解决方案

作者:秦歌 来源:随网之舞 时间:2008-04-28 12:27:00 

HTML文档与CSS的关联常见有4种方式:

1.使用link标记

  1. <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)中有如下限制:

  1. 文档中只有前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看:

    例1:34个style标记同时应用

    例2:1个style标记和34个link标记同时应用

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

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

    例3:在一个style标记中使用34次@import指令

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

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

    例4:用link标记引入一个使用34次@import指令的css文件

    例5:用style标记引入一个使用34次@import指令的css文件

    例6:例4:用link和style标记分别引入一个使用31次@import指令以上的css文件

  4. 一个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例2,可以改进的地方还有:

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

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

  3. 一般来讲页面之所有出现大量的link或者style

标签:@import,IE,CSS,cssText,document.styleSheet
0
投稿

猜你喜欢

  • 网站大改版=壮烈的死亡 ?

    2009-04-03 14:09:00
  • 关于鼠标、键盘的几个事件的例子

    2008-07-27 17:00:00
  • Asp截获后台登录密码的代码

    2012-12-04 20:20:38
  • JavaScript中尽量用局部变量的原因[译]

    2009-02-20 13:45:00
  • 防采集,几种觉得有用的防采集方法

    2009-09-03 13:30:00
  • MySQL重定位数据库目录的内容

    2009-02-26 16:03:00
  • 对SQL Server聚集索引的指示综合描述

    2010-08-31 14:25:00
  • MySQL在命名用过程中所遇到的常见问题

    2008-12-05 16:03:00
  • 如何前后翻阅聊友们的发言?

    2010-01-18 20:49:00
  • 一空间多域名绑定不同目录方法

    2009-03-09 18:32:00
  • asp如何向前端显示用户请求的信息?

    2010-06-09 18:52:00
  • 详解new function(){}和function(){}()

    2008-02-28 12:28:00
  • 不要犯WEB字体编辑的10种错误

    2008-08-19 12:55:00
  • 使用ACCESS做网络版程序的四种解决方案

    2009-01-14 16:22:00
  • CSS模块化设计—从空格谈起

    2007-12-15 09:41:00
  • 用VB编写ActiveX DLL实现ASP编程

    2008-10-21 21:28:00
  • 通过视图修改数据时所应掌握的基本准则

    2009-01-07 14:22:00
  • 关于超级链接的一些问题

    2007-12-07 14:00:00
  • ASP中Cache技术的应用

    2007-09-28 12:41:00
  • Qzoneing主题视觉设计分享

    2009-07-21 18:12:00
  • asp之家 网络编程 m.aspxhome.com