作家
登录

IE对网页中引入CSS样式表的限制

作者: 来源:www.28hudong.com 2012-11-19 22:58:22 阅读 我要评论

  首先介绍一下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合并前除掉相同的项,减少代码量。

  推荐阅读

  CSS教程:闭合CSS浮动元素的几种方法

  按照CSS规范,浮动元素(floats)会被移出文档流,不会影响到块状盒子的布局而只会影响内联盒子(通常是文本)的排列。因此当其高度超出包含容器时,一般父容器不会自动伸长以闭合浮动元素。但是有时我们却需>>>详细阅读


本文标题:IE对网页中引入CSS样式表的限制

地址:http://www.17bianji.com/kaifa2/CSS/17447.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)