CSS 居中怎么写:4 种方案按场景对号入座,不用再背十种

别再背「CSS 居中的 N 种方法」:水平居中一行 text-align 或 margin auto,垂直居中首选 Flex 的 align-items,同时居中两手抓就 justify-content + align-items,绝对定位居中留给必须脱离文档流的浮层。每种方案附完整代码、适用边界与最常见的不生效原因。

约 6 分钟读完 · 更新于 2026-10-21 · 文中每条都能在下面的配套工具里动手验证

场景一:文字水平居中——text-align 一行搞定

块级容器里的行内内容(文字、图片、inline / inline-block 元素)水平居中,用 text-align: center 加在容器上。注意它作用于「容器里的行内内容」,不是元素自己;给块级元素自己设 text-align 只会影响它的子内容。

文字与图片水平居中
.wrap { text-align: center; }
/* 图片记得设 display:inline-block 或保持默认 inline 才受 text-align 影响 */

场景二:块级元素水平居中——margin auto

有确定宽度的块级元素水平居中用 margin: 0 auto——auto 把剩余空间平分给左右。不生效的最常见原因有两个:元素没有设宽度(auto 占满一行,没有剩余空间可分);或元素是 Flex/Grid 的子项,此时水平对齐由容器控制,margin auto 只在特殊用法里有意义。

定宽块级居中
.card {
  width: 320px;
  margin: 0 auto;   /* 左右 auto 平分剩余空间 */
}

场景三:垂直居中 / 水平垂直都居中——Flex 是默认答案

2016 年之后,垂直居中的默认答案是 Flex:容器三行,子项无论尺寸未知、多行还是动态高度都成立。水平垂直同时居中就两个属性一起上。Grid 同样可以:place-items: center 一行等价于两个轴一起居中,容器只有一个子项时最简洁。

Flex:水平垂直居中(首选)
.wrap {
  display: flex;
  justify-content: center;  /* 主轴(默认水平) */
  align-items: center;      /* 交叉轴(默认垂直) */
}
Grid:一行等价写法
.wrap {
  display: grid;
  place-items: center;  /* align + justify 一步到位 */
}

场景四:浮层 / 弹窗居中——绝对定位 + transform 或 inset

必须脱离文档流的浮层用绝对定位居中。经典写法是 top 50% + translate(-50%, -50%),位移基于自身尺寸,宽高未知也成立;现代写法 inset: 0 + margin: auto 配合定宽高,或干脆 inset: 0 + display: grid + place-items: center 让容器自己当居中层。transform 方案的唯一坑:translate 会创建层叠上下文,内部再写 z-index 时要意识到这一点。

transform 写法(宽高未知)
.modal {
  position: fixed;
  top: 50%; left: 50%;
  transform: translate(-50%, -50%);
}
inset 写法(内容也居中)
.modal {
  position: fixed;
  inset: 0;
  margin: auto;
  width: fit-content; height: fit-content;
}

「为什么不生效」排查表

症状最可能的原因修复
margin: auto 不居中元素没有定宽,或 display 不是 block设 width;行内元素先改 display: block
text-align: center 不生效目标不是行内内容,而是块级子元素给子元素 margin auto,或把容器改 Flex
Flex 里 align-items 没垂直居中flex-direction: column 后主轴变成了垂直列方向用 justify-content,行方向用 align-items
子项被拉伸而不是居中align-items 默认值 stretch 生效显式写 align-items: center
绝对定位偏移到一个角落父级没有 position: relative给最近的定位祖先补 relative
百分比 top 时有时无父级高度不定,百分比解析为 auto给父级定高,或改用 Flex/Grid 居中

选型口诀

文字用 text-align,定宽块用 margin auto,其余一律 Flex(单子项可用 Grid place-items),浮层用绝对定位三件套。把「十种居中方法」收敛成这四条,以后写居中不需要回忆,只需要判断场景。

常见问题

Flex 和 Grid 居中哪个好?

只有单个子项时两者等价,Grid 的 place-items: center 更短;多个子项要按主轴排列时用 Flex。性能差异可以忽略,选表达力更强的那个。

transform 居中会影响 z-index 吗?

会创建层叠上下文:元素内部的 z-index 只在这个上下文里比较。浮层本身与页面其他浮层的层级关系要在更外层控制。

行内元素怎么水平垂直居中?

把父容器设为 Flex 后 align-items: center + justify-content: center,行内元素无需改 display 即可居中;或给行内元素 line-height 等于容器高(仅单行文字)。

📂

松开以自动格式化

支持 .json / .sql / .csv / .html / .css / .xml / .yaml 文件