Skip to main content

Command Palette

Search for a command to run...

Html+css 各类布局模式介绍

Updated
2 min read

静态布局(Static Layout)

即传统 Web 设计,网页上的所有元素的尺寸一律使用 px 作为单位

  • 布局特点

    • 不管浏览器尺寸具体是多少,网页布局始终按照最初写代码时的布局来显示。
    • 常规的 pc 的网站都是静态(定宽度)布局的,也就是设置了 min-width,这样的话,如果小于这个宽度就会出现滚动条,如果大于这个宽度则内容居中外加背景,这种设计常见与 pc 端。
  • 设计方法

    • PC居中布局,所有样式使用绝对宽度/高度(px),设计一个 Layout,在屏幕宽高有调整时,使用横向和竖向的滚动条来查阅被遮掩部分;
    • 移动设备另外建立移动网站,单独设计一个布局,使用不同的域名如 wap.或 m.。

移动端开发中采用静态布局的两种方式

  • viewport meta标签上设置 width=320,页面的各个元素也采用 px 作为单位。通过用JS 动态修改标签的 initial-scale 使得页面等比缩放。
  • 设在viewport meta标签上设置content="width=640,user-scalable=no“,页面的各个元素也采用 px作为单位。由于 640px 超出了手机宽度,浏览器会自动缩小页面至刚好全屏。

优点:这种布局方式对设计师和 CSS 编写者来说都是最简单的,亦没有兼容性问题。

缺点:显而易见,即不能根据用户的屏幕尺寸做出不同的表现。

当前,大部分门户网站、大部分企业的 PC 宣传站点都采用了这种布局方式。固定像素尺寸的网页是匹配固定像素尺寸显示器的最简单办法。但这种方法不是一种完全兼容未来网页的制作方法,我们需要一些适应未知设备的方法。

流式布局(Liquid Layout)

流式布局(Liquid)的特点(也叫"Fluid") 是页面元素的宽度按照屏幕分辨率进行适配调整,但整体布局不变。代表作栅栏系统(网格系统)。

网页中主要的划分区域的尺寸使用百分数(搭配 min-、max-属性使用),例如,设置网页主体的宽度为 80%,min-width 为 960px。图片也作类似处理(width:100%, max-width 一般设定为图片本身的尺寸,防止被拉伸而失真)。

  • 布局特点
    • 屏幕分辨率变化时,页面里元素的大小会变化而但布局不变。【这就导致如果屏幕太大或者太小都会导致元素无法正常显示】
  • 设计方法
    • 使用%百分比定义宽度高度大都是用 px 来固定住,可以根据可视区域 (viewport) 和父元素的实时尺寸进行调整,尽可能的适应各种分辨率。往往配合 max-width/min-width 等属性控制尺寸流动范围以免过大或者过小影响阅读。

这种布局方式在 Web 前端开发的早期历史上,用来应对不同尺寸的 PC 屏幕(那时屏幕尺寸的差异不会太大),在当今的移动端开发也是常用布局方式,但缺点明显:主要的问题是如果屏幕尺度跨度太大,那么在相对其原始设计而言过小或过大的屏幕上不能正常显示。因为宽度使用%百分比定义,但是高度和文字大小等大都是用 px 来固定,所以在大屏幕的手机下显示效果会变成有些页面元素宽度被拉的很长,但是高度、文字大小还是和原来一样(即,这些东西无法变得“流式”),显示非常不协调。

自适应布局(Adaptive Layout)

自适应布局的特点是分别为不同的屏幕分辨率定义布局,即创建多个静态布局每个静态布局对应一个屏幕分辨率范围。改变屏幕分辨率可以切换不同的静态局部(页面元素位置发生改变),但在每个静态布局中,页面元素不随窗口大小的调整发生变化。可以把自适应布局看作是静态布局的一个系列。

  • 布局特点
    • 屏幕分辨率变化时,页面里面元素的位置会变化大小不会变化
  • 设计方法
    • 使用 @media 媒体查询不同尺寸和介质的设备切换不同的样式。在优秀的响应范围设计下可以给适配范围内的设备最好的体验,在同一个设备下实际还是固定的布局。

响应式布局(Responsive Layout)

随着 CSS3 出现了媒体查询技术,又出现了响应式设计的概念。响应式设计的目标是确保一个页面在所有终端上(各种尺寸的 PC、手机、手表、冰箱的 Web 浏览器等等)都能显示出令人满意的效果,对 CSS 编写者而言,在实现上不拘泥于具体手法,但通常是糅合了流式布局+弹性布局,再搭配媒体查询技术使用。

分别为不同的屏幕分辨率定义布局,同时,在每个布局中,应用流式布局的理念,即页面元素宽度随着窗口调整而自动适配。即:创建多个流体式布局分别对应一个屏幕分辨率范围。可以把响应式布局看作是流式布局和自适应布局设计理念的融合。

