响应式页面几大流派

为了方便判断和描述,还需理解一些概念:
设备像素,物理像素,设备逻辑像素。
布局视口,视觉视口,理想视口。

简单来讲,手机可能像素很高清,但设备大小不骗人,我们按屏宽来算就好;
也意味着,不管手机尺寸如何,我们把它截图放大了跟 750px 的设计原稿比较,即为判断依据。

栅栏布局 Bootstrap 的时代

那时还是 PC 盛行的时代,手机和移动端网站的普及度不高。
@media 被发明之初,能满足 PC & 平板 & 手机响应式的网站的价格都翻了番。
也造就了 Bootstrap 这个封装了栅栏布局的前端 UI 框架的盛行。

但 bootstrap 布局的原理实则并不复杂,
将 <768px 认为是手机,<992px 则为平板,其他为电脑,>1200px 的大屏则设个定宽左右留白。
各区间内,屏宽在理论上被平分为 12 栏,比如 col-6 代表宽度占父级 50%,col-3 占 25%。

当然,本文中栅栏布局并不是重点,而是 定宽留白百分比宽度

比如屏幕宽度有 1334px 和 1280px 这样的差别,那也只是左右留白的区别而已。
而当是 480px 和 360px 的差别时,我只管宽度所占百分比不变即可(至少比定宽 100px 表现要好咯)。

(不管手机本来什么宽度,都等比放大成 750px 来比较,就会清晰发现与设计稿的异同)

-1

定宽留白百分比宽度 可以说非常粗放地实现了响应式,
到现在也常常会使用 padding: 0 2%width:200px;margin:0 auto 等这样的方式去布局。
但移动时代的演进和移动设备品种的增多,此类布局的弊端也不断地在放大。

更复杂的移动端响应式

首先面临的问题就是手机尺寸的变化,比如爱疯5那样的小屏手机与全面屏爱疯X,
虽然在物理像素上,仿佛差距只有 50-90 多像素,但整个屏幕也没几个 50 呀,
所以小屏手机上几乎占满的 300px 在大屏手机上可能只占了一半。

那么我们是否依旧还能使用定宽留白和百分比宽度来解决这个问题呢?
当然是显然不能的,因为 移动端网页的设计粒度不同了
移动端中出现了更多小图标/小提示等,如果都只有 20px,那在大屏手机上恐怕会非常细小。

即使在 768px 以下再加一个区间来补充,或不断 @media 打点来补漏,
这套方案想想都觉得不太秒,也即下文的 em 布局方案,试图去解决 字体大小 的问题,
或者说,是非常粗放地去解决 20px 在 320px 和 414px 的手机上表现差异的问题。

还有就是元素高度的问题,即 等比缩放 问题。宽度等比了,但高度响应却是较难做到的。
(虽然可以使用 :before 的 padding-top 来实现宽高定比缩放)

除此之外,还有 高清屏 带来的问题,不清晰呀/1px 问题呀/高清图呀,等等。

所以,移动端的响应式问题解决起来要比PC端复杂得多,因此也涌现出了一些非常不错的方案。

为了移动端而奋斗!

em 布局

根据设备尺寸调整字号,让文字相应的越来越大,感觉上是可以尽可能少的地改动布局的。
比如以前在 320px 上的 20px,到了 375px 上变成 26px,相对来说是对布局进行了缩放。

因此就产生了下面这样的代码:

html { font-size: 10px;}
@media screen and (min-width:321px) and (max-width:375px){
    html {font-size:11px}
}
@media screen and (min-width: 376px) and (max-width: 414px) {
    html {font-size: 12px;}
}
@media screen and (min-width: 415px) and (max-width: 639px) {
    html {font-size: 15px;}
}
@media screen and (min-width: 640px) and (max-width: 719px) {
    html {font-size: 20px;}
}
@media screen and (min-width: 720px) and (max-width: 749px) {
    html {font-size: 22.5px;}
}
@media screen and (min-width: 750px) and (max-width: 799px) {
    html {font-size: 23.5px;}
}

最终效果其实还不赖,对整体布局的不会造成太大的改动,
小型元素或一定程度上定宽的元素则都可以使用 em 来布局,大屏手机上文字也更大了些。

但对大型元素和整体布局来说,实在无法将 em 与 百分比进行等同,
举个例子,当 320px 屏时 10em 可能刚刚好,但 375px 屏上就超出了。
这实在不是一个精细的布局方式,仅仅适用与小元素吧。

至于 Retina 屏问题加几个 @media (-webkit-min-device-pixel-ratio:1) 也算是能部分解决。

rem 布局

因此,用 js 来修改字号的精细版本就出现了。

