移动设备有着各种各样的分辨率,而Mobile App又不像桌面WEB SITE一样大多有一个固定的宽度(如950、960、1000),所以对于前端工程师来说就涉及到设备分辨率适配的问题。Media Query确实解决了一定的问题,但是仅仅依赖它还不够,我们不可能为每一种分辨率都做处理,弹性设计才是王道。我整理了以下这些实现适配的方法,更多的是一些弹性设计的方法,相信很多大家都用过,没什么新技术可言,仅做针对性的整理:
Media Query
首当其冲的当然就是Media Query,它提供了大量的选项,不做一一介绍,后面的方案中会用到一些,具体请看MDN的文档:Media Queries。
media_type:
| all | aural | braille | handheld | print | projection | screen | tty | tv | embossed
media_feature:
| width | min-width | max-width
| height | min-height | max-height
| device-width | min-device-width | max-device-width
| device-height | min-device-height | max-device-height
| aspect-ratio | min-aspect-ratio | max-aspect-ratio
| device-aspect-ratio | min-device-aspect-ratio | max-device-aspect-ratio
| color | min-color | max-color
| color-index | min-color-index | max-color-index
| monochrome | min-monochrome | max-monochrome
| resolution | min-resolution | max-resolution
| scan | grid
CSS3
使用css3来实现渐变、阴影、圆角等效果,使用代码的好处就是在改变元素大小的同时,这些效果也将随之改变,当然你还顺便获得了性能回报。
基于百分比的设计
避免具体的px定义,例如横向排列的tab,用百分比来指定每个tab的宽度,当然后面提到的-webkit-box-flex是一个更好的方案。
基于EM的设计
的确,在PC上我们已经不再鼓励使用EM进行设计,因为现代的浏览器都支持了ctrl+、ctrl-的整体缩放,秦歌有一篇详细的文章:是时候不用考虑基于字体大小(em)的设计了。然而当你的Mobile App原先是为480×800分辨率以上的设备设计,现在突然要支持320*480的设备时,这种设计将为你节省很多的时间,将字号按分辨率的缩放比率进行调整即可,例子中320下就不再需要设置h1的字号了,同理宽度、高度也可以依赖em进行设计。
@media all and (min-width: 321px){
body{
font-size: 10px;
}
h1{
font-size: 1.8em;
}
}
@media all and (max-width: 320px){
body{
font-size: 8px;
}
}
background-size
分了适应不同的分辨率,同一个背景图使用多个不同大小的文件,实在是个让人难以接受的事情,特别是当你使用dataURI的使用,这将大大增加你的css文件大小。使用background-size能缩放你的背景图片,使它适应各个分辨率。
.selector{
background: xxx;
}
@media all and (max-width: 320px){
.selector{
background-size: 12px;
}
}
box-sizing
有时一个元素有padding、border,这时又要它的宽或者高撑满整个容器,直接设置width:100%;必然不行,盒模型不会将padding、border的值计算在内,结果元素的宽高就变成了100% + padding + border。这个使用box-sizing能帮到你,它能改变盒模型的计算方式,例如将padding、border的值计算在内:
.selector{
padding: 10px;
border: 10px solid #f00;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
display: -webkit-box;
-webkit-box为弹性的设计带来了一系列的方式:
在一个未知宽高的容器内垂直居中显示
.parent{
display: -webkit-box;
-webkit-box-align: center;
-webkit-box-pack: center;
}
未知数量的元素在一个未知宽的容器内水平排列
//例如用于slider,水平轮播banner
<div class="banner">
<img src="#" alt="">
<img src="#" alt="">
<img src="#" alt="">
...
</div>
.banner{
display: -webkit-box;
-webkit-box-lines: multiple;
}
水平按比例排列
//例如用于tab
<ul>
<li><a href="#">home</a></li>
<li><a href="#">lib</a></li>
<li><a href="#">about</a></li>
</ul>
ul{
display: -webkit-box;
}
li{
-webkit-box-flex: 1;
}
其它
当然还有一些PC上我们经常使用的习以为常的方式,不做展开,例如:
- YUI2珊栏中使用的负
margin的方案。
- 某元素在容器中居右,离右边10px时,用
right: 10px;代替left: xxx;
- 撑满整个未知宽高容器时,使用
position: absolute; top: 0; bottom: 0; left: 0; right: 0;。
- 撑满整个屏幕时,使用
position: fixed; top: 0; bottom: 0; left: 0; right: 0;。
- …