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 相关文章推荐
jquery 实现的全选和反选
Apr 15 Javascript
jquery多行滚动/向左或向上滚动/响应鼠标实现思路及代码
Jan 23 Javascript
js获得地址栏?问号后参数的方法
Aug 08 Javascript
javascript实现数组去重的多种方法
Mar 14 Javascript
jQuery滚动新闻实现代码
Jun 26 Javascript
基于jQuery的ajax方法封装
Jul 14 Javascript
输入框点击时边框变色效果的实现方法
Dec 26 Javascript
Angular ui.bootstrap.pagination分页
Jan 20 Javascript
web.js.字符串与正则表达式操作
May 13 Javascript
js实现分页功能
May 24 Javascript
Vue学习笔记进阶篇之过渡状态详解
Jul 14 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
Dec 02 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 Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
PHP $_SERVER详解
2009/01/16 PHP
php5.3以后的版本连接sqlserver2000的方法
2014/07/28 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
2014/10/13 PHP
php跨站攻击实例分析
2014/10/28 PHP
PHP文件生成的图片无法使用CDN缓存的解决方法
2015/06/20 PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
2016/07/21 PHP
PHP7多线程搭建教程
2017/04/21 PHP
基于jquery循环map功能的代码
2011/02/26 Javascript
百度地图api应用标注地理位置信息(js版)
2013/02/01 Javascript
JS隐藏参数post传值实例
2013/04/18 Javascript
js下拉菜单语言选项简单实现
2013/09/23 Javascript
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
js面向对象之静态方法和静态属性实例分析
2015/01/10 Javascript
解决jquery无法找到其他父级子集问题的方法
2016/05/10 Javascript
使用jQuery实现Web页面换肤功能的要点解析
2016/05/12 Javascript
详解JS对象封装的常用方式
2016/12/30 Javascript
bootstrapValidator.min.js表单验证插件
2017/02/09 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
2017/05/31 Javascript
Vue.js进阶知识点总结
2018/04/01 Javascript
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
浅谈Vue使用Elementui修改默认的最快方法
2020/12/05 Vue.js
基于javascript实现移动端轮播图效果
2020/12/21 Javascript
使用Python对Access读写操作
2017/03/30 Python
Python多线程爬取豆瓣影评API接口
2019/10/22 Python
Python with语句用法原理详解
2020/07/03 Python
使用Pytorch搭建模型的步骤
2020/11/16 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
利用CSS3实现炫酷的飞机起飞动画
2016/09/17 HTML / CSS
泰国最新活动和优惠:Megatix
2020/05/07 全球购物
端口镜像是怎么实现的
2014/03/25 面试题
如何进行Linux分区优化
2013/02/12 面试题
母亲节感恩寄语
2014/02/21 职场文书
2015年社区卫生工作总结
2015/04/21 职场文书
妇产科护理心得体会
2016/01/22 职场文书