本篇讨论的页面指专门针对手机设备设计的页面,并不是兼容全设备的响应式布局。 文中提到的 device-width 指 viewport meta 标签中 width 的值,即由浏览器指定的值,经常使用机型对应值可参照 Screen Sizes。javascript
在不一样尺寸的手机设备上,页面“相对性的达到合理的展现(自适应)”或者“保持统一效果的等比缩放(看起来差很少)”。css
通常来讲,咱们须要关注的是:字体、高宽间距、图像(图标、图片)。html
其中,图像相对要复杂一些,针对流量、清晰度等问题网上也有比较成熟的解决方案,好比:矢量化、字体化、image-set 等等,在此不作深刻。在知足快速开发的需求下,咱们使用较为偷懒的方式:利用 css 将图像限定在元素内( img 图片使用 [max-]width: 100%
,背景图像使用 background-size ),布局只针对元素进行。前端
另外要考虑到,设计师设计视觉稿时使用什么样的宽度,才能既知足设计自身的需求又能让前端开发方便的切图适配。java
围绕这三要素,咱们用一个小例子来讲明接下来要介绍的三种方案的实现方式,按 640px 标准需实现的效果如图:android
这是目前最通用的一种作法,属于自适应布局,viewport width 设置为 device-width,以较小宽度(如 320px)的视觉稿做为参照进行布局。垂直方向的高度和间距使用定值,水平方向混合使用定值和百分比或者利用弹性布局,最终达到“当手机屏幕变化时,横向拉伸或者填充空白的效果”。图像元素根据容器状况,使用定值或者 background-size 缩放。git
粗略浏览了下一些大厂的首页,像百度、腾讯、Facebook、Twitter 都是采用的这种方案。github
实现比较简单,样式中的尺寸都按照视觉稿二分之一大小设置web
视觉稿、页面宽度、viewport width 使用统一宽度,利用浏览器自身缩放完成适配。页面样式(包括图像元素)彻底按照视觉稿的尺寸,使用定值单位 (px、em)便可完成。浏览器
缩放失效问题需经过 js 动态设定 initial-scale。
var fixScreen = function() { var metaEl = doc.querySelector(‘meta[name="viewport"]‘), metaCtt = metaEl ? metaEl.content : ‘‘, matchScale = metaCtt.match(/initial\-scale=([\d\.]+)/), matchWidth = metaCtt.match(/width=([^,\s]+)/); if ( metaEl && !matchScale && ( matchWidth && matchWidth[1] != ‘device-width‘) ) { var width = parseInt(matchWidth[1]), iw = win.innerWidth || width, ow = win.outerWidth || iw, sw = win.screen.width || iw, saw = win.screen.availWidth || iw, ih