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 相关文章推荐
img标签中onerror用法
Aug 13 Javascript
node.js中的emitter.emit方法使用说明
Dec 10 Javascript
js实现C#的StringBuilder效果完整实例
Dec 22 Javascript
基于javascript实现句子翻牌网页版小游戏
Mar 23 Javascript
JavaScript中的Number数字类型学习笔记
May 26 Javascript
SWFUpload多文件上传及文件个数限制的方法
May 31 Javascript
js时间戳格式化成日期格式的多种方法介绍
Feb 16 Javascript
利用Angular.js编写公共提示模块的方法教程
May 28 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
Dec 13 Javascript
vue项目base64字符串转图片的实现代码
Jul 13 Javascript
微信小程序可滑动周日历组件使用详解
Oct 21 Javascript
jQuery实现聊天对话框
Feb 08 jQuery
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 和 XML: 使用expat函数(二)
2006/10/09 PHP
推荐php模板技术[转]
2007/01/04 PHP
shopex主机报错误请求解决方案(No such file or directory)
2011/12/27 PHP
php采用session实现防止页面重复刷新
2015/12/24 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
javascript 清除输入框中的数据
2009/04/13 Javascript
让FireFox支持innerText的实现代码
2009/12/01 Javascript
IE bug table元素的innerHTML
2010/01/11 Javascript
jquery foreach使用示例
2013/09/12 Javascript
JS判断文本框内容改变事件的简单实例
2014/03/07 Javascript
jquery实现鼠标滑过显示提示框的方法
2015/02/05 Javascript
JQuery使用index方法获取Jquery对象数组下标的方法
2015/05/18 Javascript
vue通过watch对input做字数限定的方法
2017/07/13 Javascript
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
微信小程序实现日历功能
2018/11/27 Javascript
基于javascript实现贪吃蛇小游戏
2019/11/25 Javascript
JavaScript实现表单验证功能
2020/12/09 Javascript
在python中的socket模块使用代理实例
2014/05/29 Python
Python快速排序算法实例分析
2017/11/29 Python
python 爬虫 批量获取代理ip的实例代码
2018/05/22 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
Python实现在Windows平台修改文件属性
2020/03/05 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
Radley英国官网:英国莱德利小狗包
2019/03/21 全球购物
法国床上用品商店:La Compagnie du lit
2019/12/26 全球购物
社区个人对照检查材料(群众路线)
2014/09/26 职场文书
关于运动会广播稿200字
2014/10/08 职场文书
老干部工作汇报材料
2014/10/28 职场文书
工作作风懒散检讨书
2014/10/29 职场文书
大学生读书笔记范文
2015/07/01 职场文书
安全生产标语口号
2015/12/26 职场文书
优秀员工演讲稿
2019/06/21 职场文书
2019年入党思想汇报格式与要求
2019/06/25 职场文书
大学生创业计划书常用模板
2019/08/07 职场文书