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 相关文章推荐
SOSO地图JS画出标注和中心点以html形式运行
Aug 09 Javascript
php跨域调用json的例子
Nov 13 Javascript
JS判断变量是否为空判断是否null
Jul 25 Javascript
JavaScript获取元素尺寸和大小操作总结
Feb 27 Javascript
javascript实现输出指定行数正方形图案的方法
Aug 03 Javascript
jQuery基于ajax实现带动画效果无刷新柱状图投票代码
Aug 10 Javascript
JavaScript自定义分页样式
Jan 17 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
Feb 22 Javascript
正则验证小数点后面只能有两位数的方法
Feb 28 Javascript
Angular.js自动化测试之protractor详解
Jul 07 Javascript
基于Vue实现页面切换左右滑动效果
Jun 29 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
Sep 26 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 遍历XP文件夹下所有文件
2008/11/27 PHP
PHP无敌近乎加密方式!
2010/07/17 PHP
php用正则表达式匹配URL的简单方法
2013/11/12 PHP
一个基于phpQuery的php通用采集类分享
2014/04/09 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
2015/03/05 PHP
php关闭warning问题的解决方法
2016/05/17 PHP
CI框架扩展系统核心类的方法分析
2016/05/23 PHP
js将控件隐藏的方法及display属性介绍
2013/07/04 Javascript
js Date概念详细介绍
2013/11/22 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
2013/11/28 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
JavaScript 异常处理 详解
2015/02/06 Javascript
跟我学习javascript的垃圾回收机制与内存管理
2015/11/23 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
AngularJs directive详解及示例代码
2016/09/01 Javascript
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
关于Node.js中Buffer的一些你可能不知道的用法
2017/03/28 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
js实现右键弹出自定义菜单
2020/09/08 Javascript
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
用Python进行基础的函数式编程的教程
2015/03/31 Python
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
python实现读取命令行参数的方法
2015/05/22 Python
python创建文件时去掉非法字符的方法
2018/10/31 Python
Python求一批字符串的最长公共前缀算法示例
2019/03/02 Python
python 实现矩阵按对角线打印
2019/11/29 Python
使用 Python 清理收藏夹里已失效的网站
2019/12/03 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
python pptx复制指定页的ppt教程
2020/02/14 Python
关于css中margin的值和垂直外边距重叠问题
2020/10/27 HTML / CSS
.net工程师笔试题
2012/06/09 面试题
大学生工作推荐信范文
2013/12/02 职场文书
团组织关系介绍信
2014/01/12 职场文书
城市规划应届毕业生自荐信
2014/07/04 职场文书
python爬虫框架feapde的使用简介
2021/04/20 Python