响应式几乎已经成为优秀页面布局的标准。

  • 布局特点
    • 每个屏幕分辨率下面会有一个布局样式,即元素位置和大小都会变
  • 设计方法
    • 媒体查询+流式布局。
    • 通常使用 @media 媒体查询网格系统 (Grid System) 配合相对布局单位进行布局,实际上就是综合响应式、流动等上述技术通过 CSS 给单一网页不同设备返回不同样式的技术统称。

优点:适应 pc 和移动端,如果足够耐心,效果完美

缺点:

(1)媒体查询是有限的,也就是可以枚举出来的,只能适应主流的宽高。

(2)要匹配足够多的屏幕大小,工作量不小,设计也需要多个版本。

响应式页面在头部会加上这一段代码:
<meta name="applicable-device" content="pc,mobile" />
<meta http-equiv="Cache-Control" content="no-transform " />

总结:

响应式与自适应的原理是相似的,都是检测设备,根据不同的设备采用不同的 css,而且 css 都是采用的百分比的,而不是固定的宽度,不同点是响应式的模板在不同的设备上看上去是不一样的,会随着设备的改变而改变展示样式,而自适应不会,所有的设备看起来都是一套的模板,不过是长度或者图片变小了,不会根据设备采用不同的展示样式,流式就是采用了一些设置,当宽度大于多少时怎么展示,小于多少时怎么展示,而且展示的方式向水流一样,一部分一部分的加载,静态的就是采用固定宽度的了。

流式布局是用于解决类似的设备不同分辨率之间的兼容(一般分辨率差异较少);响应式是用于解决不用设备之间不用分辨率之间的兼容问题(一般是指 PC,平板,手机等设备之间较大的分辨率差异)。

如何实现响应式布局:折腾响应式布局设计,应运而生的 web 页面响应布局

弹性布局(rem/em 布局)

参考:流布局与响应式网页设计有什么区别?

  • rem,em 区别

    • rem,em 都是顺应不同网页字体大小展现而产生的。其中,em 是相对其父元素,在实际应用中相对而言会带来很多不便;而rem 是始终相对于 html 大小,即页面根元素。
  • 使用 em 或 rem 单位进行相对布局,相对%百分比更加灵活,同时可以支持浏览器的字体大小调整和缩放等的正常显示,因为 em 是相对父级元素的原因没有得到推广。

    • 【中国站点制作网页的时候,习惯用 CSS 强制定义字体大小,保证每个人都看到一致的效果,包括网易、搜狐这些门户网站在内的大部分站点,用的都是绝对单位 px(像素)。但是,如果从网站易用性方面考虑,字体大小应该是可变的,一些视力不是那么好的人需要放大字体才能看得清页面内容。然而,占据大部分浏览器市场的 IE 无法调整那些使用 px 作为单位的字体大小。国外人士非常重视网站的易用性,相当一部分外国站点已经使用 em 作为字体单位。】
  • 这类布局的特点是:包裹文字的各元素的尺寸采用 em/rem 做单位,而页面的主要划分区域的尺寸仍使用百分数或 px 做单位(同「流式布局」或「静态/固定布局」)。

    • 早期浏览器不支持整个页面按比例缩放,仅支持网页内文字尺寸的放大,这种情况下。使用 em/rem 做单位,可以使包裹文字的元素随着文字的缩放而缩放。
  • 浏览器的默认字体高度一般为 16px,即 1em:16px,但是 1:16 的比例不方便计算,为了使单位 em/rem 更直观,CSS 编写者常常将页面跟节点字体设为 62.5%,比如选择用 rem 控制字体时,先需要设置根节点 html 的字体大小,因为浏览器默认字体大小 16px*62.5%=10px。这样 1rem 便是 10px,方便了计算。

  • 用 em/rem 定义尺寸的另一个好处是更能适应缩进/以字体单位 padding 或 margin/浏览器设置字体尺寸等情况(因为 em/rem 相对于字体大小,会同步改变)

    • 例如:p{ text-indent: 2em; }
  • 使用 rem 单位的弹性布局在移动端也很受欢迎

    • rem的定义
      • font size of the root element,rem 是相对于根元素来设置字体大小的,这就意味着,我们只需要根据自己的需求在根元素确定一个参考值
    • rem 与 em、px 的区别
      • px:像素,比较精确的单位,但不好做响应式布局
      • em:以父节点 font-size 大小为参考点,标准不统一,容易造成混乱
      • REM 支持的浏览器:Mozilla Firefox 3.6+、Apple Safari 5+、Google Chrome、IE9+和 Opera11+。IE6-8 无法支持。

对于不同尺寸的屏幕,可以统一假设屏幕宽度为 640px 后编写 CSS(当然你也可以假定统一为 320px)。

此时,我们设定 html 元素的 font-size 为 40px(同样,只是举例),然后各处(元素尺寸、文字大小)使用 rem 作为单位,随后搭配媒体查询或 JS,根据屏幕的大小来动态控制 html 元素的 font-size(特定屏幕尺寸下,html 元素的 font-size 应当设置为何值,是使用这个方案时设计师和程序员需要反复考虑后确定的,以下试举一段相关的 CSS 媒体查询代码),即可自动改变所有用 rem 定义尺寸的元素的大小(且 CSS 编写者在脑中进行换算的计算过程比 em 简单得多)。

