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

2016-02-19 23:14 2 1 收藏

只要你有一台电脑或者手机,都能关注图老师为大家精心推荐的IE对网页中引入CSS样式表的限制,手机电脑控们准备好了吗?一起看过来吧!

【 tulaoshi.com - Web开发 】

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)  首先介绍一下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)中有如下限制:

◆ 文档中只有前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下的限制:

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(i0){
                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(i0){
                   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合并前除掉相同的项,减少代码量。

来源:https://www.tulaoshi.com/n/20160219/1629493.html

延伸阅读
标签: Web开发
一.在学习css之前你应该掌握哪些基础知识 1.什么是网页,什么是超文本语言(html)。 2.会使用Dreamweaver等常用的网页编辑器。 Dreamweaver是现今最好的网站编辑工具之一,而Dreamweaver8增加的对CSS的支持更是你容易得来使用CSS,用它来给制作网页的CSS样式表会更简单、更方便。本教程教你如何利用Dreamweaver8在页面中加...
标签: Web开发
说明为什么现有的几种CSS隐藏文字的方法的缺陷和新的方法如何弥补。实用性一般,但是这个方法挺新颖的。 1.display:none;的缺陷 搜索引擎可能认为被隐藏的文字属于垃圾信息而被忽略 屏幕阅读器(是为视觉上有障碍的人设计的读取屏幕内容的程序)会忽略被隐藏的文字。 2. visibility: hidden ;的缺陷 这...
在学习中遇到问题可以到 论坛 发贴交流! 本例为CSS入门系列教程,在这一课中我们将学习如何在网页中插入CSS样式表,主要学习在页面中插入链入外部样式表、内部样式表、导入外表样式表和内嵌样式的四种方法,另外作者还讲解了多重样式表的叠加的运用以及如何在xml中插入CSS,希望能给对网页制作感兴趣的朋友带来帮助~~ CSS入门教程之如何在...
标签: Web开发
这是一篇很久以前的文章了,现在看来,其中的思想很值得大家学习,在webjx.com学习案例的同时,不仿学习一些理论的知识,对您知识的突破会很有帮助。大家加油! 自从看了Zeldman先生的力作Designing with Web Standards中文版为《网站重构》(第2版)一书,感受颇深,坚定了我用web标准的思想,去开发实践我们的项目...
标签: Web开发
最近和一程序员合作项目。弄的我头都大了~埋怨我的CSS命名看不懂~得按照他的来。结果我打开他的页面,看了看,从头第一个开始就是contentCommon,下面全部是content****. 我说明了我的理由,过了半会,似乎是接受了,却突然来一句:“不要用H标签嘛!还有不要用UL来定义导航等“。对于很多合作过的程序员,大多都是这样,命名规范大多是自成一派。...

经验教程

936

收藏

50

精华推荐

CSS样式表书写顺序

CSS样式表书写顺序

帮大哥55

CSS样式表最佳习惯

CSS样式表最佳习惯

金燕商标注册

CSS样式表常用技巧

CSS样式表常用技巧

还我音乐梦

微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部