JS检测移动端横竖屏的代码


Posted in Javascript onMay 30, 2016

使用media来判断屏幕宽度遇到的问题:

ios上当我旋转屏幕的时候可行,但是安卓机上没反应,横屏显示的还是我竖屏的样式。

查了一下资料,css3的media如果要在移动端有较好的显示效果,需要在页头加上这段代码

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

可是这段代码我不能用。因为我的页面是做了适配的。可以根据屏幕的大小来显示字号和样式的大小。如果我加了这段代码的话,我的适配就不能用了。所以要用其他方法

解决办法:

移动端的设备提供了一个事件:orientationChange事件

这个事件是苹果公司为safari中添加的。以便开发人员能够确定用户何时将设备由横向查看切换为纵向查看模式。

在设备旋转的时候,会触发这个事件,

// Listen for orientation changes
window.addEventListener("orientationchange", function() {
// Announce the new orientation number
alert(window.orientation);
}, false);

只要用户改变了设备的查看模式,就会触发 orientationChange事件。此时的event对象不包含任何有价值的信息,

因为唯一相关信息可以通过window.orientation访问到

orientation属性

它有三个值:0,90,-90

0为竖屏模式(portrait),-90意味着该设备横向旋转到右侧的横屏模式(landscape),而90表示该设备是横向旋转到左边的横屏模式(landscape)。

还有一个是180,表示竖屏但是是翻转过来的竖屏模式。但这种模式至今尚未得到支持。

如图所示:

JS检测移动端横竖屏的代码

因此,结合这个orientationChange事件和window的orientation属性,我们就比较好判断设备是处于横屏还是竖屏了

(function(){
var init = function(){
var updateOrientation = function(){
var orientation = window.orientation;
switch(orientation){
case 90:
case -90:
orientation = 'landscape'; //这里是横屏
break;
default:
orientation = 'portrait'; //这里是竖屏
break;
}
//html根据不同的旋转状态,加上不同的class,横屏加上landscape,竖屏
//加上portrait
document.body.parentNode.setAttribute('class',orientation);
};
// 每次旋转,调用这个事件。
window.addEventListener('orientationchange',updateOrientation,false);
// 事件的初始化
updateOrientation();
};
window.addEventListener('DOMContentLoaded',init,false);
})();

因此可以根据不同的旋转状态加上class,所以我们的css就可以这样写了

/**竖屏 body显示红色**/
.portrait body div{
background: red;
}
/**横屏 body显示蓝色**/
.landscape body div{
background: blue;
}

另外一种写法是,借助 media queries

@media all and (orientation: portrait) {
body div {background: red;} 
}
@media all and (orientation: landscape) { 
body div {background: blue; } 
}

这个orientation media query 在ios3.2+和安卓2.0+上还有其他浏览器上有效。

相对来说,这种代码更加的简洁一点。跟上面的js+css,这种代码是纯css。当设备旋转的时候,就会根据设备旋转的方向来调用改方向的css

兼容性

有些设备并没有提供orientationchange事件,但不触发窗口的resize事件。并且media queries也不支持的情况下,我们该怎么办呢?

可以用resize事件来判断。用innerWidth , innerHeight,可以检索得到屏幕大小。依据宽和高的大小比较判断,宽小于高为竖屏,宽大与高就是横屏。

代码如下:

(function(){
var updateOrientation = function(){
var orientation = (window.innerWidth > window.innerHeight) ? 'landscape' : 'portrait';
document.body.parentNode.setAttribute('class',orientation);
};
var init = function(){
updateOrientation();
//监听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);
})();

利用这个方法,就可以解决掉烦人的移动端设备横竖屏的检测了。

Javascript 相关文章推荐
将HTML自动转为JS代码
Jun 26 Javascript
DOMAssitant最新版 DOMAssistant 2.5发布
Dec 25 Javascript
Eval and new funciton not the same thing
Dec 27 Javascript
jquery的总体架构分析及实现示例详解
Nov 08 Javascript
JavaScript中exec函数用法实例分析
Jun 08 Javascript
浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
Jan 19 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
Jan 26 Javascript
Vue实现virtual-dom的原理简析
Jul 10 Javascript
基于JavaScript实现多级菜单效果
Jul 25 Javascript
Vue2.0设置全局样式(less/sass和css)
Nov 18 Javascript
jQuery实现遍历XML节点和属性的方法示例
Apr 29 jQuery
详解JavaScript中分解数字的三种方法
Jan 05 Javascript
BootStrap中Tab页签切换实例代码
May 30 #Javascript
js小数计算小数点后显示多位小数的实现方法
May 30 #Javascript
拥Bootstrap入怀——导航栏篇
May 30 #Javascript
基于Bootstrap实现tab标签切换效果
Apr 15 #Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
May 30 #Javascript
Bootstrap编写导航栏和登陆框
May 30 #Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
May 30 #Javascript
You might like
社区(php&amp;&amp;mysql)二
2006/10/09 PHP
帖几个PHP的无限分类实现想法~
2007/01/02 PHP
PHP入门学习的几个不错的实例代码
2008/07/13 PHP
PHP UTF8编码内的繁简转换类
2009/07/20 PHP
jQuery EasyUI API 中文文档 - DateBox日期框
2011/10/15 PHP
php数组函数序列之in_array() - 查找数组中是否存在指定值
2011/11/07 PHP
php编程每天必学之验证码
2016/03/03 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
初学prototype,发个JS接受URL参数的代码
2006/09/25 Javascript
图片上传判断及预览脚本的效果实例
2013/08/07 Javascript
JS截取字符串常用方法详细整理
2013/10/28 Javascript
jQuery 无限级菜单的简单实例
2014/02/21 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
plupload+artdialog实现多平台上传文件
2016/07/19 Javascript
jquery插件锦集【推荐】
2016/12/16 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
2017/01/23 Javascript
Three.js利用dat.GUI如何简化试验流程详解
2017/09/26 Javascript
ionic3实战教程之随机布局瀑布流的实现方法
2017/12/28 Javascript
javaScript动态添加Li元素的实例
2018/02/24 Javascript
微信小程序简单的canvas裁剪图片功能详解
2019/07/12 Javascript
Vue中的transition封装组件的实现方法
2019/08/13 Javascript
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
Javascript前端下载后台传来的文件流代码实例
2020/08/18 Javascript
Vue项目开发常见问题和解决方案总结
2020/09/11 Javascript
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
简单谈谈Python中的几种常见的数据类型
2017/02/10 Python
Python基于mysql实现学生管理系统
2019/02/21 Python
python 一个figure上显示多个图像的实例
2019/07/08 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
2019/12/13 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
信用社竞聘演讲稿
2014/05/16 职场文书
经营目标管理责任书
2014/07/25 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
2015年团支部工作总结
2015/04/03 职场文书