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)中有如下限制: ◆ 文档中只有前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) {
        return;
    }
    var aCssText = [], aCloneLink = [];
    for (var i = aStyle.length - 1; i > -1; --i) {
        var o = aStyle[i];
        aCssText.push(o.innerHTML);
        if (i > 0) {
            o.parentNode.removeChild(o);
        }
    }
    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];
    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标记写在文档的底部。

posted @ 2013-01-09 20:28  魔本是道  阅读(130)  评论(0)    收藏  举报