CSS【详解】居中对齐 (水平居中 vs 垂直居中)

水平居中

内部块级元素的宽度要小于容器(父元素)

方案一:文本居中对齐(内联元素)

限制条件:仅用于内联元素 display:inline 和 display: inline-block;

给容器添加样式

css 复制代码
text-align:center
html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .box {
        margin: 30px 30px 0px 300px;
        border: 1px solid gray;
        text-align: center;
      }
      .item {
        display: inline-block;
        width: 400px;
        background: yellow;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <span>水平居中 -- display: inline</span>
    </div>
    <div class="box">
      <div class="item">水平居中 -- display: inline-block</div>
    </div>
  </body>
</html>

方案二:自动外边距(块级元素)

限制条件:仅用于块级元素 display:block;

给内部元素添加样式

css 复制代码
margin: auto
html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .box {
        margin: 30px;
        border: 1px solid gray;
      }
      .item {
        margin: auto;
        width: 300px;
        background: yellow;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <div class="item">水平居中 -- 块级元素 display:block</div>
    </div>
  </body>
</html>

方案三:flex布局【推荐】

给容器添加样式

css 复制代码
display: flex;
justify-content: center;
html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .box {
        margin: 30px 30px 0px 300px;
        border: 1px solid gray;
        display: flex;
        justify-content: center;
      }
      .item {
        width: 400px;
        background: yellow;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <span>水平居中 -- flex布局 display: inline</span>
    </div>
    <div class="box">
      <div class="item">水平居中 -- flex布局 display: block</div>
    </div>
  </body>
</html>

方案四:子绝父相 + transform (CSS3)

限制条件 :浏览器需支持CSS3,比较老的浏览器不适用

给容器(父元素)添加样式

css 复制代码
position: relative

给内部元素添加样式

css 复制代码
position: absolute;
left: 50%;
transform: translate(-50%, 0);
html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .box {
        margin: 30px 30px 0px 300px;
        border: 1px solid gray;
        height: 50px;
        position: relative;
      }
      .item {
        background-color: yellow;
        position: absolute;
        left: 50%;
        transform: translate(-50%, 0);
      }
    </style>
  </head>
  <body>
    <div class="box">
      <span class="item">水平居中 -- 子绝父相 + transform</span>
    </div>
  </body>
</html>

方案五:子绝父相 + 自动外边距 (指定宽度)

限制条件:内部元素需限定宽度

给容器(父元素)添加样式

css 复制代码
position: relative

给内部元素添加样式

css 复制代码
position: absolute;
left: 0;
right: 0;
margin: auto;
html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .box {
        margin: 30px 30px 0px 300px;
        border: 1px solid gray;
        height: 50px;
        position: relative;
      }
      .item {
        background-color: yellow;
        position: absolute;
        left: 0;
        right: 0;
        margin: auto;
        width: 300px;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <span class="item">水平居中 -- 子绝父相 + 自动外边距</span>
    </div>
  </body>
</html>

方案六:子绝父相 + 负外边距 (知道宽度 + 宽度计算)

限制条件:需知道内部元素的宽度(无法预知宽度的内联元素和未知宽度的块级元素都不适用)

给容器(父元素)添加样式

css 复制代码
position: relative

给内部元素添加样式

css 复制代码
position: absolute;
left:50%;
margin-left:-内部元素宽度的一半
html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .box {
        margin: 30px;
        border: 1px solid gray;
        height: 100px;
        position: relative;
      }
      .item {
        width: 400px;
        background: yellow;
        position: absolute;
        left: 50%;
        margin-left: -200px;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <div class="item">水平居中 -- 绝对定位元素 position:absolute</div>
    </div>
  </body>
</html>

垂直居中

内部块级元素的高度要小于容器(父元素)

方案一:行高 = 容器高度(单行内联元素)

限制条件:仅用于单行内联元素 display:inline 和 display: inline-block;

给容器添加样式

css 复制代码
 height: 100px;
 line-height: 100px;
html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .box {
        margin: 30px;
        border: 1px solid gray;
        height: 100px;
        line-height: 100px;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <span class="item">垂直居中 -- 内联元素 display:inline</span>
    </div>
  </body>
</html>

方案二:flex布局【推荐】

给容器添加样式

css 复制代码
display: flex;
align-items: center;

方案三:子绝父相 + transform(CSS3)

限制条件 :浏览器需支持CSS3,比较老的浏览器不适用

给容器(父元素)添加样式

css 复制代码
position: relative

给内部元素添加样式

css 复制代码
position: absolute;
top: 50%;
transform: translate(0, -50%);
html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .box {
        margin: 30px;
        border: 1px solid gray;
        height: 100px;
        position: relative;
      }

      .item {
        position: absolute;
        top: 50%;
        transform: translate(0, -50%);
        background-color: yellow;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <div class="item">垂直居中 -- 子绝父相 transform</div>
    </div>
  </body>
</html>

方案四:子绝父相 + 自动外边距(指定高度)

限制条件:内部元素需限定高度

给容器(父元素)添加样式

css 复制代码
position: relative

给内部元素添加样式

css 复制代码
position: absolute;
top: 0;
bottom: 0;
margin: auto;
  • 内联元素也有效,因为内联元素绝对定位后,display 会变为 block
html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .box {
        margin: 30px;
        border: 1px solid gray;
        height: 100px;
        position: relative;
      }

      .item {
        position: absolute;
        top: 0;
        bottom: 0;
        margin: auto;
        background-color: yellow;
        height: 50px;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <span class="item">垂直居中 -- 子绝父相 + 自动外边距</span>
    </div>
  </body>
</html>

方案五:子绝父相 + 负外边距 (知道高度 + 高度计算)

限制条件:需知道内部元素的高度

给容器(父元素)添加样式

css 复制代码
position: relative

给内部元素添加样式

css 复制代码
position: absolute;
top: 50%;
margin-top: -内部元素高度的一半;
html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .box {
        margin: 30px;
        border: 1px solid gray;
        height: 100px;
        position: relative;
      }

      .item {
        position: absolute;
        top: 50%;
        margin-top: -25px;
        height: 50px;
        background-color: yellow;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <span class="item">垂直居中 -- 子绝父相 + 负外边距</span>
    </div>
  </body>
</html>

水平垂直居中

参考上文分别实现水平居中和垂直居中即可,常用方案如下:

方案一:flex布局【推荐】

给容器添加样式

css 复制代码
display: flex;
justify-content: center;
align-items: center;

方案二:子绝父相 + transform (CSS3)

限制条件 :浏览器需支持CSS3,比较老的浏览器不适用

给容器(父元素)添加样式

css 复制代码
position: relative

给内部元素添加样式

css 复制代码
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);

方案三:子绝父相 + 自动外边距(指定高度和宽度)

给容器(父元素)添加样式

css 复制代码
position: relative

给内部元素添加样式

css 复制代码
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;

方案四:子绝父相 + 负外边距 (知道宽度和高度 + 宽度和高度计算)

限制条件 :需知道内部元素的宽度和高度

给容器(父元素)添加样式

css 复制代码
position: relative

给内部元素添加样式

css 复制代码
position: absolute;
left:50%;
margin-left:-内部元素宽度的一半;
top: 50%;
margin-top: -内部元素高度的一半;
html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .box {
        margin: 30px 30px 0px 300px;
        border: 1px solid gray;
        height: 100px;
        position: relative;
      }
      .item {
        background-color: yellow;
        position: absolute;
        left: 50%;
        margin-left: -150px;
        top: 50%;
        margin-top: -25px;
        width: 300px;
        height: 50px;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <span class="item">水平垂直居中 -- 子绝父相 + 负外边距</span>
    </div>
  </body>
</html>
相关推荐
FungLeo13 分钟前
node 后端和浏览器前端,有关 RSA 非对称加密的完整实践, 前后端匹配的代码演示
前端·非对称加密·rsa 加密·node 后端
雪芽蓝域zzs23 分钟前
JavaScript splice() 方法
开发语言·javascript·ecmascript
不灭锦鲤23 分钟前
xss-labs靶场第11-14关基础详解
前端·xss
不是吧这都有重名1 小时前
利用systemd启动部署在服务器上的web应用
运维·服务器·前端
霸王蟹1 小时前
React中巧妙使用异步组件Suspense优化页面性能。
前端·笔记·学习·react.js·前端框架
Maỿbe1 小时前
利用html制作简历网页和求职信息网页
前端·html
森叶1 小时前
Electron 主进程中使用Worker来创建不同间隔的定时器实现过程
前端·javascript·electron
霸王蟹1 小时前
React 19 中的useRef得到了进一步加强。
前端·javascript·笔记·学习·react.js·ts
霸王蟹1 小时前
React 19版本refs也支持清理函数了。
前端·javascript·笔记·react.js·前端框架·ts
繁依Fanyi2 小时前
ColorAid —— 一个面向设计师的色盲模拟工具开发记
开发语言·前端·vue.js·编辑器·codebuddy首席试玩官