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 相关文章推荐
两个DIV等高的JS的实现代码
Dec 23 Javascript
javascript实现上传图片并预览的效果实现代码
Apr 11 Javascript
Javascript基础知识(二)事件
Sep 29 Javascript
jQuery选择器querySelector的使用指南
Jan 23 Javascript
Bootstrap表单布局样式代码
May 31 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
Feb 16 Javascript
Vue实现选择城市功能
May 27 Javascript
详解vue模拟加载更多功能(数据追加)
Jun 23 Javascript
vue项目实战总结篇
Feb 11 Javascript
layui 实现table翻页滚动条位置保持不变的例子
Sep 05 Javascript
使用layui的layer组件做弹出层的例子
Sep 27 Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
Apr 09 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
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
基于mysql的论坛(5)
2006/10/09 PHP
构建简单的Webmail系统
2006/10/09 PHP
转PHP手册及PHP编程标准
2006/12/17 PHP
ubuntu下配置nginx+php+mysql详解
2015/09/10 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
2016/05/20 PHP
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
jquery操作 iframe的方法
2014/12/03 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
JavaScript中0和""比较引发的问题
2016/05/26 Javascript
bootstrap datetimepicker实现秒钟选择下拉框
2017/01/05 Javascript
Angular2 组件间通过@Input @Output通讯示例
2017/08/24 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
2018/09/29 Javascript
scrapyd schedule.json setting 传入多个值问题
2019/08/07 Javascript
JavaScript缺少insertAfter解决方案
2020/07/03 Javascript
详解node.js创建一个web服务器(Server)的详细步骤
2021/01/15 Javascript
在Python文件中指定Python解释器的方法
2019/02/18 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
Python run()函数和start()函数的比较和差别介绍
2020/05/03 Python
python中remove函数的踩坑记录
2021/01/04 Python
CSS3 border-image详解、应用及jQuery插件
2011/08/29 HTML / CSS
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
老板电器官方购物商城:老板油烟机、燃气灶、消毒柜、电烤箱
2018/05/30 全球购物
希腊品牌鞋类销售网站:epapoutsia.gr
2020/03/18 全球购物
Big Green Smile法国:领先的英国有机和天然产品在线商店
2021/01/02 全球购物
估算杭州有多少软件工程师
2015/08/11 面试题
英语专业个人求职自荐信
2013/09/21 职场文书
委托书模板
2014/04/04 职场文书
驾驶员培训方案
2014/05/01 职场文书
广告艺术设计专业自荐书
2014/07/08 职场文书
2014年群众路线教育实践活动整改措施
2014/09/24 职场文书
国家助学金受助感言
2015/08/01 职场文书
python 逐步回归算法
2021/04/06 Python
Python时间操作之pytz模块使用详解
2022/06/14 Python