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 相关文章推荐
优化innerHTML操作(提高代码执行效率)
Aug 20 Javascript
实现局部遮罩与关闭原理及代码
Feb 04 Javascript
Jquery实现的tab效果可以指定默认显示第几页
Oct 16 Javascript
Jquery通过Ajax访问XML数据的小例子
Nov 18 Javascript
Javascript数组与字典用法分析
Dec 13 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
Jan 28 Javascript
基于JS模仿windows文件按名称排序效果
Jun 29 Javascript
几种响应式文字详解
May 19 Javascript
Javascript中this关键字指向问题的测试与详解
Aug 11 Javascript
vue项目中使用Svg的方法
Oct 24 Javascript
Bootstrap4 gulp 配置详解
Jan 06 Javascript
mpvue小程序循环动画开启暂停的实现方法
May 15 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中$this->含义分析
2009/11/29 PHP
Smarty变量调节器失效的解决办法
2014/08/20 PHP
php连接与操作PostgreSQL数据库的方法
2014/12/25 PHP
PHP实现批量检测网站是否能够正常打开的方法
2016/08/23 PHP
用Javascript同时提交多个Web表单的方法
2009/12/26 Javascript
关于html+ashx开发中几个问题的解决方法
2011/07/18 Javascript
JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)
2013/05/27 Javascript
JS替换字符串中字符即替换全部而不是第一个
2014/06/04 Javascript
jQuery实现购物车多物品数量的加减+总价计算
2014/06/06 Javascript
gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
2016/02/21 Javascript
Knockoutjs 学习系列(一)ko初体验
2016/06/07 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
2016/07/28 Javascript
js HTML5手机刮刮乐代码
2020/09/29 Javascript
微信小程序之获取当前位置经纬度以及地图显示详解
2017/05/09 Javascript
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
vue获取data数据改变前后的值方法
2019/11/07 Javascript
JS常用排序方法实例代码解析
2020/03/03 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
浅谈JavaScript窗体Window.ShowModalDialog使用
2020/07/22 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
[02:51]DOTA2英雄基础教程 艾欧
2014/01/13 DOTA
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
Python selenium 父子、兄弟、相邻节点定位方式详解
2016/09/15 Python
python中pylint使用方法(pylint代码检查)
2018/04/06 Python
详解Python字典的操作
2019/03/04 Python
python异常处理之try finally不报错的原因
2020/05/18 Python
python 数据分析实现长宽格式的转换
2020/05/18 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
阿根廷首家户外用品制造商和经销商:Montagne
2018/02/12 全球购物
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
企业群众路线教育实践活动心得体会
2014/11/03 职场文书
干部个人考察材料
2014/12/24 职场文书
外科护士长工作总结
2015/08/12 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书
立秋之描写立秋的作文(五年级)
2019/08/08 职场文书
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers