javascript检测移动设备横竖屏


Posted in Javascript onMay 21, 2016

如何判断

移动设备提供了两个对象,一个属性,一个事件:

(1)window.orientation   属于window对象上一个属性;共有三个值 :0为竖屏模式(portrait),90为向左反转变为横屏模式(landscape),-90为向右反转变为横屏模式(landscape),最后180就是设备上下互换还是竖屏模式。

(2)orientationchange     是一个event,在设备旋转时,会触发此事件,如同PC上使用的resize事件。

这两个搭配起来使用,很容易就能获得设备的横竖屏状态,代码如下:

(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标签加一个状态
   //然后根据不同状态,显示不同大小
   document.body.parentNode.setAttribute('class',orientation);
  };

  window.addEventListener('orientationchange',updateOrientation,false);
  updateOrientation();
 };

 window.addEventListener('DOMContentLoaded',init,false);
})();

在css中就可以这样写:

/**竖屏 div边框显示蓝色**/
.portrait body div{
 border:1px solid blue;
}
/**竖屏 div边框显示黄色**/
.landscape body div{
 border:1px solid yellow;
}

当然还可以使用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在设备中不存在的情况怎么处理呢?(一般一个不存在,另一个也不存在,反之)

在前期开发中,经常会用Chrome的device model调式,但是这个属性确实不存在,哪怎么获得这个值呢?简单的方式就是依据宽和高的大小比较判断,宽小于高为竖屏,宽大与高就是横屏。

获得结果的方式知道了,接下来就是怎么监听设备反转事件了,既然orientationchange不可用,就使用最基本的resize事件或者使用定时器检测,还是看代码:

(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);
  
  //监听resize事件
  window.addEventListener('resize',updateOrientation,false);
 };

 window.addEventListener('DOMContentLoaded',init,false);
})();

最后,把以上两种方式合起来,就是一个完整的检测解决方案

(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{
   //监听resize事件
   window.addEventListener('resize',updateOrientation,false);
  }

  updateOrientation();
 };

 window.addEventListener('DOMContentLoaded',init,false);
})();

总结

通过orientationchange事件来监听设备是否旋转,配合window.orientation属性判断当前是横屏还是竖屏,以便执行不同的操作。

Javascript 相关文章推荐
浅析Cookie中的Path与domain
Dec 18 Javascript
jquery无法设置checkbox选中即没有变成选中状态
Mar 27 Javascript
使用Javascript简单实现图片无缝滚动
Dec 05 Javascript
js显示文本框提示文字的方法
May 07 Javascript
浅谈window对象的scrollBy()方法
Jul 15 Javascript
javascript动态生成树形菜单的方法
Nov 14 Javascript
详解Angular2响应式表单
Jun 14 Javascript
JS闭包的几种常见形式实例详解
Sep 16 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
Nov 27 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
Feb 01 Javascript
JS严格模式知识点总结
Feb 27 Javascript
Vue 项目分环境打包的方法示例
Aug 03 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
May 21 #Javascript
js+html5实现canvas绘制网页时钟的方法
May 21 #Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
May 21 #Javascript
javascript RegExp 使用说明
May 21 #Javascript
js+html5实现canvas绘制椭圆形图案的方法
May 21 #Javascript
jQuery DataTables插件自定义Ajax分页实例解析
Apr 28 #Javascript
Markdown+Bootstrap图片自适应属性详解
May 21 #Javascript
You might like
基于PHP导出Excel的小经验 完美解决乱码问题
2013/06/10 PHP
PHP批量检测并去除文件BOM头代码实例
2014/05/08 PHP
php 实现一个字符串加密解密的函数实例代码
2016/11/01 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
判断页面是关闭还是刷新的js代码
2007/01/28 Javascript
javascript showModalDialog,open取得父窗口的方法
2010/03/10 Javascript
iframe 父窗口和子窗口相互的调用方法集锦
2010/12/15 Javascript
JS实现图片翻书效果示例代码
2013/09/09 Javascript
jQuery模拟新浪微博首页滚动效果的方法
2015/03/11 Javascript
全面解析Javascript无限添加QQ好友原理
2016/06/15 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
使用原生js写ajax实例(推荐)
2017/05/31 Javascript
JS实现的ajax和同源策略(实例讲解)
2017/12/01 Javascript
使用Angular CLI进行Build(构建)和Serve详解
2018/03/24 Javascript
NodeJS加密解密及node-rsa加密解密用法详解
2018/10/12 NodeJs
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
2019/04/29 Javascript
JavaScript用document.write()输出换行的示例代码
2020/11/26 Javascript
[01:04:02]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第二场 1月24日
2021/03/11 DOTA
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
Python的Django中将文件上传至七牛云存储的代码分享
2016/06/03 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
pycharm中显示CSS提示的知识点总结
2019/07/29 Python
django echarts饼图数据动态加载的实例
2019/08/12 Python
numpy实现神经网络反向传播算法的步骤
2019/12/24 Python
解决Python import docx出错DLL load failed的问题
2020/02/13 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
Python操作Word批量生成合同的实现示例
2020/08/28 Python
Python基于execjs运行js过程解析
2020/11/27 Python
美国最大的旗帜经销商:Carrot-Top
2018/02/26 全球购物
德国高尔夫商店:Golfshop.de
2019/06/22 全球购物
英国现代、当代和设计师家具店:Furntastic
2020/07/18 全球购物
肯尼迪就职演说稿
2013/12/31 职场文书
爱牙日宣传活动总结
2015/02/05 职场文书
客房服务员岗位职责
2015/02/09 职场文书
恶魔之树最顶端的三颗果实 震震果实上榜,第一可以制造岩浆
2022/03/18 日漫