代码检测HTML5/CSS3新特性的浏览器支持情况

随同着二零一四年6月首HTML5规范版的公布,现在选用HTML5的场馆会更为多,这是令web开垦者兴奋鼓励的作业。可是有叁个切实大家只美观清,那就是IE连串浏览器还侵占一大学一年级部分商场分占的额数,以IE8、9为主,windows8.1的客商已经用上了IE10/11,而考虑国内的国情,IE6、7照样存留不菲。在大家放手用HTML5支出的时候,新特点扶植度检查评定就是少不了的了。黄金年代种形式是用navigator.userAgent或navigator.appName来检查评定浏览器类型和本子,然而这种措施不是很可信,浏览器对于一些新特点也是在渐渐帮助,无法自然说某些浏览器百分之百补助了HTML5。何况,IE11做了三个恶心的此举:在UA中去掉了“MSIE”标识,把appName改为了“Netspace”,况兼领头扶植-webkit-前缀的css属性,那是不容争辩要伪装成chrome的音频。所以,HTML5/CSS3扶助性的检查评定,照旧靠特征检查评定(figure
detection)大概说技术检查测量试验越来越好些。本篇就来介绍一下常用的检查实验方法都有如何。

一、什么是 CSS hack

是因为不一样厂商(如Internet Explorer,Safari,Mozilla
Firefox,Chrome等)、差别版本(如IE6和IE7)的浏览器,对CSS的分析认知不完全平等,由此会形成变化的页面效果不风流浪漫致,得不到大家所须求的页面效果。
其偶尔候大家就须求针对分歧的浏览器去写不一样的CSS,让它能在分化的浏览器中也能赢得我们想要的页面效果。
不问可见的说,CSS
hack的目标正是使您的CSS代码宽容区别的浏览器。当然,大家也能够扭转利用CSS
hack为不一致版本的浏览器定制编写区别的CSS效果。

HTML5部分

检查评定HTML5新特色的章程重要有以下二种:

  1. 检查全局对象(window或navigator)上有未有关照的属性名

  2. 创办多少个要素,检查成分上有未有打点的属性

3.
成立四个成分,检验成分上有没有法子名称,然后调用该方法,看能还是不能够正确施行

4.
创办三个要素,为成分的附和属性赋多少个值,然后再拿走此属性的值,看看赋值是不是见到成效

出于分歧浏览器的不等行为,检查实验一些表征的时候,大概会用到上述多少个点子的组成,接下去用地方的格局做一下常用天性的检查评定:

