一、从文档流说起
文档流、常规流、普通流、正常布局流都是指 Normal Flow,它定义了两种盒子:Block Box、Inline Box
块级元素、块级盒子都是指 Block Box 内联元素、行内元素、内联盒子都是指 Inline Box
文本流:文档的读取和输出顺序,也就是我们通常看到的由左到右、由上而下的读取和输出形式。 可以通过 CSS 属性进行设置:
direction: ltr|rtl
当说块级元素时,其实是说 html 有些标签,在浏览器中,默认的 CSS 属性为display: block
当说行内元素时,其实是说 html 有些标签,在浏览器中,默认的 CSS 属性为display: inline
当我们没有使用 CSS 控制 HTML 样式时,浏览器按照默认 CSS 布局方式是:Normal Flow。
在 Normal Flow 中,Block Box 和 Inline Box 都有各自特定的行为表现。
在下面,我们叫做块级盒子和内联盒子,这可以比较好的和 CSS 盒子模型相对应,方便理解。
内联盒子(Inline Box)的行为
- 盒子不会产生换行
- width、height 属性不起作用
- 垂直方向的 padding、margin、border 会被应用,但不会把其他 Inline Box 推开
- 水平方向的 padding、margin、border 会被应用,但会把其他的 Inline Box 推开
块级盒子(Block Box)的行为
- 每个盒子都会换行
- width、height 属性可以发挥作用
- padding、margin、border 会将其他元素从当前盒子周围推开
- 盒子会在内联的方向上扩展并占据父容器在该方向上的所有可用空间,在绝大数情况下,意味着盒子会和父容器一样宽
个人理解的内联方向是上下左右,这也就是为什么块级盒子在垂直方向上,会和父容器 margin 合并。
二、常见标签列举
内联盒子(Inline Box)
标签 | 作用 | 标签 | 作用 | 标签 | 作用 |
---|---|---|---|---|---|
a | 锚点 | abbr | 缩写 | u | 下划线 |
b | 粗体 | bdo | bidi override | textarea | 多行文本输入 |
br | 换行 | cite | 引用 | code | 计算机代码 |
dfn | 定义字段 | em | 强调 | span | 定义文本区块 |
i | 斜体 | img | 图片 | input | 输入框 |
kbd | 定义键盘文本 | label | 表格标签 | q | 短引用 |
s | 中划线 | samp | 范例计算机代码 | select | 项目选择 |
small | 小字体 | sub | 下标 | sup | 上标 |
strong | 粗体强调 |
块级盒子(Block Box)
标签 | 作用 | 标签 | 作用 | 标签 | 作用 |
---|---|---|---|---|---|
address | 地址 | blockquote | 块引用 | dl | 定义列表 |
fieldset | form 控制组 | form | 交互表单 | h1~h6 | 各级标题 |
hr | 水平分割线 | menu | 菜单列表 | noscript | 可选脚本内容 |
p | 段落 | pre | 格式化文本 | table | 表格 |
ul | 非排序列表 | ol | 排序列表 |
三、行内块盒子
display 有一个特殊的值,它在内联和块之间提供了一个中间状态 display: inline-block
。
这对于以下情况非常有用:你不希望一个项切换到新行,但希望它可以设定宽度和高度。
行内块盒子(Inline-Block Box)的行为
- 设置 width 和 height 属性会生效
- 如果显式添加 width 和 height 属性,它只会变得比其内容更大
- padding、margin、border 会推开其他元素
- 不会跳转到新行