!function() {
    function e() {
        r.innerText = "html{font-size:" + (a.style.fontSize = a.getBoundingClientRect().width / o * d + "px") + " !important;}"
    }
    var t = navigator.userAgent,
        n = (t.match(/(iPhone|iPad|iPod)/), t.match(/Android/i), window),
        i = document,
        a = i.documentElement,
        o = (n.devicePixelRatio, 375),
        d = 100,
        r = (i.head.querySelector('[name="viewport"]'), i.createElement("style"));
    r.innerText = "html{font-size:100px !important}", i.head.appendChild(r), e(), n.addEventListener("resize", e, !1);
    a.className += t.match(/ucbrowser/i) ? " app-uc " : ""
}();

相比以前 100% 等于多少都不知道,到现在能固定 3.75rem = 750px,rem 布局可谓是质的飞跃。
它充分发挥了 rem 的特性,em 还得受父级字号影响,但 rem 只受根元素字号的影响。

另一方面,它使得图片的等比缩放也变得更为简单,因为 rem 自带缩放。

还有一个彩蛋,即使按住 Ctrl 再滚轮,也不会缩放显示哟。

lib-flexible

官网:https://github.com/amfe/lib-flexible

它是 rem 布局现阶段的巅峰,非常成熟,在相当多的项目中被实践,社区活跃。
搭配上各种诸如 sublime 插件,让开发和计算都变得十分简单。
且为 rem 布局的方案增加了更多分辨率,机型,和字体大小的适配与试错。

vw 布局

既然 rem 是按屏宽来求默认基本单位的,那我 vw 不也是吗,
lib-flexible 的 10em = 750px,vw 的 100vw = 750px。
这一切是如此的相似,所以就此产生了相当多的争论。

撇开 vw 和 min-device-pixel-ratio 的兼容性不谈,
我个人是站在 vw 这边的,不仅仅是因为不用加入 js。

还有一些原因是不得不提一句的:
如果在 lib-flexible 布局中使用 @media 的 10rem 其实它并不是等同于 750px 的,你不妨试试。
除了 vw 外,官方还有 vmax 等属性搭配使用,让横屏和居中等布局问题有了更多可能性。

另外不得不承认,rem 布局和 vw 布局想要同事适配 PC 端是极不容易的事情,
因此此时的屏宽将造成字号极大,即使限制最大字号也将改动大量的宽度限制。
所以对此,多半我们还会选用下文的 后端判断跳页 这套方案一起使用。

pt 布局

pt 布局是一种很奇特的现象,如果不是 这篇文章 我都无从得知。

它不再需要 width=device-width 这个东西,整个 meta 只要不允许缩放即可。

<meta name="viewport" content="user-scalable=no" />

设计稿的 750px 等于开发时 750pt * 0.98,
如果你使用 less/sass,布局这件事件就变得很简单了。

因为这套方案过于奇特,虽然在项目中已有试用,但实在不敢保证无误。

固定视图

还有骚操作,也是抛弃了 device-width 判断的方法。

<meta name="viewport" content="width=750,user-scalable=no" />

设计稿的 750px 直接等于开发时的 750px。
这应该是非常理想的一种结局了吧,全凭 1:1 的 px 就能完美还原布局。
且不管是何种像素或分辨率的设备都会被认为是 750px 的视图大小。

然而,在欣喜地使用它有半年之久后,还是发现了一些问题。
在极少的 PC 端中,需要 width=935 才能让实际视图表现为 750px。而且这类机型的各类参数中又找不出与其他机型的区别,这让我很失落。从而又不得不回归 lib-flexible 的怀抱。

但如果你的项目只需运行在移动端,那不妨采用这个简单粗暴的布局办法。

百分比定位

在网页中还有一种特殊的存在,即营销类H5。
它往往没有什么嵌套关系,且以元素的定位布局为主。

虽然我们依旧可以采用上面的各种办法来进行适配,
但纯靠百分比去处理宽高也不失为一种特别适用于这类网页的处理方法。

后端判断

虽然以上办法都极大的解决了移动端网页的视觉还原问题,
但要让它们同时适配平板和PC,恐怕是有难度的。比如宽屏求 rem 就会非常不理想。

所以往往很多网站都选用了 多端分离 的办法,
在 PC 端访问的一个网站,在手机上访问的是另一个网站,在 APP 中可能又是一个网站。

不仅如此,这样拆分让各网站的功能和交互也可以根据终端的使用习惯而进行大量改动。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,747评论 1 92
  • 在移动互联网快速发展的今天,手机的种类和尺寸越来越多,作为前端的小伙伴们可能会越来越头疼,但又不得不去适配一款又一...
    keenjaan阅读 26,810评论 9 86
  • 刚开始做移动端web开发的同学应该都碰到过页面适配问题,为什么我在开发手机上调试好的页面在其他手机会有这样或那样的...
    留七七阅读 19,329评论 5 80
  • 不知不觉做前端已经两年了,从PC端,移动端,微信小程序一路走来到今天刚刚开放注册的快应用(手机厂商对抗小程序的新技...
    是ADI呀阅读 3,100评论 0 10
  • title: 移动端Web页面适配浅析date: 2018-01-31 16:38:01tags: 移动端 适配 ...
    豆板儿阅读 12,270评论 0 16