目錄
HTML5部分
canvas" >canvas
video/audio
localStorage
webWorker
applicationCache
geolocation
input標籤新屬性" >input標籤新屬性
input標籤新類型
history
webgl
postMessage
draggable
webSocket
svg
事件的支持性判断
通用方法
touch事件
css3部分
3D变形
首頁 web前端 H5教程 常用的HTML5/CSS3新特性能力檢測寫法的範例程式碼分享

常用的HTML5/CSS3新特性能力檢測寫法的範例程式碼分享

Mar 21, 2017 pm 03:53 PM

  未來使用H5的場景會越來越多,這是令web開發者歡欣鼓舞的事情。然而有一個現實我們不得不看清,那就是IE系列瀏覽器還佔有一大部分市場份額,以IE8、9為主,windows8.1的用戶已經用上了IE10/11,而考慮我國的國情, IE6、7依然存留不少。在我們放手用HTML5開發的時候,新特性支援度檢測就是不可或缺的了。一種方式是用navigator.userAgent或navigator.appName來檢測瀏覽器類型和版本,不過這種方式不是很可靠,瀏覽器對於一些新功能也是在逐漸支持,不能肯定說某個瀏覽器100%支持了HTML5。而且,IE11做了一個噁心的舉動:在UA中去掉了“MSIE”標誌,把appName改為了“Netspace”,並且開始支援-webkit-前綴的css屬性,這是活生生要偽裝成chrome的節奏。所以,HTML5/CSS3支持性的檢測,還是靠特徵檢測(figure detection)或是能力檢測更好。本篇就來介紹常用的檢測方式都有哪些。

  補充:判斷IE11仍可用此方法:/Trident/i.test(navigator.appVersion),get from 小鬍子。

HTML5部分

  偵測HTML5新功能的方法主要有以下幾種:

         1. 檢視全域物件(window或navigator)上有沒有對應的屬性名稱

         2. 建立一個元素,檢查元素上有沒有對應的屬性

         3. 建立一個元素,偵測元素上有沒有方法名稱,然後呼叫方法名稱看能否正確執行

         4. 建立一個元素,為元素的對應屬性賦一個值,然後再取得此屬性的值,看看賦值是否生效

  由於不同瀏覽器的不同行為,偵測一些特性的時候,可能會用到上述幾個方法的組合,接下來用上面的方法做一下常用特性的偵測:

canvas

1

2

3

4

function support_canvas(){   

var elem = document.createElement('canvas');   

return !!(elem.getContext && elem.getContext('2d'));

}

登入後複製

  一般來講,創建canvas元素並檢查getContext屬性即可,但是在一些瀏覽器下不夠準確,所以再檢測一下elem.getContext('2d')的執行結果,就可以完全確定。

  關於canvas,有一點要補充的,那就是fillText方法,儘管瀏覽器支援canvas,我們並不能確切的確定它支援fillText方法,因為canvas API經歷了各種修改,有一些歷史原因,偵測支援fillText的方法如下:

1

2

3

4

5

function support_canvas_text(){   

var elem = document.createElement('canvas');   

var context = elem.getContext('2d');   

return typeof context.fillText === 'function';

}

登入後複製

video/audio

1

2

3

4

5

function support_video(){   

return !!document.createElement('video').canPlayType;

}function support_audio(){   

return !!document.createElement('audio').canPlayType;

}

登入後複製

  video和audio的寫法相似。

  要偵測video/audio支援的資源格式,可以呼叫canPlayType方法來進行檢查,具體如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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":瀏覽器可能支援此格式

  • "":空白字串,表示不支援

localStorage

  一般來講,檢查全域物件是否有localStorage屬性即可,如下:

1

2

3

4

5

6

7

8

function support_localStorage(){   

try {       

return 'localStorage' in window && window['localStorage'] !== null;

      }

    catch(e){       

    return false;

    }

}

登入後複製

  在某些瀏覽器停用cookie,或設定了隱私模式什麼的情況,檢查屬性或報錯,所以加在try語句中,如果報錯了認為不支援。

  另外,還有一種更嚴格的檢查方法,檢查相應方法是否支持,如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

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;

    }

}

登入後複製

webWorker

1

2

3

function support_webWorker(){   

return !!window.Worker;

}

登入後複製

applicationCache

1

2

3

function support_applicationCache(){   

return !!window.applicationCache;

}

登入後複製

geolocation

1

2

3

function support_geolocation(){   

return 'geolocation' in navigator;

}

登入後複製

