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 相关文章推荐
一个小型js框架myJSFrame附API使用帮助
Jun 28 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
Apr 29 Javascript
AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录
Jan 02 Javascript
jQuery模拟新浪微博首页滚动效果的方法
Mar 11 Javascript
在JavaScript中call()与apply()区别
Jan 22 Javascript
Node.js编写组件的三种实现方式
Feb 25 Javascript
JavaScript原生对象常用方法总结(推荐)
May 13 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
Dec 27 Javascript
JS出现失效的情况总结
Jan 20 Javascript
深入解析ES6中的promise
Nov 08 Javascript
vue使用better-scroll实现下拉刷新、上拉加载
Nov 23 Javascript
vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作
Jul 31 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编码规范-php coding standard
2007/03/16 PHP
PHP与SQL注入攻击[二]
2007/04/17 PHP
php smarty 二级分类代码和模版循环例子
2011/06/01 PHP
php中使用cookie来保存用户登录信息的实现代码
2012/03/08 PHP
PHP PDOStatement::fetch讲解
2019/01/31 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例
2013/06/25 Javascript
jquery中filter方法用法实例分析
2015/02/06 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
prototype.js简单实现ajax功能示例
2017/10/18 Javascript
Node.js中,在cmd界面,进入退出Node.js运行环境的方法
2018/05/12 Javascript
Layer弹出层动态获取数据的方法
2018/08/20 Javascript
微信小程序自定义可滑动日历界面
2018/12/28 Javascript
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
2020/09/01 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
vue使用vant中的checkbox实现全选功能
2020/11/17 Vue.js
[02:01]2018完美盛典-开场舞《双子星》
2018/12/16 DOTA
Python yield 使用浅析
2015/05/28 Python
解决python matplotlib imshow无法显示的问题
2018/05/24 Python
Python利用heapq实现一个优先级队列的方法
2019/02/03 Python
python3读取csv文件任意行列代码实例
2020/01/13 Python
python入门:argparse浅析 nargs='+'作用
2020/07/12 Python
python的链表基础知识点
2020/09/13 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
日本亚马逊官方网站:Amazon.co.jp
2020/04/14 全球购物
数字漫画:comiXology
2020/06/13 全球购物
机械工程师岗位职责
2014/06/16 职场文书
公司租车协议书
2015/01/29 职场文书
2016年寒假社会实践活动总结
2015/03/27 职场文书
鲁冰花观后感
2015/06/10 职场文书
2016秋季运动会前导词
2015/11/25 职场文书
SQLServer之常用函数总结详解
2021/08/30 SQL Server
Python中异常处理用法
2021/11/27 Python
Redis集群节点通信过程/原理流程分析
2022/03/18 Redis