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 相关文章推荐
浅析tr的隐藏和显示问题
Mar 05 Javascript
jQuery Mobile框架中的表单组件基础使用教程
May 17 Javascript
Bootstrap零基础入门教程(三)
Jul 18 Javascript
Web纯前端“旭日图”实现元素周期表
Mar 10 Javascript
React组件之间的通信的实例代码
Jun 27 Javascript
bootstrap multiselect下拉列表功能
Aug 22 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
Oct 27 Javascript
react 父子组件之间通讯props
Sep 08 Javascript
JS倒计时两种实现方式代码实例
Jul 27 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
Aug 31 Javascript
基于vue hash模式微信分享#号的解决
Sep 07 Javascript
原生js实现自定义消息提示框
Nov 19 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
Zend Framework中的简单工厂模式 图文
2012/07/10 PHP
非常实用的php验证码类
2016/05/15 PHP
php使用QueryList轻松采集js动态渲染页面方法
2018/09/11 PHP
php获取小程序码的实现代码(B类接口)
2020/06/13 PHP
JavaScript获取网页中第一个链接ID的方法
2015/04/03 Javascript
网络传输协议(http协议)
2016/11/18 Javascript
JavaScript中Math对象的方法介绍
2017/01/05 Javascript
详解Vue 实例中的生命周期钩子
2017/03/21 Javascript
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
JavaScript中判断为整数的多种方式及保留两位小数的方法
2019/09/09 Javascript
python实现简单温度转换的方法
2015/03/13 Python
python3简单实现微信爬虫
2015/04/09 Python
Python字典及字典基本操作方法详解
2018/01/30 Python
Python用 KNN 进行验证码识别的实现方法
2018/02/06 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
2018/04/17 Python
浅谈Python批处理文件夹中的txt文件
2019/03/11 Python
Python如何调用外部系统命令
2019/08/07 Python
Django实现文件上传和下载功能
2019/10/06 Python
Python 使用type来定义类的实现
2019/11/19 Python
浅谈keras的深度模型训练过程及结果记录方式
2020/01/24 Python
家庭睡衣和家庭用品:Little Blue House
2018/03/18 全球购物
世界上最全面的草药补充剂和顶级品牌维生素网站:HerbsPro
2019/01/20 全球购物
超市端午节活动方案
2014/01/23 职场文书
医校毕业生自我鉴定
2014/01/25 职场文书
自荐信的基本格式
2014/02/22 职场文书
公司介绍信范文
2015/01/31 职场文书
成品仓管员岗位职责
2015/04/01 职场文书
关爱留守儿童捐款倡议书
2015/04/27 职场文书
让世界充满爱观后感
2015/06/10 职场文书
企业转让协议书(范文2篇)
2019/08/15 职场文书
创业计划书之香辣虾火锅
2019/09/23 职场文书
nginx 反向代理之 proxy_pass的实现
2021/03/31 Servers
Windows 64位 安装 mysql 8.0.28 图文教程
2022/04/19 MySQL