固定宽度布局开发WebApp如何实现多终端下自适应?

大家好,我是IT修真院深圳分院第01期学员,一枚正直纯洁善良的web程序员。

今天给大家分享一下,修真院官网CSS任务13,深度思考中的知识点——固定宽度布局开发WebApp如何实现多终端下自适应?

一、背景介绍

现在人通过手机浏览网页占了大多数,随着浏览方式的改变,网页在webapp下面实现多终端自适应,无论对于避免工程师无谓的重复劳动或者是项目管理的便捷性上来说重要性都是十分巨大的。

然而在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有明白了viewport的概念以及弄清楚了跟viewport有关的meta标签的使用,才能更好地让我们的网页适配或响应各种不同分辨率的移动设备。

自适应和响应式的区别?

其实RWD和AWD都是响应式设计,从外观上很难分辨,但他们自己运行机理不同,RWD是主动式的响应设计,AWD是被动式的响应式设计,RWD不管用户使用的是什么设备都是在服务器把数据推送到浏览器后,脚本或CSS自行侦测屏幕大小后执行对应的样式表内容,并且一直通过本地脚本在监听屏幕大小的变化,随时做出样式响应的变化,所以是主动的。但AWD是用户通过浏览器发送请求后,服务器根据请求中夹带的用户设备设备信息做出判断,调用已经在服务器里准备好的,适应对应设备样式文件+HTML内容+JS,返回给浏览器以这种方式响应不同设备。

二、知识剖析

2.1.Viewport的概念

1).通俗的讲,移动设备上的viewport就是设备的屏幕上能用来显示我们的网页的那一块区域。

2).在具体一点,就是浏览器上(也可能是一个app中的webview)用来显示网页的那部分区域,但viewport又不局限于浏览器可视区域的大小,它可能比浏览器的可视区域要大,也可能比浏览器的可视区域要小。

3).在默认情况下,一般来讲,移动设备上的viewport都是要大于浏览器可视区域的,这是因为考虑到移动设备的分辨率相对于桌面电脑来说都比较小,所以为了能在移动设备上正常显示那些传统的为桌面浏览器设计的网站。

移动设备上的浏览器都会把自己默认的viewport设为980px或1024px(也可能是其它值,这个是由设备自己决定的),但带来的后果就是浏览器会出现横向滚动条,因为浏览器可视区域的宽度是比这个默认的viewport的宽度要小的。

这里有一张浏览器的默认viewport宽度值的表,可以看下。

2.2.移动设备哪些因素会引起css中px的变化?

在css中我们一般使用px作为单位,在桌面浏览器中css的1个像素往往都是对应着电脑屏幕的1个物理像素。但实际情况却并非如此,css中的像素只是一个抽象的单位,在不同的设备或不同的环境中,css中的1px所代表的设备物理像素是不同的。

1)从iphone4开始,苹果公司便推出了所谓的Retina屏,分辨率提高了一倍,变成640x960,但屏幕尺寸却没变化,这就意味着同样大小的屏幕上,像素却多了一倍,这时,一个css像素是等于两个物理像素的(意思就是你分辨率越大,css中1px代表的物理像素就会越多)。

2)用户对设备界面的缩放,例如,当用户把页面放大一倍,那么css中1px所代表的物理像素也会增加一倍;反之把页面缩小一倍,css中1px所代表的物理像素也会减少一倍。

2.3.devicePixelRatio属性

1)它的官方的定义为:设备物理像素和设备独立像素的比例,也就是devicePixelRatio =物理像素/独立像素。

理解:css中的px可以看做是设备的独立像素,所以知道devicePixelRatio,我们可以知道该设备上一个css像素代表多少个物理像素。

举个栗子:在Retina屏的iphone上,devicePixelRatio的值为2,也就是说1个css像素相当于2个物理像素。

2.4.ideal viewport——完美适配移动设备的理想viewport。

所谓的完美适配(通常意义下,攻城狮口中的自适应)指的是:

1)不需要用户缩放和横向滚动条就能正常的查看网站的所有内容;