html {
  font-size: 20px;
}
@media only screen and (min-width: 401px) {
  html {
    font-size: 25px !important;
  }
}
@media only screen and (min-width: 428px) {
  html {
    font-size: 26.75px !important;
  }
}
@media only screen and (min-width: 481px) {
  html {
    font-size: 30px !important;
  }
}
@media only screen and (min-width: 569px) {
  html {
    font-size: 35px !important;
  }
}
@media only screen and (min-width: 641px) {
  html {
    font-size: 40px !important;
  }
}

其实在移动端使用所谓的弹性布局,是比较勉强的。移动端弹性布局流行起来的原因归根结底是 rem 单位对于(根据屏幕尺寸)调整页面的各元素的尺寸、文字大小时比较好用。其实,使用 vw、vh 等后起之秀的单位,可以实现完美的流式布局(高度和文字大小都可以变得“流式”),弹性布局就不再必要了。详细可参考:视区相关单位 vw, vh…简介以及可实际应用场景

以下优缺点参考:响应式设计和 REM 布局的对比(有疑问)

  • 优点
    • 理想状态是所有屏幕的高宽比和最初的设计高宽比一样,或者相差不多,完美适应。
  • 缺点
    • 这种 rem+js 只不过是宽度自适应,高度没有做到自适应,一些对高度,或者元素间距要求比较高的设计,则这种布局没有太大的意义。如果只是宽度自适应,更推荐响应式设计。

响应式和弹性布局之间的对比

  • 响应式布局
    • 改变浏览器宽度,“布局”会随之变化,不是一成不变的,例如导航栏在大屏幕下是横排,在小屏幕下是竖排,在超小屏幕下隐藏为菜单,也就是说如果有足够的耐心,在每一种屏幕下都应该有合理的布局,完美的效果。
  • rem 布局
    • 改变浏览器宽度,页面所有元素的高宽都等比例缩放,也就是大屏幕下导航是横的,小屏幕下还是横的只不过变小了。

结论

  • 如果只做pc 端,那么静态布局(定宽度)是最好的选择;

  • 如果做移动端,且设计对高度和元素间距要求不高,那么弹性布局(rem+js)是最好的选择,一份 css+一份 js 调节 font-size 搞定;

  • 如果pc,移动要兼容,而且要求很高那么响应式布局还是最好的选择,前提是设计根据不同的高宽做不同的设计,响应式根据媒体查询做不同的布局。

More from this blog

【两万字总结】Spark 部署与入门

Spark 介绍 核心概念 Spark 是 UC Berkeley AMP lab 开发的一个集群计算的框架,类似于 Hadoop,但有很多的区别。 最大的优化是让计算任务的中间结果可以存储在内存中,不需要每次都写入 HDFS,更适用于需要迭代的 MapReduce 算法场景中,可以获得更好的性能提升。 例如一次排序测试中,对 100TB 数据进行排序,Spark 比 Hadoop 快三倍,并且只需要十分之一的机器。 Spark 集群目前最大的可以达到 8000 节点,处理的数据达到 PB 级别...

Oct 20, 202115 min read

【引言】浙大机器学习课程记录

机器学习的定义 第一种定义 ARTHUR SAMUEL对Machine learning 的定义 Machine Learning is Fields of study that gives computers the ability to learn without being explicitly programmed 机器学习是这样的领域,它赋予计算机学习的能力,(这种学历能力)不是通过显著式编程获得的 显著式编程 提前人为指定规律的编程方式 非显著式编程 让计算机自己总结规律的...

Oct 19, 20212 min read

TensorFlow 2 Keras实现线性回归

介绍 线性回归是入门机器学习必学的算法,其也是最基础的算法之一。 接下来,我们以线性回归为例,使用 TensorFlow 2 提供的 API 和 Eager Execution 机制对其进行实现。 线性回归是一种较为简单,但十分重要的机器学习方法,它也是神经网络的基础。 如下所示,线性回归要解决的问题就是如何找到最理想的直线去拟合散点样本。 对于一个线性回归问题,一般来讲有 2 种解决方法,分别是: 最小二乘法 代数求解 矩阵求解 梯度下降法。 本次,我们将使用梯度下降方法来解决线性回...

Oct 12, 20211 min read

TensorFlow 2 基础概念语法与常用模块

TensorFlow 2 简介 TensorFlow 是由谷歌在 2015 年 11 月发布的深度学习开源工具,我们可以用它来快速构建深度神经网络,并训练深度学习模型。运用 TensorFlow 及其他开源框架的主要目的,就是为我们提供一个更利于搭建深度学习网络的模块工具箱,使开发时能够简化代码,最终呈现出的模型更加简洁易懂。 2019 年,TensorFlow 推出了 2.0 版本,也意味着 TensorFlow 从 1.x 正式过度到 2.x 时代。根据 TensorFlow 官方 介绍内...

Oct 12, 20213 min read

uiu's log

27 posts

Insist on programming & Love open source