百翔网络博客

★百翔网络★24小时服务热线:029-87617572,6年网站建设经验,您身边的网站建设专家专业致力于西安网站建设,西安网站制作,西安网站设计,西安网站优化,西安网站推广,西安网站维护,西安网页设计,西安网页制作,西安网站托管,西安网站建设公司,西安网站制作公司,西安网站设计公司,西安网站优化公司,西安做网站的公司,西安网页设计公司,西安网页制作公司,西安网站推广公司,西安网站维护公司等业务,品质保障,追求卓越!

« css文字样式大全基于JavaScript的代码的自动生成工具 »

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

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

XML/HTML代码
  1. 使用link标记   
  2.   
  3. <link rel="stylesheet" type="text/css" href="sheet.css" />  
  4. 使用style元素   
  5.   
  6. <style type="text/css">  
  7. body{background:#fff;}   
  8. h1{font-size:2em;}   
  9. </style>  
  10. 使用@import指令   
  11.   
  12. <style type="text/css">  
  13. @import url(sheet1.css);   
  14. @import "sheet2.css";   
  15. </style>  
  16. 使用style属性的内联样式(inline style)   
  17.   
  18. <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看:

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

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

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

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

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

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

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

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

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

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

一个CSS文件的不能超过288kb?IE中每个style标签或css文件的选择符个数不能超过4095

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

@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下的限制:

XML/HTML代码
  1. var fnMergeStyleSheet = function(){   
  2. if(!document.styleSheets){   
  3.     return;   
  4. }   
  5. var aSheet = document.styleSheets,   
  6.     aStyle = document.getElementsByTagName('style'),   
  7.     aLink  = document.getElementsByTagName('link');   
  8.     if(aStyle.length + aLink.length < 32 || !aSheet[0].cssText){   
  9.         //document.styleSheets.cssText 只有IE支持    
  10.         return;   
  11.     }   
  12.     var aCssText = [],aCloneLink = [];   
  13.     //把style标签中的样式存入,然后删掉该标签,但保留第一个   
  14.     //因为由getElementsByTagName方法返回值是nodeList,所以删除时循环用倒序   
  15.     for(var i=aStyle.length-1;i>-1;--i){   
  16.         var o = aStyle[i];   
  17.             aCssText.push(o.innerHTML);   
  18.             if(i>0){   
  19.                 o.parentNode.removeChild(o);   
  20.             }   
  21.     }   
  22.     //在IE中只有在31之内的link标签才能通过其styleSheet.cssText获取样式   
  23.     //无法的获取复制到一个数组aCloneLink中   
  24.     for(var i=aLink.length-1;i>-1;--i){   
  25.        var o = aLink[i];   
  26.           if(o.getAttribute && o.getAttribute('rel')==='stylesheet'){   
  27.                if(o.styleSheet){   
  28.                   aCssText.push(o.styleSheet.cssText);   
  29.                }else{   
  30.                    aCloneLink.push(o.cloneNode(true));   
  31.                }   
  32.                if(i>0){   
  33.                    o.parentNode.removeChild(o);   
  34.                }   
  35.           }   
  36.     }   
  37.     var oHead = document.getElementsByTagName('head')[0];   
  38.     //通过前面的删除,前31个link或者style标记最多只剩下2个   
  39.     //通过重新增加link节点的方法激活其styleSheet属性,从而获取样式   
  40.     for(var i = aCloneLink.length-1;i>-1;--i){   
  41.         var o = aCloneLink[i];   
  42.         oHead.appendChild(o);   
  43.         aCssText.push(o.styleSheet.cssText);   
  44.         oHead.removeChild(o);   
  45.     }   
  46.    //把所有的样式都复制给第一个标签   
  47.     aSheet[0].cssText += aCssText.join('');   
}
  • 相关文章:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

网站分类

最新评论及回复

最近发表

网站收藏

友情链接

图标汇集

Powered By 西安网站建设西安网站优化西安seoseo论坛西安安防监控

Copyright 2008-2010 百翔网络www.fly810.com, All Rights Reserved.