成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

更靠譜的移動(dòng)端橫豎屏檢測(cè)方法

移動(dòng)開(kāi)發(fā) 移動(dòng)應(yīng)用
前不久,做了一個(gè)H5項(xiàng)目,需要在橫豎屏變化時(shí),做一些處理。毫無(wú)疑問(wèn),需要使用orientationchange來(lái)監(jiān)聽(tīng)橫豎屏的變化。

[[171604]]

前不久,做了一個(gè)H5項(xiàng)目,需要在橫豎屏變化時(shí),做一些處理。毫無(wú)疑問(wèn),需要使用orientationchange來(lái)監(jiān)聽(tīng)橫豎屏的變化。

方案一:

  1. // 監(jiān)聽(tīng) orientation changes 
  2. window.addEventListener("orientationchange"function(event) { 
  3.     // 根據(jù)event.orientation|screen.orientation.angle等于0|180、90|-90度來(lái)判斷橫豎屏 
  4. }, false);  

代碼添加上后,就各種兼容性問(wèn)題。這里兼容性問(wèn)題出現(xiàn)在兩個(gè)地方:

  • orientationchange
  • event.orientation|screen.orientation.angle

如下是orientationchange事件的兼容性:

 如下是screen.orientation的兼容性:

 方案二:

上述方案不行,只能另行他法了。google一下,了解到可以通過(guò)resize配合(window.inner/outerWidth, window.inner/outerHeight)來(lái)實(shí)現(xiàn):

  1. window.addEventListener("resize"function(event) { 
  2.     var orientation=(window.innerWidth > window.innerHeight)? "landscape":"portrait"
  3.     if(oritentation === 'portrait'){ 
  4.         // do something …… 
  5.     } else { 
  6.         // do something else …… 
  7.     } 
  8. }, false);  

這種方案基本滿足大部分項(xiàng)目的需求,但是還是有些不足之處:

  • 只要window的size變化,就會(huì)不斷觸發(fā)觸發(fā)resize事件。可以使用setTimeout來(lái)優(yōu)化一下
  • 如果有多個(gè)地方需要監(jiān)聽(tīng)橫豎屏,就需要注冊(cè)多個(gè)window.addEventListener("resize", function(event) {……})。能不能通過(guò)訂閱與發(fā)布模式來(lái)改進(jìn)一下,只注冊(cè)一個(gè)resize負(fù)責(zé)監(jiān)聽(tīng)橫豎屏變化,只要橫豎發(fā)生變化就發(fā)布通知訂閱的對(duì)象。其他需要監(jiān)聽(tīng)橫豎屏的地方只需訂閱一下即可。

關(guān)鍵代碼如下:

  1. var resizeCB = function(){ 
  2.      if(win.innerWidth > win.innerHeight){//初始化判斷 
  3.        meta.init = 'landscape'
  4.        meta.current = 'landscape'
  5.      } else { 
  6.        meta.init = 'portrait'
  7.        meta.current = 'portrait'
  8.      } 
  9.      return function(){ 
  10.        if(win.innerWidth > win.innerHeight){ 
  11.          if(meta.current !== 'landscape'){ 
  12.            meta.current = 'landscape'
  13.            event.trigger('__orientationChange__', meta); 
  14.          } 
  15.        } else { 
  16.          if(meta.current !== 'portrait'){ 
  17.            meta.current = 'portrait'
  18.            event.trigger('__orientationChange__', meta); 
  19.          } 
  20.        } 
  21.      } 
  22.    }();  

完整代碼猛擊這里

方案三:

不過(guò)個(gè)人覺(jué)得通過(guò)window.innerWidth > window.innerHeight來(lái)實(shí)現(xiàn)的是一種偽檢測(cè),有點(diǎn)不可靠。 可不可以通過(guò)瀏覽器來(lái)實(shí)現(xiàn)檢測(cè)?如基于CSS3@media媒體查詢來(lái)實(shí)現(xiàn)。

如下@media兼容性:

 如上上圖所示,移動(dòng)端瀏覽器都支持CSS3 media。

實(shí)現(xiàn)思路:

  • 創(chuàng)建包含標(biāo)識(shí)橫豎屏狀態(tài)的特定css樣式
  • 通過(guò)JS向頁(yè)面中注入CSS代碼
  • resize回調(diào)函數(shù)中獲取橫豎屏的狀態(tài)

