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 相关文章推荐
Sample script that displays all of the users in a given SQL Server DB
Jun 16 Javascript
谷歌浏览器 insertCell与appendChild的区别
Feb 12 Javascript
javascript中的对象创建 实例附注释
Feb 08 Javascript
Select标签下拉列表二级联动级联实例代码
Feb 07 Javascript
iframe子页面与父页面在同域或不同域下的js通信
May 07 Javascript
alert出数组中的随即值代码
Sep 25 Javascript
JavaScript生成指定范围随机数和随机序列的方法
May 05 Javascript
React 实现拖拽功能的示例代码
Jan 06 Javascript
vue实现信息管理系统
May 30 Javascript
js实现页面导航层级指示效果
Aug 25 Javascript
谈谈JavaScript中的函数
Sep 08 Javascript
Vue-Element-Admin集成自己的接口实现登录跳转
Jun 23 Vue.js
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
香妃
2021/03/03 冲泡冲煮
在线增减.htpasswd内的用户
2006/10/09 PHP
随时给自己贴的图片加文字的php代码
2007/03/08 PHP
php实现水仙花数示例分享
2014/04/03 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
2014/06/12 PHP
PHP简单获取多个checkbox值的方法
2016/06/13 PHP
JQUERY THICKBOX弹出层插件
2008/08/30 Javascript
jQuery Ajax文件上传(php)
2009/06/16 Javascript
JavaScript 变量基础知识
2009/11/07 Javascript
js 返回时间戳所对应的具体时间
2010/07/20 Javascript
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
2014/05/04 Javascript
js解决select下拉选不中问题
2014/10/14 Javascript
js对象继承之原型链继承实例
2015/01/10 Javascript
jQuery中(function($){})(jQuery)详解
2015/07/15 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
2016/04/01 Javascript
浅析location.href跨窗口调用函数
2016/11/22 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
推荐一个基于Node.js的表单验证库
2019/02/15 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
2020/06/11 Javascript
[01:22]DOTA2神秘商店携大量周边降临完美大师赛
2017/11/07 DOTA
[02:49]DAC2018决赛日TOP5 LGD开启黑暗之门绝杀VP
2018/04/08 DOTA
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
Python中str.join()简单用法示例
2018/03/20 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
2018/11/07 Python
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
Python_查看sqlite3表结构,查询语句的示例代码
2019/07/17 Python
Python selenium键盘鼠标事件实现过程详解
2020/07/28 Python
澳大利亚在线时尚精品店:Hello Molly
2018/02/26 全球购物
澳大利亚100%丝绸多彩度假装商店:TheSwankStore
2019/09/04 全球购物
电工技术比武方案
2014/05/11 职场文书
2015年机关党建工作总结
2015/05/22 职场文书
朋友聚会开场白
2015/06/01 职场文书
2016年国培研修日志
2015/11/13 职场文书
Python中Selenium对Cookie的操作方法
2021/07/09 Python