界面布局

1.1K
0
0
最后修改于

CSS Layout#

布局的主要问题是什么?

在一批批元素中,将元素放到适当的位置,最终呈现出所需要的结果。

因此主要问题就是找到每个元素的位置,确定了位置之后,也就达到了 “布局 “的效果。

在一个坐标系内,如何确定多个元素的坐标?

  1. 相对定位,元素 A 的位置相对于元素 B 的位置进行确定。

  2. 绝对定位,为元素 A 指定一个坐标,就站在那里了。

  3. 顺序,按照一定的规则(如从左向右 / 从上到下)一个接一个排布。上一个元素结尾的位置,就是现在的位置。

与 CSS 布局有关的属性有三个,float,position以及 display

float#

float 的作用最初只用于在成块的文本内浮动图像,但在很长一段时间内却起到了多列布局的功能。

在 flex / grid 等布局功能出现之后,float 也可以卸下本不该属于它的重担,只需负责浮动特定元素。

position#

  • position:static,默认情况下一个元素的位置就紧随上一个元素,进行换行 / 处于尾部。

  • position:relative,元素仍然占用文档流,其宽度由子元素撑开。

  • position:absolute, 元素不再占用当前文档流,不会对其他元素产生影响,只会基于文档边界(body默认行为)进行定位。

  • 但是通过改变其祖先元素的定位方式为position:relative,会基于祖先元素而非body进行绝对定位。(也称改变定位上下文)

  • position:fixed, 元素不再占用当前文档流,不会对其他元素产生影响,只会基于可视窗口(默认行为)进行定位。

  • 但是当元素祖先的 transformperspectivefilter 或 backdrop-filter 属性非 none 时,会基于该祖先进行定位。

![[img/image.png]]

  • position:sticky, 设定一个界限,在界限内,采用相对定位,当超过界限前 (比如超出 viewport),转换定位方式转换为 fixed。

display#

同时有两种功能。

  1. 对父代或同代,声明是块元素还是内联元素,以表示自己如何参与父代的排列。

  2. 对子代,声明所需要遵循的布局方式。在自己内部,同级元素如何排布。

对于声明的子代布局。主要有三种,流式布局 (默认),弹性布局,网格布局。

弹性布局#

![[../excalidraw/界面布局 flex.excalidraw]]

Q1:子元素在内部的排布方式?

按行 / 按列顺序排布。flex-direction

为方便 / 统一起见。因为需要描述xy轴,但又是基于一维方向,因此,定义出main axiscross axis

Q2:在父元素剩余空间大于子元素所需空间时,子元素如何对齐?

  • 在主轴方向上,justify-content

  • 在交叉轴方向上,align-items

  • 在交叉轴方向上多行 / 列之间,align-content

Q3:在主轴上子元素超出父元素的承受能力的时候,需要考虑的问题?

  • 超出主轴大小,flex-wrap

  • 适当缩放大小,flex-shrinkflex-grow

  • 缩放所参考的基准,flex-basis

Q4:其他增强部分

  • 在不改变原有元素顺序的情况下,改变现实顺序,order

网格布局#

![[../excalidraw/界面布局 grid.excalidraw]]

Q1:子元素在内部的排布方式?

预先定义好行列数构建出网格,随后将子元素放入单元格中。

Q2:如何定义行列的语法?

  • 行方向上 grid-template-row

  • 列方向上 grid-template-column

Q3:如何将元素按指定的方式放在某个 / 某几个单元格内?

  • 行方向上 grid-row

  • 列方向上 grid-column

Q4:如何调整单元格行列相对于父元素的排布?

  • 行方向上 justify-content

  • 列方向上 align-content

Q5:如何调整元素在一个 / 多个单元格内,相对于父元素的排布?

  • (整体)行方向上 justify-items

  • (整体)列方向上 align-items

  • (单元素调整) 行方向上 justify-self

  • (单元素调整) 列方向上 align-self

Q5:功能性增强部分?

  • grid-template-area,为多个网格区域进行命名,从而可以通过grid-area快速指定元素所处的位置,并提升语义性。

  • gap,为单元格增加间距。

  • grid-auto-columngrid-auto-row,在指定的grid-rowgrid-column超出所定义的template时新增隐式网格部分。

  • 相关度量单位fr,通过该单位行列去按比例定义剩余空间的分配方式。

界面布局