页面布局 | 青训营笔记

284 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的的第3天

布局(Layout)确定内容大小和位置的算法;依据元素、容器、兄弟结点和内容等信息来计算

1. 布局的相关技术

image.png

2. 盒(box)模型

  • content-box

image.png

  • border-box

image.png

 

2.1 width

  • 指定content box宽度
  • 取值长度、百分数、auto
  • auto 由浏览器根据其他属性确定
  • 百分数相对于容器的content box 宽度

2.2 height

  • 指定 content box 高度
  • 取值为长度、百分数、auto
  • auto 取值由内容计算得来
  • 百分数相对于容器的 content box 高度
  • 容器有指定的高度时,百分数才生效

2.3 padding

  • 指定元素四个方向的内边距
  • 百分数相对于容器宽度

2.4 border

  • 指定容器边框样式、粗细和颜色

    • none 无
    • solid 实线
    • dashed 虚线
    • dotted 点线
  • 三种属性

    • border-width
    • border-style
    • border-color
  • 四个方向

    • border-top
    • boder-right
    • border-bottom
    • border-left

2.5 margin

  • 指定元素四个方向的外边距
  • 取值可以是长度、百分数、auto
  • 百分数相对于容器宽度
  • margin在垂直方向上会有margin重叠(即取最大margin 值)

2.6 overflow(内容溢出 )

  • visible 溢出显示
  • hidden 隐藏
  • scroll 带滚动显示
  • auto 根据内容调节scroll

2.3 块级VS行级

2.3.1 盒子

Block Level BoxInline Level Box
不和其它盒子并列摆放和其它行级盒子一起放在一行或拆开成多行
适用所有的盒模型属性盒模型中的width、height不适用

2.3.2 元素

块级元素行级元素
生成块级盒子- 生成行级盒子 - 内容分散在多个行盒 (line box) 中
body、article、div、main、section、h1-6、p、ul、li 等span、em、strong、cite、code 等
display: blockdisplay: inline

2.3.3 display属性

属性值作用
block块级盒子
inline行级盒子
inline-block本身是行级,可以放在行盒中;可以设置宽高;作为一个整体不会被拆散成多行
none排版时完全被忽略

2.4 常规流

  • 根元素、浮动和绝对定位的元素会脱离常规流
  • 其它元素都在常规流之内(in-flow)
  • 常规流中的盒子,在某种排版上下文中参与布局

2.4.1 行级排版上下文

  • Inline Formatting Context (IFC)

  • 只包含行级盒子的容器会创建一个IFC

  • IFC 内的排版规则

    • 盒子在一行内水平摆放
    • 一行放不下时,换行显示
    • text-align 决定一行内盒子的水平对齐
    • vertical-align 决定一个盒子在行内的垂直对齐
    • 避开浮动(float)元素*

2.4.2 块级排版上下文

  • Block Formatting Context (BFC)

  • 某些容器会创建一个BFC

    • 根元素
    • 浮动、绝对定位、inline-block
    • Flex子项和Grid子项
    • overflow 值不是 visible 的块盒
    • display: flow-root;

BFC 内的排版规则

  • 盒子从上到下摆放
  • 垂直 margin 合并
  • BFC 内盒子的 margin 不会与外面的合并
  • BFC 不会和浮动元素重叠

2.4.3 Flex排版上下文

Flex Box 是什么?

  • 一种新的排版上下文

  • 它可以控制子级盒子的:

    • 摆放的流向 ( → ← ↑ ↓ )
    • 摆放顺序
    • 盒子宽度和高度
    • 水平和垂直方向的对齐
    • 是否允许折行

1. flex-direction

image.png

2. 主轴对齐属性(justify-content)

image.png

3. 侧轴对齐属性(align-items)

image.png

4. align-self(对特定元素设置单独对齐)

image.png image.png

5. Flexibility(弹性)

  • 可以设置子项的弹性:当容器有剩余空间时,会伸展;容器空间不够时,会收缩。

    • flex-grow 有剩余空间时的伸展能力
    • flex-shrink 容器空间不足时收缩的能力
    • flex-basis 没有伸展或收缩时的基础长度
简写形式全写含义
flex: 1flex-grow: 1
flex: 100pxflex-basis: 100px
flex: 2 1flex-grow: 2; flex-shrink: 1
flex: 1 100pxflex-grow: 1; flex-basis: 100px
flex: 2 0 100pxflex-grow: 2; flex-shrink: 0; flex-basis: 100px
flex: autoflex: 1 1 auto
flex: noneflex: 0 0 auto

2.4.4 Grid排版上下文

  • display: grid 使元素生成一个块级的 Grid 容器
  • 使用 grid-template 相关属性将容器划分为网格
  • 设置每一个子项占哪些行/列

1. 划分网格

  • grid-template-columns 划分列
  • grid-template-rows 划分行

2. 选定网格的两种种方式

  • 列写起始线

    • grid-row-start:
    • grid-row-end:
    • grid-column-start:
    • grid-column-end:
  • 直接区域简写

    • grid-area : 1/1/3/3(row-start/column-start/row-end/column-end)

2.5 浮动 float

image.png

2.6 position

属性作用
static默认值,非定位元素
relative相对自身原本位置偏移,不脱离文档流
absolute绝对定位,相对非static 祖先元素定位
fixed相对于视口绝对定位

2.6.1 relative

1' 在常规流里面布局

2' 相对于自己本应该在的位置进行偏移

3' 使用top\left\bottom\right设置偏移长度

4' 流内其他元素当它没有偏移一样布局

image.png

2.6.2 absolute

  • 脱离常规流
  • 相对于最近的非static 祖先定位
  • 不会对流内元素布局造成影响