二、谈一谈浏览器包容的笔触

  • 要不要做:
    出品的角度:(付加物的受众、受众的浏览器比例、效果优先依然基本作用优先)
    资金财产的角度: (有不需必要做某一件事卡塔尔
  • 完了什么程度:
    让哪些浏览器辅助什么职能
  • 如何做
    1.依据包容供给选用技术框架/库(jquery卡塔尔(قطر‎
    2.基于宽容必要选择非常工具(html5shiv.js、respond.js、css
    reset、normalize.css、Modernizr)
    3.利用标准注释、CSS 哈克、js 本领检查评定做一些修修补补。

canvas

function support_canvas(){
    var elem = document.createElement('canvas');
    return !!(elem.getContext && elem.getContext('2d'));
}

平日来说,创制canvas成分并检查getContext属性就能够,可是在有的浏览器下远远不足规范,所以再检查实验一下elem.getContext(’2d’卡塔尔的实行结果,就足以完全明确。以上代码摘自Modernizr:

关于canvas,有几许要增加补充的,那便是fillText方法,固然浏览器支持canvas,我们并不可能切合的分明它协助fillText方法,因为canvas
API经验了各类改革,有意气风发对历史由来,检验扶植fillText的不二法门如下:

function support_canvas_text(){
    var elem = document.createElement('canvas');
    var context = elem.getContext('2d');
    return typeof context.fillText === 'function';
}

三、列举5种以上浏览器宽容的写法

1.属性前缀法(即类内部Hack卡塔尔(قطر‎:比方 IE6能辨识下划线”“和星号”
“,IE7能识别星号” *
“,但无法辨识下划线”“,IE6~IE10都认识”9″,但firefox前述几个都无法认知
2.挑选器前缀法(即接收器Hack卡塔尔:比方IE6能辨别
html
.class{},IE7能识别+html .class{}
3.IE规格注释法(即HTML条件注释HackState of Qatar:针对具有IE(注:IE10+已经不复帮忙标准化注释卡塔尔(قطر‎:
;针对IE6及以下版本:。那类Hack不止对CSS生效,对写在认清语句里面包车型地铁保有代码都会收效。
4.用到应用Modernizr工具。
运转的时候它会在html成分上增多一堆CSS的class名称,那一个class名称标记当前浏览器支持什么特征和不支持什么特征,帮助的特点就径直呈现该天个性的名目作为三个class(例:canvas,websockets),不帮忙的特色彰显的class是“no-特性名称”。以下是IE9下转移的风味类型。

<html class=" js no-flexbox canvas canvastext no-webgl no-touch geolocation 
              postmessage no-websqldatabase no-indexeddb hashchange no-history 
        draganddrop no-websockets rgba hsla multiplebgs backgroundsize 
        no-borderimage borderradius boxshadow no-textshadow opacity 
        no-cssanimations no-csscolumns no-cssgradients no-cssreflections
        csstransforms no-csstransforms3d no-csstransitions fontface 
        generatedcontent video audio localstorage sessionstorage 
        no-webworkers no-applicationcache svg inlinesvg smil svgclippaths">

假设class里面有no-名称的,可以在css里面增多(.no-名称)相应的性质来完毕部分其余功用。比方,上边包车型客车代码能够属性,在支撑shadow阴影的浏览器突显shadow,不帮忙的浏览器展现标准的边框:

.boxshadow #MyContainer { 
border: none;
 -webkit-box-shadow: #666 1px 1px 1px;
 -moz-box-shadow: #666 1px 1px 1px;
} 
.no-boxshadow #MyContainer {
 border: 2px solid black;
}

5、使用ie条件注释和html5shiv.js,respond.js结合。

<!--[if lt IE 9]>
   <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
   <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
 <![endif]-->

video/audio

function support_video(){
    return !!document.createElement('video').canPlayType;
}

function support_audio(){
    return !!document.createElement('audio').canPlayType;
}

video和audio的写法相近。

要检验video/audio支持的财富格式,能够调用canPlayType方法来打开检讨,具体如下:

unction support_video_ogg(){
    var elem = document.createElement('video');
    return elem.canPlayType('video/ogg; codecs="theora"');
}
function support_video_h264(){
    var elem = document.createElement('video');
    return elem.canPlayType('video/mp4; codecs="avc1.42E01E"');
}
function support_video_webm(){
    var elem = document.createElement('video');
    return elem.canPlayType('video/webm; codecs="vp8, vorbis"');
}

function support_audio_ogg(){
    var elem = document.createElement('audio');
    return elem.canPlayType('audio/ogg; codecs="vorbis"');
}
function support_audio_mp3(){
    var elem = document.createElement('audio');
    return elem.canPlayType('audio/mpeg;');
}
function support_audio_wav(){
    var elem = document.createElement('wav');
    return elem.canPlayType('audio/wav; codecs="1"');
}

要介意的是,canPlayType的重返值并非布尔类型,而是字符串,取值有以下三种:

  • “probably”:浏览器完全协理此格式
  • “maybe”:浏览器恐怕扶助此格式
  • “”:空串,表示不扶植

四、以下工具/名词是做什么样的

  • 原则注释
    规格注释是于HTML源码中被 IE 有原则解释的说话。条件注释可被用来向
    IE提供及藏匿代码。
  • IE Hack
    针对IE浏览器编写不一致的CSS的让IE可以在差异的健康渲染的长河
  • js 技巧检查实验
    检验浏览器的技艺检查测量试验对象不是检查实验特定的浏览器,而是检查评定浏览器的力量。这样,只须求质量评定浏览器是还是不是辅助特定的力量,就足以交到特定的实施方案。这一片段检查实验是杀鸡取卵浏览器包容难点的显要检验。
  • html5shiv.js
    鉴于IE6/IE7/IE8还会有不小学一年级些顾客,为了让网址浏览者都能平日的访谈HTML5网址,施工方案就有下边
    利用Javascript来使不支持HTML5的浏览器匡助HTML标签。目前超多网址使用的这种办法(Bootcss官方例子也是这么)。
    使用脚本document.createElement(“”卡塔尔创制对应的台本,CSS接纳器便可科学利用到该标签。
    虚构到IE9是帮忙html5的,所以一贯在HTML页面包车型大巴head标签中加多脚本引用就能够。
  • respond.js
    Respond.js让不协助css3 Media
    Query的浏览器包涵IE6-IE8等其余浏览器扶持查询,落成响应式网页设计
  • css reset
    重新苏醒设置浏览器的私下认可样式,越来越精确说正是因此重复定义标签样式,“覆盖”浏览器的CSS暗中认可属性。
  • normalize.css
    是一个方可定制的CSS文件,它让区别的浏览器在渲染网页成分的时候情势更统意气风发。
    重要成效:
    拥戴得力的浏览器暗中认可样式并非全然去掉它们
    平时化的体裁:为大多HTML成分提供
    修复浏览器自己的bug并保管各浏览器的生龙活虎致性
    优化CSS可用性:用部分小手艺
    释疑代码:用注释和详尽的文书档案来
  • Modernizr
    Modernizr 会在页面加载后及时检查测量试验天性;然后创设多少个饱含检验结果的
    JavaScript 对象,同有的时候候在 html 成分到场有益你调度 CSS 的 class 名
    Modernizr是三个开源的JS库,它使得那多少个基于访客浏览器的区别(指对新标准辅助性的间距)而开荒不一样等级体验的设计员的行事变得越来越轻易。它使得设计师能够在支撑HTML5和CSS3的浏览器中充足利用HTML5和CSS3的风味开展付出,同有的时候常间又不会牺牲别的不援救这个新技艺的浏览器的决定。
    当您在网页中寄存Modernizr的剧本时,它会检验当前浏览器是不是扶植CSS3的表征,比如@font-face、border-radius、 border-image、box-shadow、rgba(卡塔尔国等,同不日常候也会检查测量检验是不是扶助HTML5的
    性情——举例audio、video、当地积存、和新的
    标签的连串和属性等。在获取到那一个新闻的根基上,你能够在那个协理这个作用的浏览器上选取它们,来决定是或不是创制二个基于JS的
    fallback,也许对那么些不扶植的浏览器实行轻巧的古雅降级。别的,Modernizr还足以令IE接济对HTML5的要素采取CSS样式,那样开辟者就可以致时选择那一个更具有语义化的竹签了。
  • postCSSPostCSS 本身是三个效果比较单风流洒脱的工具。它提供了风流倜傥种方法用
    JavaScript 代码来拍卖 CSS。它担任把 CSS
    代码深入解析成肤浅语法树布局(Abstract Syntax
    Tree,AST),再交由插件来扩充拍卖。插件基于 CSS 代码的 AST
    所能进行的操作是各种各样的,比如可以匡助变量和混入(mixin),扩展浏览器相关的申明前缀,或是把施用现在的
    CSS 标准的体裁准则转译(transpile)成当下的 CSS
    规范帮衬的格式。从这些角度来讲,PostCSS
    的苍劲之处在于其相连进步的插件种类。近些日子 PostCSS 已经有 200
    五个职能不生机勃勃的插件。开垦人士也得以依据项指标内需,开辟出本人的
    PostCSS 插件。

localStorage

日常来说,检查全局对象是否有localStorage属性就可以,如下:

function support_localStorage(){
    try {
        return 'localStorage' in window && window['localStorage'] !== null;
      } 
    catch(e){
        return false;
    }
}

在后生可畏部分浏览器禁用cookie,也许安装了心事形式怎么着的场合,检查属性或报错,所以加在try语句中,假使报错了认为不援助。

其余,还恐怕有生龙活虎种更严苛的检查格局,检查相应措施是不是补助,如下:

function support_localStorage(){
    try {
        if('localStorage' in window && window['localStorage'] !== null){
            localStorage.setItem('test_str', 'test_str');
            localStorage.removeItem('test_str');
            return true;
        }
        return false;
    } 
    catch(e){
        return false;
    }
}

五、日常在哪个网址查询属性包容性?

  • caniuse.com
    查CSS属性包容
  • browserhacks
    查 Hack 的写法
  • 浏览器商场分占的额数

webWorker

function support_webWorker(){
    return !!window.Worker;
}

applicationCache

function support_applicationCache(){
    return !!window.applicationCache;
}

geolocation

function support_geolocation(){
    return 'geolocation' in navigator;
}

input标签新属性

input标签新添的品质包罗:autocomplete、autofocus、list、placeholder、max、min、multiple、pattern、required、step,检验是不是帮忙用地方提到的艺术2就可以,新建二个input标签,看是还是不是有这几个属性,以autocomplete为例:

function support_input_autocomplete(){
    var elem = document.createElement('input');
    return 'autocomplete' in elem;
}

其余要非常注意list属性,因为它是与datalist标签连用的,所以检查的时候要风流洒脱并检查实验datalist标签是还是不是扶持:

function support_input_list(){
    var elem = document.createElement('input');
    return !!('list' in elem && document.createElement('datalist') && window.HTMLDataListElement);
}

input标签新品类

这里的花色正是指type的取值,input新扩充的type值包罗:search、tel、url、email、datetime、date、month、week、time、datetime-local、number、range、color。检测这一个值需求用地点提到的点子4,以number为例:

function support_input_type_number(){
    var elem = document.createElement('input');
    elem.setAttribute('type', 'number');
    return elem.type !== 'text';
}

那是风流罗曼蒂克种较为简单的检查办法,因为严酷来说,浏览器会为分裂的花色提供差异的外观或贯彻,举例chrome中range类型组织首领那样:

图片 1

大家要相宜的掌握浏览器为该项目提供了对应的得以达成,才足以以为是“帮衬的”,要从这些方面检查实验是有难度的,各浏览器达成都不及。下边贴出Modernizr中的叁个兑现,供参照他事他说加以考查:检验email类型的兑现:

function support_input_type_email(){
    var elem = document.createElement('input');
    elem.setAttribute('type', 'email');
    elem.value = ':)';
    return elem.checkValidity && elem.checkValidity() === false;
}

为email类型设置了三个不法的value,然后手动调用校验方法,即便回去false,表明浏览器提供了该品种的落到实处,感觉是帮忙的。

history

history虽说是HTML4就一些,但HTML5提供了新的艺术,检查实验方法如下:

function support_history(){
    return !!(window.history && history.pushState);
}

webgl

function support_webgl(){
    return !!window.WebGLRenderingContext;
}

postMessage

function support_postMessage(){
    return !!window.postMessage;
}

draggable

HTML5的拖拽本性:

function support_draggable(){
    var div = document.createElement('div');
    return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div);
}

webSocket

unction support_webSocket(){
    return 'WebSocket' in window || 'MozWebSocket' in window;
}

svg

function support_svg(){
    return !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect;
}

事件的扶植性判别

通用方法:

反省事件的支持性,用地点提到的措施2即可,创立一个成分,看成分上有未有相应的事件名称,下边是摘自Modernizr的达成:

isEventSupported = (function() {

      var TAGNAMES = {
        'select': 'input', 'change': 'input',
        'submit': 'form', 'reset': 'form',
        'error': 'img', 'load': 'img', 'abort': 'img'
      };

      function isEventSupported( eventName, element ) {

        element = element || document.createElement(TAGNAMES[eventName] || 'div');
        eventName = 'on' + eventName;

        // When using `setAttribute`, IE skips "unload", WebKit skips "unload" and "resize", whereas `in` "catches" those
        var isSupported = eventName in element;

        if ( !isSupported ) {
          // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element
          if ( !element.setAttribute ) {
            element = document.createElement('div');
          }
          if ( element.setAttribute && element.removeAttribute ) {
            element.setAttribute(eventName, '');
            isSupported = is(element[eventName], 'function');

            // If property was created, "remove it" (by setting value to `undefined`)
            if ( !is(element[eventName], 'undefined') ) {
              element[eventName] = undefined;
            }
            element.removeAttribute(eventName);
          }
        }

        element = null;
        return isSupported;
      }
      return isEventSupported;
    })()

touch事件

若是单纯是检查touch事件是或不是扶持,就没须求写上边那么多东西了,能够总结书写如下:

function support_touch_event(){
    return !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch);
}

Mozilla还提供了四个媒体询问的语句用来检查测量试验touch的援救性:touch-enabled,能够在页面上插入二个包涵此媒体询问的要向来判别是还是不是辅助touch事件。参考:

可是我们做活动支付日常都只思忖webkit内核了,Mozilla的秘技就不写了,尽管须要请参照他事他说加以调查Modernizr源码。

css3部分

通用方法

css3属性扶持度的检测,首要通过上边方法提到的2和4来检查,然则大家要反省的是因素的style属性。别的三个要提的便是浏览器私有前缀,在现阶段大家用css3属性超越二分一是要写前缀的,因为各浏览器还未有完全扶植。大家用到的前缀有:-webkit-、-ms-、-o-、-moz-,至于前缀-khtml-,那是Safari开始时代选拔的,未来基本也未有人再用它了,所以举行检验的时候就把它省去了。Modernizr移除了早前缀的检查测量检验,详见:

通用代码如下:

var support_css3 = (function() {
   var div = document.createElement('div'),
      vendors = 'Ms O Moz Webkit'.split(' '),
      len = vendors.length;

   return function(prop) {
      if ( prop in div.style ) return true;

      prop = prop.replace(/^[a-z]/, function(val) {
         return val.toUpperCase();
      });

      while(len--) {
         if ( vendors[len] + prop in div.style ) {
            return true;
         } 
      }
      return false;
   };
})();

3D变形

css3
3D变形的检验微微复杂些,首先要扶植perspective属性,其次要扶助transform-style的值为preserve-3d。用艺术4的法子不能检查实验出来,必要依赖媒体询问的办法,代码如下:

function support_css3_3d(){
    var docElement = document.documentElement;
    var support = support_css3('perspective');
    var body = document.body;
    if(support && 'webkitPerspective' in docElement.style){
        var style = document.createElement('style');
        style.type = 'text/css';
        style.innerHTML = '@media (transform-3d),(-webkit-transform-3d){#css3_3d_test{left:9px;position:absolute;height:3px;}}';
        body.appendChild(style);
        var div = document.createElement('div');
        div.id = 'css3_3d_test';
        body.appendChild(div);

        support = div.offsetLeft === 9 && div.offsetHeight === 3;

    }
    return support;
}

亟待信赖地点定义好的support_css3艺术来检查测量检验perspective。

核心常用检查实验的就这么些了,本文中意气风发部分代码是网络搜来的,还应该有局地是从Modernizr源码中分离出来的。如文中陈诉有误,迎接指正。

在实质上付出中,推荐直接运用Modernizr举办检查评定,它曾经封装的可怜精良了。但是只要您独自检查实验多少个属性,也许不想因加载额外的库而浪费质量,就足以行使上述代码举行单个检查评定。

发表评论

电子邮件地址不会被公开。 必填项已用*标注