`
blessdyb
  • 浏览: 235829 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Mobile Web开发基础之四————处理设备的横竖屏

阅读更多

    为了应对移动设备屏幕的碎片化,我们在开发Mobile Web应用时,一个最佳实践就是采用流式布局,保证最大可能地利用有限的屏幕空间。由于屏幕存在着方向性,用户在切换了屏幕的方向后,有些设计上或实现上的问题就会凸显——我们至少需要处理一下当前显示元素的宽度的适配(当然,要做的可能不仅仅是这个)。很多时候,我们需要为不同的屏幕方向来设计对应的应用显示模式,这个时候,实时地获知设备的模竖屏状态就显得极为重要。

 

  • window.orientation属性与onorientationchange事件    

window.orientation :这个属性给出了当前设备的屏幕方向,0表示竖屏,正负90表示横屏(向左与向右)模式

onorientationchange : 在每次屏幕方向在横竖屏间切换后,就会触发这个window事件,用法与传统的事件类似

 

1:使用onorientationchange事件的回调函数,来动态地为body标签添加一个叫orient的属性,同时以body[orient=landspace]或body[orient=portrait]的方式在css中定义对应的样式,这样就可以实现在不同的屏幕模式下显示不同的样式。如下代码示例:

<!Doctype html>
<html>
	<head>
 		<meta charset="utf-8">
 		<meta id="viewport" name="viewport" content="width=device-width,initial-scale=1.0;">
 		<title>横竖屏切换检测</title>
 		<style type="text/css">
    		body[orient=landscape]{
    			background-color: #ff0000;
    		}

    		body[orient=portrait]{
    			background-color: #00ffff;
    		}
 		</style>
	</head>
	<body orient="landspace">
		<div>
			内容
		</div>
		<script type="text/javascript">
 			(function(){
 				if(window.orient==0){
 					document.body.setAttribute("orient","portrait");
 				}else{
 					document.body.setAttribute("orient","landscape");
 				}
 			})();
 			window.onorientationchange=function(){
 				var body=document.body;
 				var viewport=document.getElementById("viewport");
 				if(body.getAttribute("orient")=="landscape"){
 					body.setAttribute("orient","portrait");
 				}else{
 					body.setAttribute("orient","landscape");
 				}
 			};
 		</script>
	</body>
</html>

 2: 类似的思路,不通过CSS的属性选择器来实现,如下代码的实现方案:

<!Doctype html>
<html>
	<head>
 		<meta charset="utf-8">
 		<meta id="viewport" name="viewport" content="width=device-width,initial-scale=1.0;">
 		<title>横竖屏切换检测</title>
 		<style type="text/css">
    		.landscape body {
    			background-color: #ff0000;
    		}

    		.portrait body {
    			background-color: #00ffff;
    		}
 		</style>
	</head>
	<body orient="landspace">
		<div>
			内容
		</div>
		<script type="text/javascript">
 			(function(){
 				var init=function(){
 					var updateOrientation=function(){
 						var orientation=window.orientation;
 						switch(orientation){
 							case 90: 
 							case -90:
 								orientation="landscape";
 								break;
 							default:
 								orientation="portrait";
 								break;
 						}
 						document.body.parentNode.setAttribute("class",orientation);
 					};

 					window.addEventListener("orientationchange",updateOrientation,false);
 					updateOrientation();
 				};
 				window.addEventListener("DOMContentLoaded",init,false);
 			})();
 		</script>
	</body>
</html>
 
  • 使用media query方式

    这是一种更为方便的方式,使用纯CSS就实现了对应的功能,如下代码演示:

<!Doctype html>
<html>
	<head>
 		<meta charset="utf-8">
 		<meta id="viewport" name="viewport" content="width=device-width,initial-scale=1.0;">
 		<title>横竖屏切换检测</title>
 		<style type="text/css">
    		@media all and (orientation : landscape) {
    			body { 
    				background-color: #ff0000; 
    			}
    		}

    		@media all and (orientation : portrait){
    			body {
    				background-color: #00ff00;
    			}
    		}
 		</style>
	</head>
	<body>
		<div>
			内容
		</div>
	</body>
</html>
  •  低版本浏览器的平稳降级

     如果目标移动浏览器不支持media query,同时window.orientation也不存在,则我们需要采用另外一种方式来实现————使用定时器“伪实时”地对比当前窗口的高(window.innerHeight)与宽(window.innerWidth)之比,从而判定当前的横竖屏状态。如下代码所示:

<!Doctype html>
<html>
	<head>
 		<meta charset="utf-8">
 		<meta id="viewport" name="viewport" content="width=device-width,initial-scale=1.0;">
 		<title>按键</title>
 		<style type="text/css">
    		.landscape body {
                background-color: #ff0000;
            }

            .portrait body {
                background-color: #00ffff;
            }
 		</style>
        <script type="text/javascript">
            (function(){
                var updateOrientation=function(){
                    var orientation=(window.innerWidth > window.innerHeight)? "landscape" : "portrait";
                    document.body.parentNode.setAttribute("class",orientation);
                };

                var init=function(){
                    updateOrientation();
                    window.setInterval(updateOrientation,5000);
                };
                window.addEventListener("DOMContentLoaded",init,false);
            })();
        </script>
	</head>
	<body>
		<div>
			内容
		</div>
	</body>
</html>
  •  统一解决方案

    将以上的两种解决方案整合在一起,就可以实现一个跨浏览器的解决方案,如下代码:

<!Doctype html>
<html>
	<head>
 		<meta charset="utf-8">
 		<meta id="viewport" name="viewport" content="width=device-width,initial-scale=1.0;">
 		<title>横竖屏切换检测</title>
 		<style type="text/css">
    		.landscape body {
                background-color: #ff0000;
            }

            .portrait body {
                background-color: #00ffff;
            }
 		</style>
        <script type="text/javascript">
            (function(){
                var supportOrientation=(typeof window.orientation == "number" && typeof window.onorientationchange == "object");

                var updateOrientation=function(){
                    if(supportOrientation){
                        updateOrientation=function(){
                            var orientation=window.orientation;
                            switch(orientation){
                                case 90:
                                case -90:
                                    orientation="landscape";
                                    break;
                                default:
                                    orientation="portrait";
                            }
                            document.body.parentNode.setAttribute("class",orientation);
                        };
                    }else{
                        updateOrientation=function(){
                            var orientation=(window.innerWidth > window.innerHeight)? "landscape":"portrait";
                            document.body.parentNode.setAttribute("class",orientation);
                        };
                    }
                    updateOrientation();
                };

                var init=function(){
                    updateOrientation();
                    if(supportOrientation){
                        window.addEventListener("orientationchange",updateOrientation,false);
                    }else{    
                        window.setInterval(updateOrientation,5000);
                    }
                };
                window.addEventListener("DOMContentLoaded",init,false);
            })();
        </script>
	</head>
	<body>
		<div>
			内容
		</div>
	</body>
</html>
 

【原文】http://davidbcalhoun.com/2010/dealing-with-device-orientation

 

 

分享到:
评论

相关推荐

    Mobile Web开发基础之四–处理手机设备的横竖屏问题

    为了应对移动设备屏幕的碎片化,我们在开发Mobile Web应用时,一个最佳实践就是采用流式布局,保证最大可能地利用有限的屏幕空间。由于屏幕存在着方向性,用户在切换了屏幕的方向后,有些设计上或实现上的问题就会...

    Mobile Web开发基础之四--处理手机设备的横竖屏问题

    在开发Mobile Web应用时,处理手机设备的横竖屏问题是必不可少的。这涉及到对不同屏幕尺寸和方向的适应,以确保用户体验的流畅性和界面的视觉一致性。本文将深入探讨两种常用的技术方法:window.orientation属性和...

    电大web开发基础形考5.pdf

    "电大web开发基础形考5.pdf" 本资源主要讲述了电商网站前端页面响应式设计实验,实验目标是将首页改为响应式设计,使用Bootstrap栅格系统实现响应式网页设计。下面将对实验报告的内容进行详细分析和总结。 实验...

    Windows Mobile 贪吃蛇手机游戏开发 1——开发环境的搭建与测试(Hello World)

    3. **配置模拟器或连接实际设备**: 开发初期,你可以使用Windows Mobile设备模拟器进行测试,它模拟了真实设备的环境。若要连接实际设备,需要确保设备已开启开发者模式,并通过USB数据线与电脑相连。 4. **创建新...

    【连载】Windows Mobile 贪吃蛇手机游戏开发 2——游戏设计准备知识

    Windows Mobile是微软为掌上设备如智能手机和平板电脑设计的操作系统,它提供了丰富的API和工具来支持应用程序开发,包括游戏。在第二部分,我们专注于游戏设计的准备知识,这将为我们后续的编程工作奠定基础。 ...

    android二维码横屏竖屏

    在Android平台上,开发一款支持二维码扫描的应用时,通常会遇到横屏和竖屏两种设备方向的问题。本主题主要探讨如何在Android应用中处理这两种屏幕方向,确保二维码扫描功能的正常运行。 首先,Android系统允许应用...

    ASP.NET Mobile Controls开发Mobile Web应用

    - **ASP.NET Mobile Controls**:这是微软为开发移动Web应用程序提供的一套工具包,它包含了一系列控件,这些控件专为移动设备优化,可以适应不同的设备类型和屏幕尺寸。 - **移动Web应用开发**:随着智能手机和平板...

    移动端网页版强制横屏实例

    浏览器可以通过监听窗口尺寸变化(resize事件)来判断屏幕是横屏还是竖屏,而设备方向传感器则可以提供实际的物理方向信息。强制横屏的关键在于如何合理地结合这两点,使网页始终呈现横屏布局。 1. **CSS媒体查询**...

    jquery mobile web api开发例子

    **jQuery Mobile Web API 开发详解** 在Web应用开发中,jQuery Mobile 和 Web API 结合使用可以构建出功能强大且响应式的移动应用。本教程将深入探讨如何利用jQuery Mobile与C#实现的Web API2接口进行交互,展示...

    如何使用ASP.NET开发MobileWeb应用

    本篇文章将详细探讨如何利用ASP.NET技术进行MobileWeb应用的开发。 一、理解MobileWeb应用与ASP.NET MobileWeb应用是专门为移动设备设计的网页应用,它们通常需要适配不同屏幕尺寸、操作系统和网络环境。ASP.NET...

    NET Compact Framework新动力——加速您的Windows Mobile应用开发(PDF)

    .NET Compact Framework是微软为嵌入式设备和移动设备如Windows Mobile操作系统提供的一个精简版的.NET框架。这个框架使得开发者可以使用.NET Framework的大部分功能,包括C#、VB.NET等编程语言,来创建高效能、功能...

    J2ME游戏开发之RPG——源码

    **J2ME游戏开发之RPG——源码详解** J2ME(Java 2 Micro Edition)是Java平台的一个子集,主要用于嵌入式设备和移动设备的开发,如早期的智能手机和平板电脑。在J2ME中开发角色扮演游戏(RPG)是一项挑战性的任务,...

    Head First Mobile Web

    ### Head First Mobile Web:关键技术与应用实践 #### 一、移动网络环境的演变与挑战 随着移动设备(如智能手机和平板电脑)的普及,越来越多的用户选择通过这些设备访问互联网。这种趋势使得移动网络的使用量正在...

    如何使用ASP.NET Mobile Controls开发Mobile Web应用

    ASP.NET Mobile Controls是微软提供的一套专门用于构建移动Web应用程序的工具集,它允许开发者使用ASP.NET技术来创建适应各种移动设备的网页。在本文中,我们将深入探讨如何利用ASP.NET Mobile Controls进行移动Web...

    NET Compact Framework新动力——加速您的Windows Mobile应用开发(Video)

    .NET Compact Framework是微软推出的一个专门针对嵌入式设备和移动计算平台的框架,它为开发者提供了在Windows Mobile设备上构建应用程序的能力。这个框架是.NET Framework的一个精简版本,旨在满足移动设备有限的...

    Programming the Mobile Web.pdf 手机网页开发

    ### 手机网页开发——《Programming the Mobile Web》精要解析 #### 一、书籍概述 《Programming the Mobile Web》是一本由Maximiliano Firtman编写的关于移动网络开发的专业指南。本书全面深入地介绍了移动开发...

    head first之mobile web

    《Head First之Mobile Web》是一本专为初学者设计的移动网页开发教程,以其独特的图文并茂的教学方式,深入浅出地介绍了移动互联网世界的各个方面。这本书涵盖了从基础概念到实践应用的所有关键知识点,旨在帮助读者...

    英文版Head First Mobile Web

    《Head First Mobile Web》是一本专注于移动Web开发领域的图书,它详细介绍了如何创建能在多种设备和浏览器上运行的移动网站。本书在2011年12月出版,以PDF格式呈现给读者,提供了从基础到高级的移动Web开发技术介绍...

    Head First Mobile Web(中文版)

    移动Web的使用在呈爆炸式增长。很快,人们会更愿意在手机和平板电脑而不是PC机上浏览网页。...使用*的开发技术,包括响应式Web设计,以及利用WURFL完成服务器端设备检测;通过图片、谜题、故事和问答轻松学习。

Global site tag (gtag.js) - Google Analytics