写了个登录框,宽 400 像素,怎么调都贴着左边。margin 明明写了 auto,开发者工具一开才发现,盒子根本没设宽度,宽度是满的,auto 自然没处可居中。

水平居中,先给宽度

块级元素靠 margin: 0 auto 居中,前提是有确定的宽度。width: 400px 或者 max-width: 400px 都行。父容器是 flex 的话,一句 justify-content: center 就够,连宽度都不用管。

.box { width: 400px; margin: 0 auto; }

垂直居中卡在父元素高度

很多人写 align-items: center 没反应,原因是父容器的高度就等于内容高度,居中前后长得一样。给父级补上 min-height: 100vh,效果立马出来。html 和 body 的默认高度由内容撑开,不是视口高度,这点最容易忘。

.wrap { display: flex; align-items: center; justify-content: center; min-height: 100vh; }

grid 更省事,两行结束:display: grid 配 place-items: center,水平垂直一起解决,元素多宽多高都不影响。

绝对定位那套还能用

父级 position: relative,子元素 left 50%、top 50%,再 transform: translate(-50%, -50%)。老项目里到处都是,缺点是 transform 会给内部元素的定位和某些动画带来麻烦,能换 flex 就换。

不生效的几个常见原因

  • text-align: center 只管行内内容,对块级盒子没有任何作用。
  • 元素本身是 inline 或 inline-block,margin auto 不起作用。
  • 父容器设了 float,或者宽度是 0,子元素再居中也没意义。
  • 样式被后面的规则覆盖,控制台里那一行会被划掉,点开看来源。

登录框这类场景,我一般直接上 flex 加 min-height: 100vh,兼容性和可读性都够。遇到居中失效,先查父级高度,再查元素宽度,九成问题都在这两处。