這里我選擇<html></html>的節(jié)點(diǎn)font-family作為檢測(cè)樣式屬性。理由如下:

  • 選擇<html></html>主要為了避免reflow和repaint
  • 選擇font-family樣式,主要是因?yàn)閒ont-family有如下特性:

1.優(yōu)先使用排在前面的字體。

2.如果找不到該種字體,或者該種字體不包括所要渲染的文字,則使用下一種字體。

3.如果所列出的字體,都無(wú)法滿足需要,則讓操作系統(tǒng)自行決定使用哪種字體。

這樣我們就可以指定特定標(biāo)識(shí)來(lái)標(biāo)識(shí)橫豎屏的狀態(tài),不過(guò)需要將指定的標(biāo)識(shí)放置在其他字體的前面,這樣就不會(huì)引起hmtl字體的變化。

關(guān)鍵代碼如下:

  1. // callback 
  2.     var resizeCB = function() { 
  3.         var hstyle = win.getComputedStyle(html, null), 
  4.             ffstr = hstyle['font-family'], 
  5.             pstr = "portrait, " + ffstr, 
  6.             lstr = "landscape, " + ffstr, 
  7.             // 拼接css 
  8.             cssstr = '@media (orientation: portrait) { .orientation{font-family:' + pstr + ';} } @media (orientation: landscape) {  .orientation{font-family:' + lstr + ';}}'
  9.         // 載入樣式         
  10.         loadStyleString(cssstr); 
  11.         // 添加類 
  12.         html.className = 'orientation' + html.className; 
  13.         if (hstyle['font-family'] === pstr) { //初始化判斷 
  14.             meta.init = 'portrait'
  15.             meta.current = 'portrait'
  16.         } else { 
  17.             meta.init = 'landscape'
  18.             meta.current = 'landscape'
  19.         } 
  20.         return function() { 
  21.             if (hstyle['font-family'] === pstr) { 
  22.                 if (meta.current !== 'portrait') { 
  23.                     meta.current = 'portrait'
  24.                     event.trigger('__orientationChange__', meta); 
  25.                 } 
  26.             } else { 
  27.                 if (meta.current !== 'landscape') { 
  28.                     meta.current = 'landscape'
  29.                     event.trigger('__orientationChange__', meta); 
  30.                 } 
  31.             } 
  32.         } 
  33.     }();  

完整代碼猛擊這里

測(cè)試效果

  • portrait效果:

 

  • landscape效果:

 

方案四:

可以再改進(jìn)一下,在支持orientationchange時(shí),就使用原生的orientationchange,不支持則使用方案三。

關(guān)鍵代碼如下:

  1. // 是否支持orientationchange事件 
  2. var isOrientation = ('orientation' in window && 'onorientationchange' in window); 
  3. // callback 
  4. var orientationCB = function(e) { 
  5.     if (win.orientation === 180 || win.orientation === 0) { 
  6.         meta.init = 'portrait'
  7.         meta.current = 'portrait'
  8.     } 
  9.     if (win.orientation === 90 || win.orientation === -90) { 
  10.         meta.init = 'landscape'
  11.         meta.current = 'landscape'
  12.     } 
  13.     return function() { 
  14.         if (win.orientation === 180 || win.orientation === 0) { 
  15.             meta.current = 'portrait'
  16.         } 
  17.         if (win.orientation === 90 || win.orientation === -90) { 
  18.             meta.current = 'landscape'
  19.         } 
  20.         event.trigger(eventType, meta); 
  21.     } 
  22. }; 
  23. var callback = isOrientation ? orientationCB() : (function() { 
  24.     resizeCB(); 
  25.     return function() { 
  26.         timer && win.clearTimeout(timer); 
  27.         timer = win.setTimeout(resizeCB, 300); 
  28.     } 
  29. })(); 
  30. // 監(jiān)聽(tīng) 
  31. win.addEventListener(isOrientation ? eventType : 'resize', callback, false);  

完整代碼猛擊這里

方案五:

