`
caibinghong
  • 浏览: 149810 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

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

 
阅读更多

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

  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:用link和style标记分别引入一个使用31次@import指令以上的css文件

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

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

  5. @import指令下层叠限制不能超过4层

    在IE下通过@import指令引入css文件时,第5层会失效。这个限制来自Cascade limit via @import rule。实际上,由于浏览器对多层嵌套的支持不完善,所以即使不得已使用了@import指令引入CSS文件,也不要超过2层。

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

在IE中,可以通过document.styleSheets对象(Firefox、Opera9和Safari3.1都支持)修改内联和嵌入样式的值。该对象仅在文档包含style或link元素时可用,其实用document.styleSheets.length就可以看出IE下这个值最大是31。下面是利用Javascript来合并linkstyle标记来解决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标记写在文档的底部,会导致在IE5/6页面加载时瞬间无样式问题,学名叫“Flash of Unstyled Content”(简称为FOUC)的bug,当然可以通过在文档头中放一个link或script元素可以避免这个bug。
  3. 一般来讲页面之所有出现大量的link或者style标签很可能有很多是相同的,可以在aCssText合并前除掉相同的项,减少代码量。
分享到:
评论

相关推荐

    IE对CSS样式表的限制分析与解决方案

    然而,在使用IE浏览器时,开发者可能会遇到一些对CSS样式表的限制。本文将分析这些限制并提供相应的解决方案。 首先,我们需要了解HTML文档与CSS关联的几种常见方式。它们分别是使用link标记引入外部CSS文件、使用...

    ie-css3.htc 免费版

    使用ie-css3.htc的方法很简单,只需要在CSS样式表中将ie-css3.htc文件作为行为(behavior)属性关联到需要CSS3效果的元素: ```css selector { behavior: url(/path/to/ie-css3.htc); /* 其他CSS3属性,如border-...

    解决ie9、ie10本地css加载不上的解决方法实例

    在IT行业中,尤其是在Web开发领域,兼容性问题一直是一大挑战。Internet Explorer(IE)作为曾经的主流...提供的压缩包文件“本地ie9+10加载css样式”应该包含了一个示例,你可以参考这个例子来实践上述解决方案。

    css区别IE和非IE浏览器

    通过合理运用上述提到的各种CSS Hack技术和兼容性解决方案,可以有效地解决不同版本IE浏览器以及其他非IE浏览器之间的兼容性问题,从而确保网站在各种环境下都能够呈现出一致且良好的用户体验。

    精通CSS高级Web标准解决方案-包含源码(高清PDF中文版)

    1.3 规划、组织和维护样式表 1.3.1 对文档应用样式 1.3.2 对代码进行注释 1.3.3 样式指南 1.3.4 组织样式表以便简化维护 1.4 小结 第2章 可视化格式模型 2.1 框模型概述 2.1.1 IE/Win和框模型 2.1.2 空白边...

    ie-css3(让ie6 ie7 ue8支持css3).rar

    标题中的“ie-css3(让ie6 ie7 ue8支持css3).rar”指的是一个针对Internet Explorer(IE)浏览器的解决方案,尤其是版本6、7和8,这些版本不原生支持CSS3的新特性。这个压缩包包含了一个名为“ie-css3(让ie678支持css...

    ie8兼容h5css3解决方案

    "PIE.htc"和"PIE_IE678.js"是用于解决IE8对CSS3边框圆角、阴影等效果支持不足的解决方案。PIE(Position: -pie-)是一个行为(Behavior)文件,它可以使得IE6到IE8支持CSS3的border-radius、box-shadow等属性。它...

    针对firefox ie6 ie7 ie8的css样式hack

    1. **代码冗余**:使用CSS Hack会增加CSS代码量,使得样式表变得臃肿。 2. **维护成本**:随着浏览器更新换代,旧的Hack可能不再适用,需要定期检查并更新。 3. **浏览器识别**:不同的浏览器版本可能会识别不同的...

    CSS样式兼容IE6、IE7、IE8、FF火狐浏览器的方法

    在探讨CSS样式兼容IE6、IE7、IE8与火狐浏览器的方法时,我们需深入理解不同浏览器对CSS的支持差异,以及如何通过特定的技术手段确保网页在这些浏览器中的一致性和美观性。以下是对这一主题的详细解析: ### 1. 了解...

    css样式表及其调用

    - Flexbox和Grid布局提供更现代的布局解决方案。 8. CSS预处理器(如Sass、Less): - 使用变量、嵌套规则、混合和函数,提高代码可读性和可维护性。 9. CSS响应式设计: - 使用媒体查询(media queries)根据...

    IE兼容CSS3

    总之,解决IE浏览器对CSS3的兼容问题主要依赖于像Modernizr这样的工具,它们能够检测浏览器的特性并提供适应性的解决方案。通过学习和实践,开发者可以确保他们的网站在各种浏览器上都能呈现出一致且良好的用户体验...

    解决ie9、ie10本地css加载不上的解决方法

    其中,一个常见的问题是本地HTML页面中的CSS样式表或外部JavaScript文件无法正常加载。本文将详细介绍如何解决IE9和IE10在本地环境中加载CSS和JS失败的问题。 #### CSS加载失败的原因分析 当在IE9或IE10中打开本地...

    css样式表手册

    本《CSS样式表中文手册》将全面覆盖这些主题,并提供实例演示和代码解析,帮助读者掌握CSS并应用于实际项目。通过学习,你将能够熟练运用CSS进行网页设计,创造出美观、高效且响应式的网页界面。

    IE6, IE7, IE8 CSS 兼容速查表

    这份“IE6, IE7, IE8 CSS 兼容速查表”就是为了解决这一问题而编写的,它提供了关于这些浏览器中CSS特性的详尽对比和解决方案。 1. **CSS盒模型差异**:IE6、7采用了独特的盒模型,其中`width`属性包含了边框和内...

    让IE支持CSS3选择器的插件

    在IT领域,尤其是在前端开发中,CSS3是现代网页设计不可或缺的一部分,它引入了许多新的选择器,极大地增强了样式表的功能和灵活性。然而,早期版本的Internet Explorer(IE)浏览器,尤其是IE8及以下版本,对CSS3...

    ie支持css3部分功能

    在IT行业中,CSS3是层叠样式表的第三版,带来了许多令人兴奋的新特性,显著提升了网页设计的视觉效果和用户体验。然而,IE(Internet Explorer)浏览器,特别是早期版本,对CSS3的支持并不完全,这使得开发者在创建...

    让ie兼容css选择器

    尽管这些库可以极大地提升IE的CSS兼容性,但值得注意的是,它们并不是万能的解决方案。在某些情况下,可能仍需要针对特定的IE版本编写额外的CSS hack或者使用JavaScript进行样式调整。此外,随着IE浏览器逐渐被淘汰...

    解决IE不兼容css3圆角和阴影问题

    4. 使用条件注释:在HTML中,可以使用IE特有的条件注释来加载专门为IE编写的CSS,这样可以为IE提供单独的样式表,其中包含解决圆角和阴影的替代方案。 5. 引入polyfill库:一些现代JavaScript库,如Modernizr,可以...

    CSS样式表设计的十条技巧

    根据给定的文件信息,以下是对“CSS样式表设计的十条技巧”中提及的知识点的详细解析: ### 1. CSS 字体简写规则 在CSS中,可以通过使用简写属性来减少代码量并提高可读性。对于字体属性,可以将`font-size`, `...

Global site tag (gtag.js) - Google Analytics