国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > CSS > 正文

IE對網(wǎng)頁中引入CSS樣式表的限制

2024-07-11 08:21:03
字體:
供稿:網(wǎng)友
  首先介紹一下html文檔與css 的關(guān)聯(lián)常見有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屬性的內(nèi)聯(lián)樣式(inline style)

<p style="color:#f00;">這是紅色的字</p>

  在實際應(yīng)用中,使用style屬性的內(nèi)聯(lián)樣式是不推薦使用的,xhtml1.1已經(jīng)將其標準為不建議使用,原因很簡單這種方式不比font標記強多少,削弱了css集中控制整個文檔外觀的優(yōu)點。

  前3種方式利用了link標記和style標記,在ie(包括ie6、ie7和ie8 beta1)中有如下限制:

◆ 文檔中只有前31個link或style標記關(guān)聯(lián)的css能夠應(yīng)用。
  從第32個開始,其標記關(guān)聯(lián)的css都將失效。ie的官方文檔all style tags after the first 30 style tags on an html page are not applied in internet explorer也提及這個限制,包括在使用.xsl的.xml文件也有這個限制。但是似乎寫錯了數(shù)量。請在ie看:

◆ 一個style標記只有前31次@import指令有效應(yīng)用。
  從第32個@import指令開始忽略。

◆ 一個css文件只有前31次@import指令有效應(yīng)用。
  從第31個@import指令開始忽略。

◆ 一個css文件的不能超過288kb?
  這個消息來自internet explorer css file size limit。

  ie對css的限制在絕大部分情況下是不會遇到的,即使遇到最佳的解決方案也應(yīng)該是手動或者通過后端程序?qū)ss文件和響應(yīng)的標記進行合并,最小化的http請求數(shù)是優(yōu)化頁面呈現(xiàn)的第一原則。

  在ie中,可以通過document.stylesheets對象(firefox、opera9和safari3.1都支持)修改內(nèi)聯(lián)和嵌入樣式的值。該對象僅在文檔包含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,所以刪除時循環(huán)用倒序
    for(var i=astyle.length-1;i>-1;–i){
        var o = astyle[i];
            acsstext.push(o.innerhtml);
            if(i>0){
                o.parentnode.removechild(o);
            }
    }
    //在ie中只有在31之內(nèi)的link標簽才能通過其stylesheet.csstext獲取樣式
       //無法的獲取復(fù)制到一個數(shù)組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(i>0){
                   o.parentnode.removechild(o);
               }
          }
    }
    var ohead = document.getelementsbytagname(’head’)[0];
    //通過前面的刪除,前31個link或者style標記最多只剩下2個
    //通過重新增加link節(jié)點的方法激活其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);
    }
   //把所有的樣式都復(fù)制給第一個標簽
    asheet[0].csstext += acsstext.join(”);
}

上面僅僅是一個簡單的粗糙的解決方案,可以改進的地方還有:

  1、沒有考慮media這個屬性,如果有多個media應(yīng)該分別合并,當然更沒有考慮link標記的rel="alternate stylesheet"帶來的影響。但我更建議通過@media指令把相應(yīng)的樣式寫在同一個文件中,至少可以減少http連接數(shù)。 

  2、沒有解決@import指令31次限制的問題,其實可以提取其href值然后進行激活處理。但是實際應(yīng)用在建議用link標記來替代@import指令,應(yīng)為在ie中@import指令相當與把link標記寫在文檔的底部。 

  3、一般來講頁面之所有出現(xiàn)大量的link或者style標簽很可能有很多是相同的,可以在acsstext合并前除掉相同的項,減少代碼量。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 资溪县| 阿勒泰市| 新干县| 青冈县| 吴江市| 玛多县| 文化| 临汾市| 广饶县| 红原县| 开原市| 甘孜| 阜新| 哈密市| 泸溪县| 天峨县| 安化县| 义乌市| 同江市| 镇江市| 德格县| 精河县| 专栏| 杭州市| 砀山县| 青神县| 博湖县| 隆子县| 平乡县| 尚志市| 墨江| 高密市| 富川| 措勤县| 连平县| 隆化县| 航空| 广元市| 凤翔县| 资阳市| 营山县|