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 相关文章推荐
点击广告后才能获得下载地址
Oct 26 Javascript
HTML5附件拖拽上传drop &amp; google.gears实现代码
Apr 28 Javascript
js时间日期和毫秒的相互转换
Feb 22 Javascript
ie下jquery.getJSON的缓存问题的处理方法
Mar 29 Javascript
自己使用js/jquery写的一个定制对话框控件
May 02 Javascript
Bootstrap 3多级下拉菜单实例
Nov 23 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
Dec 13 Javascript
js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解
Jan 19 Javascript
详解微信UnionID作用
May 15 Javascript
微信小程序实现圆形进度条动画
Nov 18 Javascript
在小程序中推送模板消息的实现方法
Jul 22 Javascript
jQuery实现全选、反选和不选功能的方法详解
Dec 04 jQuery
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版小黄鸡simsimi聊天机器人接口分享
2014/01/26 PHP
PHP英文字母大小写转换函数小结
2014/05/03 PHP
PHP array_shift()用法实例分析
2019/01/07 PHP
jquery异步跨域访问代码
2013/06/28 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
JavaScript获取文本框内选中文本的方法
2015/02/20 Javascript
基于canvas实现的钟摆效果完整实例
2016/01/26 Javascript
JavaScript转换数据库DateTime字段类型方法
2017/06/27 Javascript
AngularJS实现表单元素值绑定操作示例
2017/10/11 Javascript
vue.js给动态绑定的radio列表做批量编辑的方法
2018/02/28 Javascript
pm2启动ssr失败的解决方法
2019/06/29 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
Vue Render函数创建DOM节点代码实例
2020/07/08 Javascript
js实现带有动画的返回顶部
2020/08/09 Javascript
使用Python编写简单的画图板程序的示例教程
2015/12/08 Python
利用python为运维人员写一个监控脚本
2018/03/25 Python
TensorFlow实现非线性支持向量机的实现方法
2018/04/28 Python
20行python代码实现人脸识别
2019/05/05 Python
IronPython连接MySQL的方法步骤
2019/12/27 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
2020/01/20 Python
jupyter实现重新加载模块
2020/04/16 Python
详解numpy1.19.4与python3.9版本冲突解决
2020/12/15 Python
pyspark对Mysql数据库进行读写的实现
2020/12/30 Python
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
今冬明春火灾防控工作方案
2014/05/29 职场文书
主要领导对照检查材料
2014/08/26 职场文书
党员批评与自我批评材料
2014/10/14 职场文书
2014年学生会部门工作总结
2014/11/07 职场文书
2015年安全生产管理工作总结
2015/05/25 职场文书
新党员入党决心书
2015/09/22 职场文书
Python基础之元类详解
2021/04/29 Python
Promise面试题详解之控制并发
2021/05/14 面试题
MySQL普通表如何转换成分区表
2022/05/30 MySQL