行内元素混排:inline:不设 width/height左右 margin/padding 有效上下 margin 被忽略
| 常见标签 | 宽高 | 垂直 margin | 是否独占行 | |
|---|---|---|---|---|
block | div p section h1 ul li | 生效 | 生效(且会塌陷) | 是 |
inline | a span b em code img input | 无效 | 无效 | 否 |
inline-block | 按钮、徽章、图标 | 生效 | 生效(不塌陷) | 否 |
inline-block 之间那道缝来自 HTML 源码里的换行符被当空白渲染。三种解法:父元素 font-size: 0(副作用大)、写成一排不留换行、或直接用 Flex(推荐)。
| 写法 | 占位 | 可交互 | 能被屏幕阅读器读到 | 能过渡动画 |
|---|---|---|---|---|
display: none | 不占 | 否 | 否(从可访问性树移除) | 否(直接消失) |
visibility: hidden | 占位 | 否 | 否 | 可过渡(离散切换) |
opacity: 0 | 占位 | 是(仍可点,注意误触) | 是 | 是(首选动画属性) |
/* 现代做法:显示/隐藏交给一个类,过渡用 opacity + visibility 组合 */
.popover { opacity: 0; visibility: hidden; transition: opacity .18s ease, visibility .18s; }
.popover.is-open { opacity: 1; visibility: visible; }
/* 纯给屏幕阅读器隐藏(视觉保留): */
.sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
浮动的图片脱离正常流,后面的文字自动绕着它排 —— 这是报纸版面的需求,也是 float 被设计出来的唯一原因。图片宽度加右外边距决定了文字绕排的位置。
/* ① 传统 clearfix:伪元素占一行把浮动「顶」住 */
.clearfix::after { content: ""; display: block; clear: both; }
/* ② 父级 overflow: hidden —— 顺带创建 BFC,简单但会裁掉溢出内容 */
/* ③ display: flow-root —— 只为创建 BFC 而生,语义最准确,无副作用 */
.parent { display: flow-root; }
/* ④ 两个都浮动时给最后一个加 clear: both(旧写法,不推荐) */
| 场景 | 选择 |
|---|---|
| 图文环绕、首字下沉旁的图片 | float 仍是正解,Flex/Grid 做不到绕排 |
| 两列/三列布局、等高卡片、导航条 | Flex(第十章)或 Grid(第十一章),别再写 float + 负 margin |
| 邮件 HTML | 少数仍要用 float/table 的领域(客户端 CSS 支持极差) |
overflow: hidden 形成 BFC 后,子的 margin-top: 24px 不再穿透,容器顶部真的留出 24px创建 BFC 的常见触发条件:float、position: absolute/fixed、display: flow-root/inline-block/table-cell/flex/grid、overflow 非 visible、contain: paint。
display: contents /* 盒子自身「消失」,子元素直接参与父布局(注意:会丢掉自身的背景/边框,且曾引发展示与可访问性问题,谨慎全局使用) */ display: inline-table /* 行内表格 */