2)显示的文字的大小是合适,比如一段14px大小的文字,不会因为在一个高密度像素的屏幕里显示得太小而无法看清,理想的情况是这段14px的文字无论是在何种密度屏幕,何种分辨率下,显示出来的大小都是差不多的。

三、常见问题

在进行移动设备网站的开发时,如何控制ideal viewport呢?

四、解决方案

我们在开发移动设备的网站时,最常见的的一个动作就是把下面这个东西复制到我们的head标签中:

<meta name="viewport"content="width=device-width,initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

name="viewport" content="width=device-width"———把当前的viewport宽度设置为ideal viewport的宽度。

width=device-width ——设置layout viewport的宽度,为一个正整数,或字符串"width-device"

initial-scale ——设置页面的初始缩放值,为一个数字,可以带小数

minimum-scale ——允许用户的最小缩放值,为一个数字,可以带小数

maximum-scale ——允许用户的最大缩放值,为一个数字,可以带小数

user-scalable ——是否允许用户进行缩放,值为"no"或"yes", no代表不允许,yes代表允许

target-densitydpi: 值可以为一个数值或high-dpi、medium-dpi、low-dpi、device-dpi这几个字符串中的一个

注意:当target-densitydpi=device-dpi时,css中的1px会等于物理像素中的1px。

5.编码实战

详见视频


固定宽度布局开发WebApp如何实现多终端下自适应_腾讯视频

六、拓展思考

6.1.关于缩放

这里指的缩放,是相对于ideal viewport来缩放的,缩放值越大,当前viewport的宽度就会越小,反之亦然。

举个栗子:在iphone中,ideal viewport的宽度是320px,如果我们设置initial-scale=2,此时viewport的宽度会变为只有160px了

理解:就是原来1px的东西变成2px了,但是1px变为2px并不是把原来的320px变为640px了,而是在实际宽度不变的情况下,1px变得跟原来的2px的长度一样了,所以放大2倍后原来需要320px才能填满的宽度现在只需要160px就做到了。因此,我们可以得出一个公式:

visual viewport宽度= ideal viewport宽度/当前缩放值;

当前缩放值= ideal viewport宽度/ visual viewport宽度

6.2.initial-scale的默认值是多少?

initial-scale的默认值很显然不会是1,因为当initial-scale = 1时,当前的layout viewport宽度会被设为ideal viewport的宽度,但前面说了,各浏览器默认的layout viewport宽度一般都是980啊,1024啊,800啊等等这些个值,没有一开始就是ideal viewport的宽度的。

安卓设备上的initial-scale默认值:如果没有设置的话,就没有,一定要设置,这个属性才会起作用。

iphone和ipad上的initial-scale默认值:

测试:在iphone上,我们不设置任何的viewport meta标签,此时layout viewport的宽度为980px,但我们可以看到浏览器并没有出现横向滚动条,浏览器默认的把页面缩小了。根据上面的公式,当前缩放值= ideal viewport宽度/ visual viewport宽度,我们可以得出:
当前缩放值= 320 / 980,也就是当前的initial-scale默认值是0.33这样子。

6.3.总结得到缩放值的公式:

当前缩放值= ideal viewport宽度/ visual viewport宽度

//visual viewport宽度指的是浏览器可视区域的宽度。

//ideal viewport宽度指的是完美适配移动设备的宽度

提示:如果不设置meta viewport标签,移动设备上浏览器默认的宽度值为800px,980px,1024px等这些,总之是大于屏幕宽度的(意思就是说,会不自适应手机端的页面)

七、参考文献

参考一:移动前端开发之viewport的深入理解

参考二:Responsive design 和 Adaptive design 的区别?

八、更多讨论

1.自适应和响应式各有什么优劣?

2.网页自适应设计常见问题有哪些?

3.有哪些常见的布局方式?

感谢大家观看

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

PPT链接

视频链接

你可以直接点击此链接与我一起学习:邀请码

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

推荐阅读更多精彩内容