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 相关文章推荐
csdn 批量接受好友邀请
Feb 19 Javascript
Underscore.js常用方法总结
Feb 28 Javascript
AngularJS下对数组的对比分析
Aug 24 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
Feb 21 Javascript
JS实现线性表的链式表示方法示例【经典数据结构】
Apr 11 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
Apr 20 Javascript
Vue+axios 实现http拦截及路由拦截实例
Apr 25 Javascript
node内置调试方法总结
Feb 22 Javascript
vue 移动端注入骨架屏的配置方法
Jun 25 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
Oct 16 Javascript
JavaScript常用工具函数库汇总
Sep 17 Javascript
Vue实现多页签组件
Jan 14 Vue.js
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 extract 将数组拆分成多个变量的函数
2010/06/30 PHP
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
2012/02/27 Javascript
js计算精度问题小结
2013/04/22 Javascript
JQuery获取或设置ckeditor的数据(示例代码)
2013/11/15 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
JavaScript中的依赖注入详解
2015/03/18 Javascript
再JavaScript的jQuery库中编写动画效果的指南
2015/08/13 Javascript
跨域请求的完美解决方法(JSONP, CORS)
2016/06/12 Javascript
浅谈js图片前端预览之filereader和window.URL.createObjectURL
2016/06/30 Javascript
用nodejs搭建websocket服务器
2017/01/23 NodeJs
基于node.js之调试器详解
2017/08/22 Javascript
vue2.0 子组件改变props值,并向父组件传值的方法
2018/03/01 Javascript
mock.js模拟前后台交互
2019/07/25 Javascript
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
2019/12/23 Javascript
vue组件系列之TagsInput详解
2020/05/14 Javascript
vue中可编辑树状表格的实现代码
2020/10/31 Javascript
如何利用vue实现波谱拟合详解
2020/11/05 Javascript
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
Python zip()函数用法实例分析
2018/03/17 Python
python 实现矩阵填充0的例子
2019/11/29 Python
python实现的Iou与Giou代码
2020/01/18 Python
TensorFlow2.0矩阵与向量的加减乘实例
2020/02/07 Python
Python定时器线程池原理详解
2020/02/26 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
Vans英国官方网站:美国南加州的原创极限运动潮牌
2017/01/20 全球购物
德国足球商店:OUTFITTER
2019/05/06 全球购物
新西兰最大的连锁超市:Countdown
2020/06/04 全球购物
敏捷开发的主要原则都有哪些
2015/04/26 面试题
自主招生教师推荐信
2014/05/10 职场文书
环保倡议书500字
2014/05/15 职场文书
会计学自荐信
2014/06/03 职场文书
说好普通话圆梦你我他演讲稿
2014/09/21 职场文书
党的群众路线教育实践活动制度建设计划方案
2014/10/31 职场文书
Mac环境Nginx配置和访问本地静态资源的实现
2021/03/31 Servers
如何用 Python 子进程关闭 Excel 自动化中的弹窗
2021/05/07 Python
Redis分布式锁的7种实现
2022/04/01 Redis