javascript檢測(cè)移動(dòng)設(shè)備橫豎屏
如何判斷
移動(dòng)設(shè)備提供了兩個(gè)對(duì)象,一個(gè)屬性,一個(gè)事件:
(1)window.orientation 屬于window對(duì)象上一個(gè)屬性;共有三個(gè)值 :0為豎屏模式(portrait),90為向左反轉(zhuǎn)變?yōu)闄M屏模式(landscape),-90為向右反轉(zhuǎn)變?yōu)闄M屏模式(landscape),最后180就是設(shè)備上下互換還是豎屏模式。
(2)orientationchange 是一個(gè)event,在設(shè)備旋轉(zhuǎn)時(shí),會(huì)觸發(fā)此事件,如同PC上使用的resize事件。
這兩個(gè)搭配起來使用,很容易就能獲得設(shè)備的橫豎屏狀態(tài),代碼如下:
(function(){
var init = function(){
var updateOrientation = function(){
var orientation = window.orientation;
switch(orientation){
case 90:
case -90:
orientation = 'landscape';
break;
default:
orientation = 'portrait';
break;
}
//do something
//比如在html標(biāo)簽加一個(gè)狀態(tài)
//然后根據(jù)不同狀態(tài),顯示不同大小
document.body.parentNode.setAttribute('class',orientation);
};
window.addEventListener('orientationchange',updateOrientation,false);
updateOrientation();
};
window.addEventListener('DOMContentLoaded',init,false);
})();
在css中就可以這樣寫:
/**豎屏 div邊框顯示藍(lán)色**/
.portrait body div{
border:1px solid blue;
}
/**豎屏 div邊框顯示黃色**/
.landscape body div{
border:1px solid yellow;
}
當(dāng)然還可以使用media queries的方式(推薦這種):
@media all and (orientation: portrait) {
body div {
border:1px solid blue;
}
}
@media all and (orientation: landscape) {
body div {
border:1px solid yellow;
}
}
兼容性
如果window.orientation或者orientationchange在設(shè)備中不存在的情況怎么處理呢?(一般一個(gè)不存在,另一個(gè)也不存在,反之)
在前期開發(fā)中,經(jīng)常會(huì)用Chrome的device model調(diào)式,但是這個(gè)屬性確實(shí)不存在,哪怎么獲得這個(gè)值呢?簡單的方式就是依據(jù)寬和高的大小比較判斷,寬小于高為豎屏,寬大與高就是橫屏。
獲得結(jié)果的方式知道了,接下來就是怎么監(jiān)聽設(shè)備反轉(zhuǎn)事件了,既然orientationchange不可用,就使用最基本的resize事件或者使用定時(shí)器檢測(cè),還是看代碼:
(function(){
var updateOrientation = function(){
var orientation = (window.innerWidth > window.innerHeight) ? 'landscape' : 'portrait';
document.body.parentNode.setAttribute('class',orientation);
};
var init = function(){
updateOrientation();
//每5秒檢查一次
//window.setInterval(updateOrientation,5000);
//監(jiān)聽resize事件
window.addEventListener('resize',updateOrientation,false);
};
window.addEventListener('DOMContentLoaded',init,false);
})();
最后,把以上兩種方式合起來,就是一個(gè)完整的檢測(cè)解決方案
(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)聽resize事件
window.addEventListener('resize',updateOrientation,false);
}
updateOrientation();
};
window.addEventListener('DOMContentLoaded',init,false);
})();
總結(jié)
通過orientationchange事件來監(jiān)聽設(shè)備是否旋轉(zhuǎn),配合window.orientation屬性判斷當(dāng)前是橫屏還是豎屏,以便執(zhí)行不同的操作。
相關(guān)文章
JS實(shí)現(xiàn)多物體運(yùn)動(dòng)
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)多物體運(yùn)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
js實(shí)現(xiàn)網(wǎng)頁五子棋進(jìn)階版
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)網(wǎng)頁五子棋進(jìn)階版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
html+javascript+bootstrap實(shí)現(xiàn)層級(jí)多選框全層全選和多選功能
想做一個(gè)先按層級(jí)排序并可以多選的功能,首先傾向于用多層標(biāo)簽式的,直接選定加在文本域里,接下來通過本文給大家介紹html+javascript+bootstrap實(shí)現(xiàn)層級(jí)多選框全層全選和多選功能,需要的朋友參考下2017-03-03
利用JavaScript實(shí)現(xiàn)靜態(tài)圖片局部流動(dòng)效果
如果你有玩過《王者榮耀》、《陰陽師》?等手游,一定注意到過它的啟動(dòng)動(dòng)畫、皮膚立繪卡片等場(chǎng)景,經(jīng)常采用靜態(tài)底圖加局部液態(tài)流動(dòng)效果的簡單動(dòng)畫,本文將利用JavaScript實(shí)現(xiàn)這一效果,需要的可以參考一下2022-08-08
B/S模式項(xiàng)目中常用的javascript匯總
本篇文章是對(duì)B/S模式項(xiàng)目中常用的javascript進(jìn)行了匯總介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-12-12
微信小程序三級(jí)聯(lián)動(dòng)選擇器使用方法
這篇文章主要為大家詳細(xì)介紹了微信小程序三級(jí)聯(lián)動(dòng)選擇器使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
JS實(shí)現(xiàn)加載和讀取XML文件的方法詳解
這篇文章主要介紹了JS實(shí)現(xiàn)加載和讀取XML文件的方法,結(jié)合實(shí)例形式分析了javascript針對(duì)xml文件的加載與讀取相關(guān)實(shí)現(xiàn)步驟與操作技巧,需要的朋友可以參考下2017-04-04
cocos2dx骨骼動(dòng)畫Armature源碼剖析(二)
本篇主要給大家介紹cocos2dx骨骼動(dòng)畫Armature源碼剖析之flash中數(shù)據(jù)與xml中數(shù)據(jù)關(guān)系,需要的朋友一起來學(xué)習(xí)吧2015-09-09