input標籤新屬性

  input標籤新增的屬性包括:autocomplete、autofocus、list、placeholder、max、min、multiple、pattern、required、step,偵測是否支援用上面提到的方法2即可,新建一個input標籤,看是否有這些屬性,以autocomplete為例:

1

2

3

4

function support_input_autocomplete(){  

 var elem = document.createElement('input');   

 return 'autocomplete' in elem;

}

登入後複製

  另外要特別注意list屬性,因為它是與datalist標籤連用的,所以檢查的時候要一併檢測datalist標籤是否支援:

1

2

3

4

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為例:

1

2

3

4

5

function support_input_type_number(){   

var elem = document.createElement('input');

    elem.setAttribute('type', 'number');   

    return elem.type !== 'text';

}

登入後複製

  这是一种较为简单的检查方法,因为严格来讲,浏览器会为不同的类型提供不同的外观或实现,例如chrome中range类型会长这样:

  

  我们要确切的知道浏览器为该类型提供了对应的实现,才可以认为是“支持的”,要从这个方面检测是有难度的,各浏览器实现都不一。下面贴出Modernizr中的一个实现,供参考:检测email类型的实现:

1

2

3

4

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提供了新的方法,检测方法如下:

1

2

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

}

登入後複製

webgl

1

2

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

}

登入後複製

postMessage

1

2

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

}

登入後複製

draggable

HTML5的拖拽特性:

1

2

3

4

function support_draggable(){   

var p = document.createElement('p');   

return ('draggable' in p) || ('ondragstart' in p && 'ondrop' in p);

}

登入後複製

webSocket

1

2

3

unction support_webSocket(){   

return 'WebSocket' in window || 'MozWebSocket' in window;

}

登入後複製

svg

1

2

3

function support_svg(){   

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

}

登入後複製

事件的支持性判断

通用方法:

  检查事件的支持性,用上面提到的方法2就可以,创建一个元素,看元素上有没有对应的事件名称,下面是摘自Modernizr的实现:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

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;

    })()

登入後複製

View Code

touch事件

  如果仅仅是检查touch事件是否支持,就没必要写上面那么多东西了,可以简单书写如下:

1

2

3

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移除了此前缀的检测,

  通用代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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;

   };

})();

登入後複製

View Code

3D变形

  css3 3D变形的检测稍微复杂些,首先要支持perspective属性,其次要支持transform-style的值为preserve-3d。用方法4的方式无法检测出来,需要借助媒体查询的方式,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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进行检测,它已经封装的非常漂亮了。但是如果你仅仅检测几个属性,或者不想因加载额外的库而浪费性能,就可以使用上述代码进行单个检测。

  先写这么多,以后有想到的再进行补充。

以上是常用的HTML5/CSS3新特性能力檢測寫法的範例程式碼分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1320
25
PHP教程
1269
29
C# 教程
1249
24
HTML 中的表格邊框 HTML 中的表格邊框 Sep 04, 2024 pm 04:49 PM

HTML 表格邊框指南。在這裡,我們以 HTML 中的表格邊框為例,討論定義表格邊框的多種方法。

HTML 中的巢狀表 HTML 中的巢狀表 Sep 04, 2024 pm 04:49 PM

這是 HTML 中巢狀表的指南。這裡我們討論如何在表中建立表格以及對應的範例。

HTML 左邊距 HTML 左邊距 Sep 04, 2024 pm 04:48 PM

HTML 左邊距指南。在這裡,我們討論 HTML margin-left 的簡要概述及其範例及其程式碼實作。

HTML 表格佈局 HTML 表格佈局 Sep 04, 2024 pm 04:54 PM

HTML 表格佈局指南。在這裡,我們詳細討論 HTML 表格佈局的值以及範例和輸出。

HTML 輸入佔位符 HTML 輸入佔位符 Sep 04, 2024 pm 04:54 PM

HTML 輸入佔位符指南。在這裡,我們討論 HTML 輸入佔位符的範例以及程式碼和輸出。

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在這裡我們也分別討論了 HTML 有序列表和類型的介紹以及它們的範例

HTML onclick 按鈕 HTML onclick 按鈕 Sep 04, 2024 pm 04:49 PM

HTML onclick 按鈕指南。這裡我們分別討論它們的介紹、工作原理、範例以及各個事件中的onclick事件。

在 HTML 中移動文字 在 HTML 中移動文字 Sep 04, 2024 pm 04:45 PM

HTML 中的文字移動指南。在這裡我們討論一下marquee標籤如何使用語法和實作範例。

See all articles