Web App适配不同屏幕的几点建议
安卓设备在屏幕尺寸和像素密度上差别很大,因此在使用WebView加载网页时就需要考虑到这种差别,对我们的网页做出精心的设计以在不同的屏幕上都能得到合适的展现。通常情况下,我们需要考虑到两个因素:
1、视区(viewport)
所谓的视区指的是Web页面绘制的矩形区域。viewport有很多属性是我们可以设置的,比如视区的大小和初始比例。其中最重要的一个是要指定视区的宽度,它是网页展示的水平像素点的总数量(即CSS像素点的数量)。
2、屏幕密度
WebView以及Android上的多数浏览器会把网页的CSS像素值转换为dip值(即设备独立像素),一般以一个中等密度的屏幕尺寸为基准(约160dpi大小)。如果对图像的展示有更高的要求,就需要关注不同屏幕密度的比例了,因为一张宽为300px的图像在320dpi的屏幕上会被放大(每个CSS像素会使用到更多的物理像素点),这会使得图像变得模糊而出现锯齿。
dip的换算:dip(value)=(int) (px(value)/1.5 + 0.5)。
dpi(dot per inch),每英寸像素数,反映了屏幕的清晰度,如120dpi,160dpi等,假设QVGA(320*240)分辨率的屏幕物理尺寸是(2英寸*1.5英寸),则dpi=160。
Viewport属性的设置
我们的网页会在viewport指定的区域内进行绘制。尽管viewport的总的可视区域在我们把网页缩到最小时会与屏幕大小一致,viewport也有自己的像素范围属性供网页来进行控制。比如,对于物理宽度为480像素的屏幕尺寸来说,viewport的宽度可以达到800像素,这样当viewport的比例设置为1.0时,网页就可以基于800像素的宽度来设计以完全地展示在屏幕上。Android上的多数浏览器都会默认把viewport设置得更大(通常被称为“宽视区模式”,宽度约为980px)。很多浏览器也会默认把网页尽量缩小以完全地展示出viewport的宽度(称为“俯瞰模式”)。需要注意的是,WebView默认并没有启用宽视区模式,如需启用,需调用setUseWideViewPort()方法。
在Web页面中,我们可以通过标签的来设置viewport的宽度和初始比例等属性。下面列出了viewport支持的属性及每个属性的取值类型:
content="height = [pixel_value | "device-height"] ,width = [pixel_value | "device-width"] ,initial-scale = float_value ,minimum-scale = float_value ,maximum-scale = float_value , user-scalable = ["yes" | "no"] " />
上面的例子指定了viewport的宽度为设备屏幕的宽度,并且不支持缩放操作。
通常情况下,我们都会把viewport的宽度设置为“device-width”,这样就可以在所有的屏幕上显示一致,然后通过CSS的媒介查询机制来灵活地进行布局以适配不同的屏幕尺寸。需要注意的是,只有在确保我们的网页布局能够灵活调整且网页内容能够适应小屏幕的宽度时我们才可以取消对缩放的支持。
通过CSS样式来设置适配不同设备屏幕密度
Android浏览器和WebView通过对CSS媒体特性“-webkit-device-pixel-ratio”的解析提供了对创建适配指定屏幕密度的CSS样式的支持。“-webkit-device-pixel-ratio”的取值为"0.75"、"1"和"1.5",分别对应低密度、中等密度和高密度3种屏幕。比如,下面的代码针对高密度和中等密度屏幕分别创建了CSS样式文件:
或者是在一个CSS样式文件中针对不同的屏幕密度设置不同的样式:
#header {
background:url(medium-density-image.png);
}
@media screen and (-webkit-device-pixel-ratio: 1.5) {
/* CSS for high-density screens */
#header {
background:url(high-density-image.png);
}
}
@media screen and (-webkit-device-pixel-ratio: 0.75) {
/* CSS for low-density screens */
#header {
background:url(low-density-image.png);
}
}
关于如何对图片进行处理以适配不同屏幕密度的更多信息,请参考http://www.html5rocks.com/en/mobile/high-dpi/这篇文章。
通过JavaScript脚本来设置适配不同设备屏幕密度
Android浏览器和WebView提供了一个DOM属性window.devicePixelRatio来获取当前网页所在设备的屏幕密度。window.devicePixelRatio的取值与前面提到的“-webkit-device-pixel-ratio”的取值一致,都是"0.75"、"1"和"1.5",分别对应低密度、中等密度和高密度3种屏幕。如果window.devicePixelRatio的值为"1.0",则目标设备的屏幕为中等密度,那么网页默认不会有任何缩放;如果window.devicePixelRatio的值为"1.5",则目标设备的屏幕为高密度,那么网页默认会放大为原来的1.5倍;如果window.devicePixelRatio的值为"0.75",则目标设备的屏幕为低密度,那么网页默认会缩小为原来的0.75。下面的代码演示了如何利用该属性查询设备的屏幕密度:
if (window.devicePixelRatio == 1.5) {
alert("This is a high-density screen");
} else if (window.devicePixelRatio == 0.75) {
alert("This is a low-density screen");
}
Web App适配不同屏幕的几点建议的更多相关文章
- Web App适配iPhoneX
前言 Iphone每次退出新尺寸的手机都会掀起一番适配风波,这次没有下巴但有刘海的iPhoneX更是如此,网传横屏下的适配动画更是令不少人汗颜. 其实对于Native App来说,适配并不算困难(当然 ...
- rem : web app适配的秘密武器
css html { font-size: calc(100vw / 3.75) } jsdocument.documentElement.style.fontSize = $(document.do ...
- 移动端Web App自适应布局探索
1.困扰多时的问题 在这之前做Web App开发的的时候,在自适应方面一般都是宽度通过百分比,高度以iPhone6跟iPhone5之间的一个平衡值写死,我们的设计稿都是iPhone5的640 * 11 ...
- 利用iOS中Safari浏览器创建伪Web App
在safari浏览器里有一个“添加到主屏幕”选项,我们可以用来创建伪Web App,下面来了解一下iOS中Safari的私有属性 第一步设置Web App的主屏幕图标: 有两种属性值apple-tou ...
- web app变革之rem(手机屏幕实现全适配)
以往web移动适配,常规写法是:media only screen @media only screen and (min-device-width: 320px){ //针对iPhone 3 } @ ...
- web app iphone4 iphone5 iphone6 iphone6 Plus响应式布局 适配代码
来源:http://www.phptext.net/article_view.php?id=387 -------------------------------------------------- ...
- web app开发技巧总结 (share)
(转自http://hi.baidu.com/kuntakinte/item/ca92d6e5edae9fc0bbf37d08) 自Iphone和Android这两个牛逼的手机操作系统发布以来,在互联 ...
- Web App开发入门
WebApp与Native App有何区别呢? Native App: 1.开发成本非常大.一般使用的开发语言为JAVA.C++.Objective-C. 2.更新体验较差.同时也比较麻烦.每一次发布 ...
- web app变革之rem
rem这是个低调的css单位,近一两年开始崭露头角,有许多同学对rem的评价不一,有的在尝试使用,有的在使用过程中遇到坑就弃用了.但是我对rem综合评价是用来做web app它绝对是最合适的人选之一. ...
随机推荐
- IT人可以关注的站
问答平台 知乎 很杂但很专业的社区,就像标题说的:与世界分享你的知识.经验和见解 segmentfault 专业面向开发者的中文技术问答社区 德问 编程社交问答 V2EX 可以看到很多有意思对我这种I ...
- 简易版C语言程序设计语法
源程序 → 外部声明 | 子程序(外部声明) 外部声明 → 函数定义| 函数声明 函数定义 → 类型标识符(复合句) 标识符类型 → 无类型 | 字符型 | 整型 | 浮点型 整型→ 长整型 | ...
- 关于(object sender, EventArgs e)
sender是事件源 就是指发起这个事件的对象(控件)//表示触发事件的那个控件比如说你按下按钮,那么sender就是按钮 又如:textboxchange,sender就是该textbox,在事 ...
- Sublime Text 2 JS 格式化插件 JsFormat的配置使用
(转自http://www.jb51.net/softjc/178401.html) 这里下载这插件包 https://github.com/jdc0589/JsFormat ,点油下角的zip就能下 ...
- css3知识
一.box-sizing 属性 规定两个并排的带边框的框 二.align-items (适用于父类容器上) 设置或检索弹性盒子元素在侧轴(纵轴)方向上的对齐方式. 值: flex-start:弹性盒子 ...
- ASP.NET MVC 4 视图页去哪里儿
这里特别感谢 swagon 提到了Displaymodeprovider,所以才有了本篇博客,也使我对[View的呈现]中寻找视图页的过程有了清晰的认识! 前戏 在MVC中,执行完Action之后,会 ...
- centos 安装redis并加入系统服务
1.安装redis wget http://download.redis.io/releases/redis-3.2.5.tar.gz 解压:tar -zxvf redis-3.2.5.tar.gz ...
- Python之路-python(css、JavaScript)
css JavaScript 一.CSS 分层: position: fixed;(固定到页面的具体位置) 例如:返回顶部 <!DOCTYPE html> <html lang=&q ...
- Hadoop等软件常见运行问题及解决办法
Hadoop常见问题及解决办法 1.问题:java.io.IOException: Could not locate executable null\bin\winutils.exe in the ...
- Discovering-论文
Discovering Spatio-Temporal Causal Interactions in Traffic Data Streams data:real taxi trajectories ...