目前,上述幾種方案都是通過(guò)自定制的訂閱與發(fā)布事件模式來(lái)實(shí)現(xiàn)的。這里可以基于瀏覽器的事件機(jī)制,來(lái)模擬orientationchange。即對(duì)orientationchange的不兼容進(jìn)行修復(fù)。

關(guān)鍵代碼如下:

  1. var eventType = 'orientationchange'
  2. // 觸發(fā)原生orientationchange 
  3. var fire = function() { 
  4.     var e; 
  5.     if (document.createEvent) { 
  6.         e = document.createEvent('HTMLEvents'); 
  7.         e.initEvent(eventType, truefalse); 
  8.         win.dispatchEvent(e); 
  9.     } else { 
  10.         e = document.createEventObject(); 
  11.         e.eventType = eventType; 
  12.         if (win[eventType]) { 
  13.             win[eventType](); 
  14.         } else if (win['on' + eventType]) { 
  15.             win['on' + eventType](); 
  16.         } else { 
  17.             win.fireEvent(eventType, e); 
  18.         } 
  19.     } 
  20.  

完整代碼猛擊這里

通過(guò)上述5種方案,自己對(duì)移動(dòng)端橫豎屏檢測(cè)有了更進(jìn)一步的認(rèn)識(shí),有些東西只有自己親身經(jīng)歷過(guò)才知道為什么要這么寫,自己也把其中緣由記錄在文章中,希望對(duì)大家有幫助。經(jīng)過(guò)5種方案的演變得到了最終orientationchange-fix,github地址:https://github.com/zhansingsong/orientationchange-fix

責(zé)任編輯:龐桂玉 來(lái)源: segmentfault
相關(guān)推薦

2015-11-09 16:45:14

尼泊爾地震

2015-07-23 14:25:04

宕機(jī)云主機(jī)云智慧

2013-01-18 10:16:42

2025-04-17 08:23:55

DataStore本地存儲(chǔ)

2018-06-01 16:06:29

PR靠譜Code Review

2021-04-01 14:35:08

XDR微步在線

2012-10-22 11:14:05

SDNOpenFlow網(wǎng)絡(luò)管理

2020-12-22 06:18:47

Windows 10Windows操作系統(tǒng)

2025-06-10 08:30:50

2022-10-18 16:03:38

JS判斷數(shù)組面試

2022-12-01 08:30:10

JavaScript構(gòu)造函數(shù)

2018-01-25 16:00:31

2014-07-29 09:33:17

公司郵箱

2012-06-06 09:07:46

云計(jì)算微軟

2013-05-23 10:51:28

Android開(kāi)發(fā)移動(dòng)開(kāi)發(fā)橫豎屏切換

2017-10-31 11:27:14

寬帶百兆光纖移動(dòng)

2014-02-19 10:49:55

Windows 9

2011-12-22 09:32:34

虛擬化桌面虛擬化云計(jì)算

2014-10-21 10:29:54

TIOBEPyPI

2017-09-05 14:23:22

人工智能機(jī)器翻譯神經(jīng)網(wǎng)絡(luò)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 午夜影院在线观看 | 国产精品色 | 欧美美女爱爱 | 国产电影一区二区 | 国产三级电影网站 | 日本视频免费 | 欧美日韩亚洲视频 | 三级在线观看 | 在线观看a视频 | 美女在线一区二区 | 久久成人综合 | 一级毛片成人免费看a | 91麻豆精品国产91久久久久久久久 | 色悠悠久 | 中文字幕一区二区三区四区五区 | 亚洲精品国产第一综合99久久 | www.日本国产| 日韩有码在线播放 | 久久精品视频免费看 | 羞羞在线观看视频 | 中文字幕日韩欧美一区二区三区 | 欧美国产亚洲一区二区 | 日韩在线观看一区 | 欧美日韩在线一区 | 国产在线观看不卡一区二区三区 | 久久这里有精品 | 国产精品夜夜春夜夜爽久久电影 | 青娱乐av | 久久丝袜视频 | 欧美日韩一区在线播放 | 在线观看av网站 | 天堂网中文 | 欧美综合自拍 | 亚洲国产精品久久久久秋霞不卡 | 欧美手机在线 | 国产www成人 | 国产97碰免费视频 | 天天操妹子 | 久久久久久蜜桃一区二区 | 国产精品久久久久久一区二区三区 | 亚洲电影一区 |