zoukankan      html  css  js  c++  java
  • IE 8 兼容性方法总结

    1、使ie 8兼容html5标签

    <!--[if lt IE 9]>
    <script>
    (function(){
        var tags = ['header','footer','figure','figcaption','details','summary','hgroup','nav','aside','article','section','mark','abbr','meter','output','progress','time','video','audio','canvas','dialog'];
        for(var i=tags.length - 1;i>-1;i--){ document.createElement(tags[i]);}
    })();
    </script>
    <![endif]-->

    2、IE8兼容:X-UA-Compatible属性

    对于IE8及以上版本,例如:

     
    <meta http-equiv="X-UA-Compatible" content="IE=9; IE=8; IE=7" />

    强制浏览器按照特定的版本标准进行渲染。但不支持IE7及以下版本。

    如果用分号(;)分隔,对于不同的浏览器版本就有不同的兼容性,例如

     
    <meta http-equiv="X-UA-Compatible" content="IE=7; IE=9" />

    以上就表明,将IE8和IE7按照IE7标准渲染,但是IE9还是按照IE9的标准渲染。它允许有不同的向后兼容水平。尽管在真实情况中,你只要选择一种版本:

    <meta http-equiv="X-UA-Compatible" content="IE=8" />

    这对于测试和维护会更加简单。

    而通常更加有用的方式就是进行仿真模拟

    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />


    对于IE=EDGE

    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />


    这意味着,会强制浏览器按照最新的标准去渲染。就像在Google’s CDN使用最新版本的JQuery一样,这是按照最新版本,但也可能由于没有固定的版本而破坏你的布局。

    最后,考虑下面这个

    <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />

    添加”chrome=1“将允许站点在使用了谷歌浏览器内嵌框架(Chrome Frame)的客户端渲染,对于没有使用的,则没有任何影响。


    For more information, there is plenty to read here, and if you want to learn about ChromeFrame (which I recommend) you can learn about its implementation here.

    PS:X-UA-Compatible是针对 IE8 版本的一个特殊文件头标记,用于为 IE8 指定不同的页面渲染模式,对于ie8之外的浏览器是不识别的

    目前绝大多数网站都用<meta http-equiv=”X-UA-Compatible” content=”IE=EmulateIE7″ >来作为IE8的兼容方法。为了避免制作出的页面在IE8下面出现错误,建议直接将IE8使用IE7进行渲染。也就是直接在页面的header的 meta标签中加入如下代码:

    <meta http-equiv=”X-UA-Compatible” content=”IE=7″ />
    <meta http-equiv=”X-UA-Compatible” content=”IE=EmulateIE7″ >
    <meta http-equiv=”X-UA-Compatible” content=”IE=EmulateIE8″ >


    但是<meta http-equiv=”X-UA-Compatible” content=”IE=EmulateIE7″ >仍然是首选。

    3、Respond.js 让IE6-8支持CSS3 Media Query

    Bootstrap里面就引入了这个JS文件,从名字看出来是自适应的兼容。打开IE看了一下,效果挺好的,自适应的效果挺好的。

    Respond.js让不支持css3 Media Query的浏览器包括IE6-IE8等其他浏览器支持查询。

    使用方式
    官方demo地址:http://scottjehl.github.com/Respond/test/test.html
    1).在css中正常用 min/max-width media queries
        @media screen and (min- 480px){
            ...styles for 480px and up go here
        }
    

    2).引入respond.min.js,但要在css的后面(越早引入越好,在ie下面看到页面闪屏的概率就越低,因为最初css会先渲染出来,如 果respond.js加载得很后面,这时重新根据media query解析出来的css会再改变一次页面的布局等,所以看起来有闪屏的现象)

    实现思路

    1.把head中所有<link rel=“sheetstyle” href=“xx”/>的css路径取出来放入数组

    2.然后遍历数组一个个发ajax请求

    3.ajax回调后仅分析response中的media query的min-width和max-width语法,分析出viewport变化区间对应相应的css块

    4.页面初始化时和window.resize时,根据当前viewport使用相应的css块。

    //检测是否支持media query,检测css是否有效的方法都差不多,创建一个元素应用该css后检测元素宽度,然后清除该元素。
    window.matchMedia = window.matchMedia || (function(doc, undefined){
      var bool,
          docElem  = doc.documentElement,
          refNode  = docElem.firstElementChild || docElem.firstChild,
          // fakeBody required for 
          fakeBody = doc.createElement('body'),
          div      = doc.createElement('div');
      div.id = 'mq-test-1';
      div.style.cssText = "position:absolute;top:-100em";
      fakeBody.style.background = "none";
      fakeBody.appendChild(div);
      return function(q){
        div.innerHTML = '­';
        docElem.insertBefore(fakeBody, refNode);
        bool = div.offsetWidth == 42;
        docElem.removeChild(fakeBody);
        return { matches: bool, media: q };
      };
    })(document);
    
      .......
    if( !!href && isCSS && !parsedSheets[ href ] ){
        // selectivizr exposes css through the rawCssText expando
        if (sheet.styleSheet && sheet.styleSheet.rawCssText) {
                    //sheet.styleSheet.rawCssText看不懂,原来是方便selectivizr和respond.js联用,http://selectivizr.com/tests/respond/
                    //selectivizr的作用是 CSS3 selectors for IE;约定将原csstext放在styleSheet的link上的扩展属性rawCssText上;这里如果联用selectivizr可以少次ajax请求
            translate( sheet.styleSheet.rawCssText, href, media );
            parsedSheets[ href ] = true;
        } else {
            if( (!/^([a-zA-Z:]*//)/.test( href ) && !base)
                || href.replace( RegExp.$1, "" ).split( "/" )[0] === win.location.host ){
                requestQueue.push( {
                    href: href,
                    media: media
                } );
            }
        }
    }
    .......

    其余的代码就是ajax实现和translate media query的max-width min-width的逻辑了;可以看出这里必须依赖ajax请求css路径才能得到css文件中的mediaquery的内容,那ajax的跨域问题就要 解决了;由于我们的静态资源都是要放cdn的,respond.js也给出了跨域方法,即引入代理页面。

    //把cross-domain/respond-proxy.html 放到cdn上
    //把cross-domain/respond.proxy.gif 放到当前域服务器上
    <!-- Respond.js proxy on external server -->
    <link href="http://externalcdn.com/respond-proxy.html" id="respond-proxy" rel="respond-proxy" />
    
    <!-- Respond.js redirect location on local server -->
    <link href="/path/to/respond.proxy.gif" id="respond-redirect" rel="respond-redirect" />
    
    <!-- Respond.js proxy script on local server -->
    <script src="/path/to/respond.proxy.js"></script>

    这里ajax跨域实现是通过代理页面将获取到的css,再通过window.name通信实现;如在respond.proxy.js中

    function checkFrameName() {
        var cssText;
        try {
            cssText = iframe.contentWindow.name;
                    var now = new Date().getTime(),useTime = now - initTime;
            alert('获取css耗时:'+ useTime + 'ms');
        }
        catch (e) { }
    
        if (cssText) {
            ……//销毁之前用于通信的iframe,后续回调callback
            callback(cssText);
        }
        else{
            win.setTimeout(checkFrameName, 100);
        }
    }
    win.setTimeout(checkFrameName, 500);//500ms后确认内部iframe的name值是否传递过来,后续再更新当前viewport该用的css

    因为实现跨域代理的问题,初始化页面时应用上全部css耗时较长,以下光测试从开始执行该js文件到css取回调用之前的耗时为500ms-515ms之间(每次刷新结果不一样),ie8下测试结果如下 T10Xg1Xl0cXXXxfAUk-634-396

    测试结果发现,刷新页面后会有明显的闪屏(以该测试demo为例,一开始页面背景是黑色的,这是默认css中的,跨域js执行完成后分析出 media query中的该viewport尺寸下应该应用red的背景,所以又变成红色),间隔时间为500ms以上。所以体验不是很好,而且该场景中ajax跨 域目前已经没有更好的实现方式,500ms间隔的闪屏避免不了。

    同时因为是ajax请求css,所以会因为响应式而额外产生一个请求,好在之前css请求过一遍,这次ajax请求是读取浏览器缓存中的,如下图中fiddler的检测结果中的第三个请求和第六个请求: T1IHM0XaleXXaqU36o-600-217

    respond.js总结

    • 优点:压缩后仅1k,不跨域时性能ok,只需引入respond.js通用易用
    • 缺点:仅支持media query的min-width和max-width(用于响应式够用);支持跨域,虽然配置有点麻烦,实现跨域代价高而且有闪屏体验欠佳。

     转自http://caibaojian.com/respondjs.html?fid=0#0-tsina-1-14057-397232819ff9a47a7b7e80a40613cfe1

    http://www.jb51.net/web/226895.html#0-tsina-1-38874-397232819ff9a47a7b7e80a40613cfe1

  • 相关阅读:
    算法-在字符串中删除特定的字符或字符串
    Linux 下的7种文件类型
    TCP/IP协议、三次握手、四次挥手
    8、VUE自定义组件
    7、VUE事件
    6、VUE指令
    Redis高级功能-1、高并发基本概述
    5、插值
    4、VUE生命周期
    3、Vue实例的属性
  • 原文地址:https://www.cnblogs.com/Youngly/p/4992054.html
Copyright © 2011-2022 走看看