<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>随网之舞@import</title>
	<atom:link href="http://dancewithnet.com/tag/import/feed/" rel="self" type="application/rss+xml" />
	<link>http://dancewithnet.com</link>
	<description>WEB Design{HTML:CSS:Javascript:DOM:AJAX:PHP:Usability}/Viewpoint/Photo/Food/Mood</description>
	<lastBuildDate>Mon, 18 Jul 2011 02:45:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>IE对CSS样式表的限制和解决方案</title>
		<link>http://dancewithnet.com/2008/04/22/a-solution-of-limit-of-style-tags-in-ie/</link>
		<comments>http://dancewithnet.com/2008/04/22/a-solution-of-limit-of-style-tags-in-ie/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 08:39:33 +0000</pubDate>
		<dc:creator>秦歌</dc:creator>
				<category><![CDATA[HTML & CSS]]></category>
		<category><![CDATA[Javascript & DOM & AJAX]]></category>
		<category><![CDATA[@import]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[cssText]]></category>
		<category><![CDATA[document.styleSheet]]></category>
		<category><![CDATA[IE]]></category>

		<guid isPermaLink="false">http://dancewithnet.com/?p=1281</guid>
		<description><![CDATA[HTML文档与CSS的关联常见有4种方式：


使用link标记
&#60;link rel="stylesheet" type="text/css" href="sheet.css" /&#62;


使用style元素
&#60;style type="text/css"&#62;
body{background:#fff;}
h1{font-size:2em;}
&#60;/style&#62;


使用@... ]]></description>
			<content:encoded><![CDATA[<p>HTML文档与CSS的关联常见有4种方式：</p>
<ol>
<li>
<p><strong>使用link标记</strong></p>
<pre><code>&lt;link rel="stylesheet" type="text/css" href="sheet.css" /&gt;</code></pre>
</li>
<li>
<p><strong>使用style元素</strong></p>
<pre><code>&lt;style type="text/css"&gt;
body{background:#fff;}
h1{font-size:2em;}
&lt;/style&gt;</code></pre>
</li>
<li>
<p><strong>使用@import指令</strong></p>
<pre><code>&lt;style type="text/css"&gt;
@import url(sheet1.css);
@import "sheet2.css";
&lt;/style&gt;</code></pre>
</li>
<li>
<p><strong>使用style属性的内联样式(inline style)</strong></p>
<pre><code>&lt;p style="color:#f00;"&gt;这是红色的字&lt;/p&gt;</code></pre>
</li>
</ol>
<p>在实际应用中，使用style属性的内联样式是不推荐使用的，XHTML1.1已经将其标准为不建议使用，原因很简单这种方式不比font标记强多少，削弱了CSS集中控制整个文档外观的优点。前3种方式利用了link标记和style标记，在IE(包括IE6、IE7和IE8 beta1)中有如下限制：<span id="more-1281"></span></p>
<ol>
<li>
<p><strong>文档中只有前31个link或style标记关联的CSS能够应用。</strong></p>
<p>从第32个开始，其标记关联的CSS都将失效。IE的官方文档<a href="http://support.microsoft.com/kb/262161/en-us">All style tags after the first 30 style tags on an HTML page are not applied in Internet Explorer</a>也提及这个限制，包括在使用.xsl的.xml文件也有这个限制。但是似乎写错了数量。请在IE看：</p>
<p><a href="http://dancewithnet.com/lab/2008/a-solution-of-limit-of-style-tags-in-ie/index.html" class="link-btn">例1：34个style标记同时应用</a></p>
<p><a href="http://dancewithnet.com/lab/2008/a-solution-of-limit-of-style-tags-in-ie/link.html" class="link-btn">例2：1个style标记和34个link标记同时应用</a></p>
</li>
<li>
<p><strong>一个style标记只有前31次<code>@import</code>指令有效应用。</strong></p>
<p>从第32个@import指令开始忽略。请看：</p>
<p><a href="http://dancewithnet.com/lab/2008/a-solution-of-limit-of-style-tags-in-ie/import.html" class="link-btn">例3：在一个style标记中使用34次<code>@import</code>指令</a>。</p>
</li>
<li>
<p><strong>一个css文件只有前31次@import指令有效应用。</strong></p>
<p>从第31个@import指令开始忽略。请看：</p>
<p><a href="http://dancewithnet.com/lab/2008/a-solution-of-limit-of-style-tags-in-ie/link-import.html" class="link-btn">例4：用link标记引入一个使用34次<code>@import</code>指令的css文件</a></p>
<p><a href="http://dancewithnet.com/lab/2008/a-solution-of-limit-of-style-tags-in-ie/import-import.html" class="link-btn">例5：用style标记引入一个使用34次<code>@import</code>指令的css文件</a></p>
<p><a href="http://dancewithnet.com/lab/2008/a-solution-of-limit-of-style-tags-in-ie/link-import-new.html" class="link-btn">例6：用link和style标记分别引入一个使用31次<code>@import</code>指令以上的css文件</a></p>
</li>
<li>
<p><del datetime="2009-09-10T23:45:30+08:00"><strong>一个CSS文件的不能超过288kb？</strong></del><ins datetime="2009-09-10T23:45:30+08:00"><a href="http://dancewithnet.com/2009/09/10/ie-css-4095-limit/">IE中每个style标签或css文件的选择符个数不能超过4095</a></ins></p>
<p><del datetime="2009-09-10T23:45:30+08:00">这个消息来自<a href="http://joshua.perina.com/africa/gambia/fajara/post/2008/1/25/internet-explorer-css-file-size-limit">Internet Explorer CSS File Size Limit</a>。</del></p>
</li>
<li>
<p><ins datetime="2008-05-05T00:13:37+08:00" cite="http://www.quirksmode.org/bugreports/archives/2005/02/Cascade_limit_via_import_rule.html"><strong>@import指令下层叠限制不能超过4层</strong></ins></p>
<p>在IE下通过@import指令引入css文件时，第5层会失效。这个限制来自<a href="http://www.quirksmode.org/bugreports/archives/2005/02/Cascade_limit_via_import_rule.html">Cascade limit via @import rule</a>。实际上，由于浏览器对多层嵌套的支持不完善，所以即使不得已使用了@import指令引入CSS文件，也不要超过2层。</p>
</li>
</ol>
<p>IE对CSS的限制在绝大部分情况下是不会遇到的，即使遇到最佳的解决方案也应该是手动或者通过后端程序对CSS文件和响应的标记进行合并，<a href="http://developer.yahoo.com/performance/rules.html#num_http">最小化的http请求数是优化页面呈现的第一原则</a>。</p>
<p>在IE中，可以通过<a href="http://msdn2.microsoft.com/en-us/library/ms535871.aspx"><code>document.styleSheets</code>对象</a>（Firefox、Opera9和Safari3.1都支持）修改内联和嵌入样式的值。该对象仅在文档包含style或link元素时可用，其实用<code>document.styleSheets.length</code>就可以看出IE下这个值最大是31。下面是利用Javascript来合并<code>link</code>和<code>style</code>标记来解决IE下的限制：</p>
<pre><code>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){
        <span>//document.styleSheets.cssText 只有IE支持 </span>
        return;
    }
    var aCssText = [],aCloneLink = [];
    <span>//把style标签中的样式存入，然后删掉该标签，但保留第一个
    //因为由getElementsByTagName方法返回值是nodeList，所以删除时循环用倒序</span>
    for(var i=aStyle.length-1;i>-1;--i){
        var o = aStyle[i];
            aCssText.push(o.innerHTML);
            if(i>0){
                o.parentNode.removeChild(o);
            }
    }
    <span>//在IE中只有在31之内的link标签才能通过其styleSheet.cssText获取样式
    //无法的获取复制到一个数组aCloneLink中</span>
    for(var i=aLink.length-1;i>-1;--i){
       var o = aLink[i];
          if(o.getAttribute &#038;&#038; 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];
    <span>//通过前面的删除，前31个link或者style标记最多只剩下2个
    //通过重新增加link节点的方法激活其styleSheet属性，从而获取样式</span>
    for(var i = aCloneLink.length-1;i>-1;--i){
        var o = aCloneLink[i];
        oHead.appendChild(o);
        aCssText.push(o.styleSheet.cssText);
        oHead.removeChild(o);
    }
   <span>//把所有的样式都复制给第一个标签</span>
    aSheet[0].cssText += aCssText.join('');
}</code></pre>
<p>上面仅仅是一个简单的粗糙的解决方案，演示请看<a href="http://dancewithnet.com/lab/2008/a-solution-of-limit-of-style-tags-in-ie/index.html" class="link-btn">例1</a>和<a href="http://dancewithnet.com/lab/2008/a-solution-of-limit-of-style-tags-in-ie/link.html" class="link-btn">例2</a>，可以改进的地方还有：</p>
<ol>
<li>没有考虑<code>media</code>这个属性，如果有多个<code>media</code>应该分别合并，当然更没有考虑<code>link</code>标记的<code>rel="alternate stylesheet"</code>带来的影响。但我更建议通过<code>@media</code>指令把相应的样式写在同一个文件中，至少可以减少HTTP连接数。</li>
<li>没有解决@import指令31次限制的问题，其实可以提取其href值然后进行激活处理。但是实际应用在建议<a href="http://developer.yahoo.com/performance/rules.html#csslink">用<code>link</code>标记来替代@import指令</a>，因为在IE中<code>@import</code>指令相当与把link标记写在文档的底部，会导致在IE5/6页面加载时瞬间无样式问题，学名叫“Flash of Unstyled Content”（简称为FOUC）的bug，当然可以通过在文档头中放一个link或script元素可以避免这个bug。</li>
<li>一般来讲页面之所有出现大量的<code>link</code>或者<code>style</code>标签很可能有很多是相同的，可以在aCssText合并前除掉相同的项，减少代码量。</li>
</ol>
<p><ins datetime="2008-05-09T12:32:43+08:00"> 如果不用DOM中已存在的样式元素直接通过cssText属性添加样式代码，而是创建一个新的样式元素来添加，一定要注意先把新建的样式元素先添加到DOM中，然后再通过cssText属性添加样式代码。反之，其添加的样式代码似乎先被IE6的样式解析器解析后才添加，这样!imporant和hack都将失效。请看<a href="http://dancewithnet.com/lab/2008/a-solution-of-limit-of-style-tags-in-ie/hack.html" class="link-btn">例7</a>。不建议通过添加新的样式元素的方式来添加新的样式，这样很容易达到IE的限制条件。</ins></p>
]]></content:encoded>
			<wfw:commentRss>http://dancewithnet.com/2008/04/22/a-solution-of-limit-of-style-tags-in-ie/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

