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 相关文章推荐
js parentElement和offsetParent之间的区别
Mar 23 Javascript
JS判断当前日期是否大于某个日期的实现代码
Sep 02 Javascript
JS图片无缝滚动(简单利于使用)
Jun 17 Javascript
详解JavaScript语法对{}处理的坑爹之处
Jun 05 Javascript
超链接的禁用属性Disabled使用示例
Jul 31 Javascript
node.js中的fs.lstatSync方法使用说明
Dec 16 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
Oct 09 Javascript
理解 JavaScript Scoping &amp; Hoisting(二)
Nov 18 Javascript
Javascript复制实例详解
Jan 28 Javascript
js获取所有checkbox的值的简单实例
May 30 Javascript
详解angularJs指令的3种绑定策略
Apr 13 Javascript
使用node.js搭建服务器
May 20 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中echo()和print()、require()和include()等易混淆函数的区别
2012/02/22 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
PHP图像处理之imagecreate、imagedestroy函数介绍
2014/11/19 PHP
PHP连接access数据库
2015/03/27 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
2016/01/08 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
PHP抽象类与接口的区别实例详解
2019/05/09 PHP
JavaScript 面向对象之命名空间
2010/05/04 Javascript
基于Jquery制作的幻灯片图集效果打包下载
2011/02/12 Javascript
js如何获取兄弟、父类等节点
2014/01/06 Javascript
javascript实现动态改变层大小的方法
2015/05/14 Javascript
jQuery原型属性和原型方法详解
2015/07/07 Javascript
jquery制作图片时钟特效
2020/03/30 Javascript
理解JavaScript中Promise的使用
2016/01/18 Javascript
原生js实现tab选项卡切换
2020/03/23 Javascript
jQuery弹出层插件popShow(改进版)用法示例
2017/01/23 Javascript
jQuery zTree 异步加载添加子节点重复问题
2017/11/29 jQuery
使用puppeteer破解极验的滑动验证码
2018/02/24 Javascript
Bootstrap Table中的多选框删除功能
2018/07/15 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
2018/08/24 Javascript
Selenium执行JavaScript脚本的方法示例
2020/12/31 Javascript
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
Python使用ntplib库同步校准当地时间的方法
2016/07/02 Python
Python中enumerate()函数编写更Pythonic的循环
2018/03/06 Python
python整合ffmpeg实现视频文件的批量转换
2019/05/31 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
如何使用Python多线程测试并发漏洞
2019/12/18 Python
Python实现扫码工具的示例代码
2020/10/09 Python
美国在线购物频道:Shop LC
2019/04/21 全球购物
俄罗斯天然和有机产品、健康生活网上商店:Fitomarket.ru
2020/10/09 全球购物
潘婷洗发水广告词
2014/03/14 职场文书
2015年体育部工作总结
2015/04/02 职场文书
孝女彩金观后感
2015/06/10 职场文书
幼儿园秋季开学通知
2015/07/16 职场文书
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
mybatis源码解读之executor包语句处理功能
2022/02/15 Java/Android