JS檢測(cè)移動(dòng)端橫豎屏的代碼
使用media來(lái)判斷屏幕寬度遇到的問(wèn)題:
ios上當(dāng)我旋轉(zhuǎn)屏幕的時(shí)候可行,但是安卓機(jī)上沒(méi)反應(yīng),橫屏顯示的還是我豎屏的樣式。
查了一下資料,css3的media如果要在移動(dòng)端有較好的顯示效果,需要在頁(yè)頭加上這段代碼
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
可是這段代碼我不能用。因?yàn)槲业捻?yè)面是做了適配的??梢愿鶕?jù)屏幕的大小來(lái)顯示字號(hào)和樣式的大小。如果我加了這段代碼的話,我的適配就不能用了。所以要用其他方法
解決辦法:
移動(dòng)端的設(shè)備提供了一個(gè)事件:orientationChange事件
這個(gè)事件是蘋果公司為safari中添加的。以便開(kāi)發(fā)人員能夠確定用戶何時(shí)將設(shè)備由橫向查看切換為縱向查看模式。
在設(shè)備旋轉(zhuǎn)的時(shí)候,會(huì)觸發(fā)這個(gè)事件,
// Listen for orientation changes window.addEventListener("orientationchange", function() { // Announce the new orientation number alert(window.orientation); }, false);
只要用戶改變了設(shè)備的查看模式,就會(huì)觸發(fā) orientationChange事件。此時(shí)的event對(duì)象不包含任何有價(jià)值的信息,
因?yàn)槲ㄒ幌嚓P(guān)信息可以通過(guò)window.orientation訪問(wèn)到
orientation屬性
它有三個(gè)值:0,90,-90
0為豎屏模式(portrait),-90意味著該設(shè)備橫向旋轉(zhuǎn)到右側(cè)的橫屏模式(landscape),而90表示該設(shè)備是橫向旋轉(zhuǎn)到左邊的橫屏模式(landscape)。
還有一個(gè)是180,表示豎屏但是是翻轉(zhuǎn)過(guò)來(lái)的豎屏模式。但這種模式至今尚未得到支持。
如圖所示:
因此,結(jié)合這個(gè)orientationChange事件和window的orientation屬性,我們就比較好判斷設(shè)備是處于橫屏還是豎屏了
(function(){ var init = function(){ var updateOrientation = function(){ var orientation = window.orientation; switch(orientation){ case 90: case -90: orientation = 'landscape'; //這里是橫屏 break; default: orientation = 'portrait'; //這里是豎屏 break; } //html根據(jù)不同的旋轉(zhuǎn)狀態(tài),加上不同的class,橫屏加上landscape,豎屏 //加上portrait document.body.parentNode.setAttribute('class',orientation); }; // 每次旋轉(zhuǎn),調(diào)用這個(gè)事件。 window.addEventListener('orientationchange',updateOrientation,false); // 事件的初始化 updateOrientation(); }; window.addEventListener('DOMContentLoaded',init,false); })();
因此可以根據(jù)不同的旋轉(zhuǎn)狀態(tài)加上class,所以我們的css就可以這樣寫了
/**豎屏 body顯示紅色**/ .portrait body div{ background: red; } /**橫屏 body顯示藍(lán)色**/ .landscape body div{ background: blue; }
另外一種寫法是,借助 media queries
@media all and (orientation: portrait) { body div {background: red;} } @media all and (orientation: landscape) { body div {background: blue; } }
這個(gè)orientation media query 在ios3.2+和安卓2.0+上還有其他瀏覽器上有效。
相對(duì)來(lái)說(shuō),這種代碼更加的簡(jiǎn)潔一點(diǎn)。跟上面的js+css,這種代碼是純css。當(dāng)設(shè)備旋轉(zhuǎn)的時(shí)候,就會(huì)根據(jù)設(shè)備旋轉(zhuǎn)的方向來(lái)調(diào)用改方向的css
兼容性
有些設(shè)備并沒(méi)有提供orientationchange事件,但不觸發(fā)窗口的resize事件。并且media queries也不支持的情況下,我們?cè)撛趺崔k呢?
可以用resize事件來(lái)判斷。用innerWidth , innerHeight,可以檢索得到屏幕大小。依據(jù)寬和高的大小比較判斷,寬小于高為豎屏,寬大與高就是橫屏。
代碼如下:
(function(){ var updateOrientation = function(){ var orientation = (window.innerWidth > window.innerHeight) ? 'landscape' : 'portrait'; document.body.parentNode.setAttribute('class',orientation); }; var init = function(){ updateOrientation(); //監(jiān)聽(tīng)resize事件 window.addEventListener('resize',updateOrientation,false); }; window.addEventListener('DOMContentLoaded',init,false); })();
這樣,我們就可以在瀏覽器中看到屏幕旋轉(zhuǎn)帶來(lái)樣式的變化了。
兩種檢測(cè)方法的結(jié)合,代碼如下:
(function(){ var supportOrientation = (typeof window.orientation === 'number' && typeof window.onorientationchange === 'object'); var init = function(){ var htmlNode = document.body.parentNode, orientation; var updateOrientation = function(){ if(supportOrientation){ orientation = window.orientation; switch(orientation){ case 90: case -90: orientation = 'landscape'; break; default: orientation = 'portrait'; break; } }else{ orientation = (window.innerWidth > window.innerHeight) ? 'landscape' : 'portrait'; } htmlNode.setAttribute('class',orientation); }; if(supportOrientation){ window.addEventListener('orientationchange',updateOrientation,false); }else{ //監(jiān)聽(tīng)resize事件 window.addEventListener('resize',updateOrientation,false); } updateOrientation(); }; window.addEventListener('DOMContentLoaded',init,false); })();
利用這個(gè)方法,就可以解決掉煩人的移動(dòng)端設(shè)備橫豎屏的檢測(cè)了。
相關(guān)文章
JavaScript TypeScript實(shí)現(xiàn)貪吃蛇游戲完整詳細(xì)流程
這篇文章主要介紹了JavaScript TypeScript實(shí)現(xiàn)貪吃蛇游戲流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-09-09JavaScript使用readAsDataUrl方法預(yù)覽圖片
這篇文章主要為大家詳細(xì)介紹了JavaScript使用readAsDataUrl方法預(yù)覽圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05JS實(shí)現(xiàn)在網(wǎng)頁(yè)中彈出一個(gè)輸入框的方法
這篇文章主要介紹了JS實(shí)現(xiàn)在網(wǎng)頁(yè)中彈出一個(gè)輸入框的方法,實(shí)例分析了prompt的用法,可用來(lái)設(shè)置密碼,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03微信小程序完美解決scroll-view高度自適應(yīng)問(wèn)題的方法
這篇文章主要介紹了微信小程序完美解決scroll-view高度自適應(yīng)問(wèn)題的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08淺析JS給原始數(shù)據(jù)類型加屬性和方法為什么不報(bào)錯(cuò)
這篇文章主要想和大家一起探討一下JavaScript中給原始數(shù)據(jù)類型添加屬性和方法為什么不報(bào)錯(cuò),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2023-11-11JavaScript判斷輸入值是否為正整數(shù)(判斷變量為數(shù)字)
在項(xiàng)目開(kāi)發(fā)中,有時(shí)候需要使用JavaScript驗(yàn)證用戶輸入的是否為正整數(shù),這篇文章主要給大家介紹了關(guān)于JavaScript判斷輸入值是否為正整數(shù)(判斷變量為數(shù)字)的相關(guān)資料,需要的朋友可以參考下,2023-11-11關(guān)于div自適應(yīng)高度/左右高度自適應(yīng)一致的js代碼
在DIV和CSS進(jìn)行網(wǎng)頁(yè)布局中,DIV的自適應(yīng)高度和自適應(yīng)寬度是一個(gè)很常見(jiàn)的問(wèn)題,本文將介紹左右自適應(yīng)高度一致的Jquery與DIV高度自適應(yīng)屏幕的js2013-03-03echarts柱狀堆疊圖實(shí)現(xiàn)示例(圖例和x軸都是動(dòng)態(tài)的)
一些柱形圖在數(shù)據(jù)量比較多的時(shí)候,橫向排列受到擠壓,導(dǎo)致柱形圖,變的非常細(xì),影響整體的效果,下面這篇文章主要給大家介紹了關(guān)于echarts柱狀堆疊圖(圖例和x軸都是動(dòng)態(tài)的)的相關(guān)資料,需要的朋友可以參考下2023-04-04JS判斷、校驗(yàn)MAC地址的2個(gè)實(shí)例
這篇文章主要介紹了JS判斷、校驗(yàn)MAC地址的2個(gè)實(shí)例,需要的朋友可以參考下2014-05-05