494

我试图将标签内容垂直居中,但是当我添加 CSS 样式display:inline-flex时,水平文本对齐消失了。

如何为每个选项卡设置文本对齐 x 和 y?

* { box-sizing: border-box; }
#leftFrame {
  background-color: green;
  position: absolute;
  left: 0;
  right: 60%;
  top: 0;
  bottom: 0;
}
#leftFrame #tabs {
  background-color: red;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 25%;
}
#leftFrame #tabs div {
  border: 2px solid black;
  position: static;
  float: left;
  width: 50%;
  height: 100%;
  text-align: center;
  display: inline-flex;
  align-items: center;
}
<div id=leftFrame>
  <div id=tabs>
    <div>first</div>
    <div>second</div>
  </div>
</div>

4

26 回答 26

791
  • 方法 1 - transform translateX/ translateY

    此处示例/全屏示例

    受支持的浏览器(大多数)中,您可以使用top: 50%/left: 50%结合 translateX(-50%) translateY(-50%)来动态地垂直/水平居中元素。

.container {
    position: absolute;
    top: 50%;
    left: 50%;
    -moz-transform: translateX(-50%) translateY(-50%);
    -webkit-transform: translateX(-50%) translateY(-50%);
    transform: translateX(-50%) translateY(-50%);
}
<div class="container">
    <span>I'm vertically/horizontally centered!</span>
</div>


  • 方法 2 - Flexbox 方法:

    此处示例/全屏示例

    支持的浏览器中,将display目标元素的 设置为flexalign-items: center用于垂直居中和justify-content: center水平居中。只是不要忘记添加供应商前缀以获得额外的浏览器支持(参见示例)。

html, body, .container {
    height: 100%;
}

.container {
    display: -webkit-flexbox;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    -webkit-flex-align: center;
    -ms-flex-align: center;
    -webkit-align-items: center;
    align-items: center;
    justify-content: center;
}
<div class="container"> 
  <span>I'm vertically/horizontally centered!</span>
</div>


  • 方法 3 - table-cell/ vertical-align: middle

    此处示例/全屏示例

    在某些情况下,您需要确保html/body元素的高度设置为100%.

    对于垂直对齐,将父元素的width/设置height100%并添加display: table。然后对于子元素,更改displaytotable-cell和 add vertical-align: middle

    对于水平居中,您可以添加text-align: center以居中文本和任何其他inline子元素。或者,您可以使用margin: 0 auto,假设元素是block水平的。

html, body {
    height: 100%;
}
.parent {
    width: 100%;
    height: 100%;
    display: table;
    text-align: center;
}
.parent > .child {
    display: table-cell;
    vertical-align: middle;
}
<section class="parent">
    <div class="child">I'm vertically/horizontally centered!</div>
</section>


  • 50%方法 4 -从顶部绝对定位,有位移:

    此处示例/全屏示例

    这种方法假设文本有一个已知的高度——在这种情况下,18px. 只是50%相对于父元素从顶部绝对定位元素。使用margin-top元素已知高度的一半的负值,在本例中为 - -9px

html, body, .container {
    height: 100%;
}

.container {
    position: relative;
    text-align: center;
}

.container > p {
    position: absolute;
    top: 50%;
    left: 0;
    right: 0;
    margin-top: -9px;
}
<div class="container">
    <p>I'm vertically/horizontally centered!</p>
</div>


  • 方法 5 -line-height方法(最不灵活 - 不建议):

    示例在这里

    在某些情况下,父元素将具有固定的高度。对于垂直居中,您所要做的就是line-height在子元素上设置一个等于父元素固定高度的值。

    尽管此解决方案在某些情况下会起作用,但值得注意的是,当有多行文本时它不起作用 -像 this

.parent {
    height: 200px;
    width: 400px;
    background: lightgray;
    text-align: center;
}

.parent > .child {
    line-height: 200px;
}
<div class="parent">
    <span class="child">I'm vertically/horizontally centered!</span>
</div>

于 2013-10-19T02:07:52.190 回答
40

如果 CSS3 是一个选项(或者你有一个后备),你可以使用转换:

.center {
    right: 50%;
    bottom: 50%;
    transform: translate(50%,50%);
    position: absolute;
}

与上面的第一种方法不同,您不想将 left:50% 用于否定翻译,因为 IE9+ 中存在溢出错误。使用正的右值,您将看不到水平滚动条。

于 2015-02-05T04:41:28.177 回答
19

下面是如何使用两个简单的 flexbox 属性在两个轴上将n 个div 居中:

  • 设置容器的高度:这里将主体设置为至少 100 视口高度。
  • align-items: center;如果 flex 方向是 row 则将块垂直居中如果 flex 方向是 column 则水平居中
  • justify-content: space-around;如果 flex 方向是 row,则将垂直分配可用空间,否则如果 flex 方向是 div 元素周围的列,则水平分配可用空间

body {
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: space-around;
}
<div>foo</div>
<div>bar</div>

于 2019-04-24T09:38:41.430 回答
15

将盒子垂直和水平居中的最佳方法是使用两个容器:

##外部容器:

  • 应该有display: table;

##内部容器:

  • 应该有display: table-cell;
  • 应该有vertical-align: middle;
  • 应该有text-align: center;

##内容框:

  • 应该有display: inline-block;
  • 应该调整水平文本对齐,除非您希望文本居中

##演示:

body {
    margin : 0;
}

.outer-container {
    display: table;
    width: 80%;
    height: 120px;
    background: #ccc;
}

.inner-container {
    display: table-cell;
    vertical-align: middle;
    text-align: center;
}

.centered-content {
    display: inline-block;
    text-align: left;
    background: #fff;
    padding : 20px;
    border : 1px solid #000;
}
<div class="outer-container">
   <div class="inner-container">
     <div class="centered-content">
        Center this!
     </div>
   </div>
</div>

另见这个小提琴

##居中在页面中间:

要将您的内容置于页面中间,请将以下内容添加到您的外部容器中:

  • position : absolute;
  • width: 100%;
  • height: 100%;

这是一个演示:

body {
    margin : 0;
}

.outer-container {
    position : absolute;
    display: table;
    width: 100%;
    height: 100%;
    background: #ccc;
}

.inner-container {
    display: table-cell;
    vertical-align: middle;
    text-align: center;
}

.centered-content {
    display: inline-block;
    text-align: left;
    background: #fff;
    padding : 20px;
    border : 1px solid #000;
}
<div class="outer-container">
   <div class="inner-container">
     <div class="centered-content">
        Center this!
     </div>
   </div>
</div>

另见这个小提琴

于 2016-01-21T01:02:08.820 回答
9

CSS Grid: place-items

最后,我们让place-items: centerCSS Grid 让它变得更容易。

HTML

<div class="parent">
  <div class="to-center"></div>
</div>

CSS

.parent {
  display: grid;
  place-items: center;
}

输出:

html,
body {
  height: 100%;
}

.container {
  display: grid;
  place-items: center;
  height: 100%;
}

.center {
  background: #5F85DB;
  color: #fff;
  font-weight: bold;
  font-family: Tahoma;
  padding: 10px;
}
<div class="container">
  <div class="center" contenteditable>I am always super centered within my parent</div>
</div>

于 2020-07-09T14:44:31.243 回答
6

运行此代码片段并查看垂直和水平对齐的 div。

html,
body,
.container {
  height: 100%;
  width: 100%;
}
.container {
  display: flex;
  align-items: center;
  justify-content: center;
}
.mydiv {
  width: 80px;
}
<div class="container">
  <div class="mydiv">h & v aligned</div>
</div>

于 2016-11-03T18:35:29.793 回答
3

    .align {
        display: flex;
        width: 400px;
        height: 400px;
        border: solid 1px black;
        align-items: center;
        justify-content: space-around;
    }
    .align div:first-child {
        width: 20px;
        height: 20px;
        background-color: red;
        position: absolute; 
    }
    .align div {
        width: 20px;
        height: 20px;
        background-color: blue;
    }
    <div class='align'>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </div>

第一个孩子将在中心垂直和水平对齐

于 2017-07-21T14:19:05.513 回答
2

网格 css 方法

#wrapper {
    position: absolute;
    top: 0;
    bottom: 0;
    right: 0;
    left: 0;
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-template-rows: repeat(3, 1fr);
}
.main {
    background-color: #444;
}
<div id="wrapper">
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box main"></div>
</div>

于 2018-02-11T19:22:46.437 回答
2

另一种方法是使用表:

<div style="border:2px solid #8AC007; height:200px; width:200px;">
  <table style="width:100%; height:100%">
    <tr style="height:100%">
      <td style="height:100%; text-align:center">hello, multiple lines here, this is super long, and that is awesome, dude</td>
    </tr>
  </table>
</div>

于 2015-07-14T15:47:12.340 回答
2

使 Div 在页面中居中check the fiddle link

#vh {
    border-radius: 15px;
    box-shadow: 0 0 8px rgba(0, 0, 0, 0.4);
    padding: 25px;
    width: 200px;
    height: 200px;
    background: white;
    text-align: center;
    margin: auto;
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
}
<div id="vh">Div to be aligned vertically</div>

更新 另一个选择是使用弹性框 check the fiddle link

.vh {
    background-color: #ddd;
    height: 200px;
    align-items: center;
    display: flex;
}
.vh > div {
    width: 100%;
    text-align: center;
    vertical-align: middle;
}
<div class="vh">
    <div>Div to be aligned vertically</div>
</div>

于 2016-02-04T23:06:23.150 回答
2

以下是获得所需结果的 Flex-box 方法

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>Flex-box approach</title>
<style>
  .tabs{
    display: -webkit-flex;
    display: flex;
    width: 500px;
    height: 250px;
    background-color: grey;
    margin: 0 auto;
    
  }
  .f{
    width: 200px;
    height: 200px;
    margin: 20px;
    background-color: yellow;
    margin: 0 auto;
    display: inline; /*for vertically aligning */
    top: 9%;         /*for vertically aligning */
    position: relative; /*for vertically aligning */
  }
</style>
</head>
<body>

    <div class="tabs">
        <div class="f">first</div>
        <div class="f">second</div>        
    </div>

</body>
</html>

于 2016-03-13T13:46:27.990 回答
2

The simplest and cleanest solution for me is using the CSS3 property "transform":

.container {
  position: relative;
}

.container a {
  position: absolute;
  top: 50%;
  transform: translate(0,-50%);
}
<div class="container">
  <a href="#">Hello world!</a>
</div>

于 2015-09-28T19:12:55.017 回答
1

需要遵循以下简单解决方案:

  .centered-class {
      align-items: center;
      display: flex;
      justify-content: center;
      width: 100vw;
      height: 100vh;
    }
<div class="centered-class">
  I'm in center vertically and horizontally.
</div>

于 2020-01-28T06:55:17.170 回答
1

来源链接

方法一)显示类型flex

.child-element{
    display: flex;
    justify-content: center;
    align-items: center;
}

方法 2) 2D 变换

.child-element {
    top: 50%;
    left: 50%;
    transform: translate(-50% , -50%);
    position: absolute;
}

在此处查看其他方法

于 2019-02-12T15:29:12.240 回答
1

您可以使用 CSS(您的元素display:inline-grid+ grid-auto-flow: row;)Grid 和 Flex Box(父元素display:flex;)来实现这一点,

见下面的片段

#leftFrame {
  display: flex;
  height: 100vh;
  width: 100%;
}

#tabs {
  display: inline-grid;
  grid-auto-flow: row;
  grid-gap: 24px;
  justify-items: center;
  margin: auto;
}

html,body {
  margin:0;
  padding:0;
}
<div>
<div id=leftFrame>
  <div id=tabs>
    <div>first</div>
    <div>second</div>        
  </div>
</div>
</div>

于 2019-01-05T14:38:02.087 回答
1

只需将顶部、底部、左侧和右侧设为 0。

<html>
<head>
<style>
<div> 
{
position: absolute;
margin: auto;
background-color: lightblue;
width: 100px;
height :100px;
padding: 25px;
top :0;
right :0;
bottom:0;
left:0;
}


</style>
</head>
<body>

<div> I am in the middle</div>

</body>
</html>
于 2017-06-21T06:16:19.393 回答
1

为了使元素垂直和水平居中,我们还可以使用下面提到的属性。

此 CSS 属性垂直对齐项目并接受以下值:

flex-start:项目与容器顶部对齐。

flex-end:项目与容器底部对齐。

center:项目在容器的垂直中心对齐。

baseline:项目显示在容器的基线处。

拉伸:拉伸项目以适应容器。

这个 CSS 属性justify-content水平对齐项目并接受以下值:

flex-start:项目与容器的左侧对齐。

flex-end:项目与容器的右侧对齐。

center:项目在容器的中心对齐。

space-between:项目以相等的间距显示。

space-around:项目以相等的间距显示在它们周围。

于 2017-02-21T08:53:38.137 回答
0

将 div 垂直和水平居中的最简单方法如下:

<div style="display: table; width: 200px; height: 200px; border: 1px solid black;">
    <div style="display: table-cell; vertical-align: middle; text-align: center;">
        Text Here
    </div>
</div>

再举一个例子

.parent {
    display: table; 
    width: 100%; 
    height: 100%;
}

.child {
    display: table-cell; 
    vertical-align: middle;
    text-align: center;
}


<div class="parent">
    <div class="child">
        <h4><u>SERVICE IN BANGLADESH FLEET RESERVE <br> AND <br> RE-ENGAGEMENT ORDER FOR DEFENCE SERVICE</u></h4>
    </div>
</div>
于 2019-01-21T14:44:23.787 回答
0

如果它只是关于文本对齐 它可以非常简单,只需使用这个:

vertical-align: middle; /* vertical centering*/
text-align: center; /* horizontal centering*/

不需要父亲风格或类似的东西。当然,在某些情况下,当父亲具有某些样式属性时,它可能会在此解决方案中影响孩子,并且此解决方案将无法正常工作。

于 2022-01-16T10:49:34.973 回答
0
  • 方法 6

/*Change units to "%", "px" or whatever*/

#wrapper{
  width: 50%;
  height: 70vh;
  background: rgba(0,0,0,.5);
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
}
#left{
  width: 50%;
  height: 50vh;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  margin: auto;
  background: red;
}
#right{
  width: 50%;
  height: 50vh;
  position: absolute;
  top: 0;
  bottom: 0;
  right: 0;
  margin: auto;
  background: green;
}
.txt{
  text-align: center;
  line-height: 50vh;
}
<div id="wrapper">
   <div id="left" class="txt">Left</div>
   <div id="right" class="txt">Right</div>
</div>

    .container{ 
               width: 50%;  //Your container width here
               height: 50%; //Your container height here
               position: absolute; 
               top: 0; 
               right: 0;  
               bottom: 0; 
               left: 0; 
               margin: auto;
    }
于 2016-02-02T12:52:14.600 回答
0

如果你喜欢没有flexbox、grid、table 或vertical-align: middle;

你可以做:

HTML

<div class="box">
    <h2 class="box__label">square</h2>
</div>

CSS

.box {
    box-sizing: border-box;
    width: 100px;
    height: 100px;
    text-align: center;
    border: 1px solid black;
}

.box__label {
    box-sizing: border-box;
    display: inline-block;
    transform: translateY(50%);
    text-align: center;
    border: 1px solid black;
}
于 2020-01-15T09:02:27.523 回答
0

这应该有效

.center-div {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    text-align: center;
    min-height: 100vh;
}
<div class="center-div">Center Div</div>

于 2019-01-21T05:24:19.067 回答
-1

最简单的flexbox方法:

将单个元素垂直和水平居中的最简单方法是将其设为弹性项目并将其边距设置为auto

如果您将自动边距应用于弹性项目,该项目将自动扩展其指定边距以占用弹性容器中的额外空间......

.flex-container {
  height: 150px;
  display: flex;
}

.flex-item {
  margin: auto;
}
<div class="flex-container">
  <div class="flex-item">
    This should be centered!
  </div>
</div>

这种在每个方向上的边距扩展会将元素精确地到其容器的中间。

于 2020-05-10T11:31:06.233 回答
-1

我使用这个 CSS 代码:

display: grid;
justify-content: center;
align-items: center;

来源是CSS-Tricks

于 2021-06-10T11:11:38.887 回答
-1

这是人们在搜索时可能会来到此页面的一个相关问题:当​​我想将 div 居中以获得“等待..” 100px 方形动画 gif 时,我使用:

.centreDiv {
    position: absolute;
    top:     -moz-calc(50vh - 50px);
    top:  -webkit-calc(50vh - 50px);
    top:          calc(50vh - 50px);
    left:    -moz-calc(50vw - 50px);
    left: -webkit-calc(50vw - 50px);
    left:         calc(50vw - 50px);
    z-index: 1000; /* whatever is required */
}
于 2019-12-06T00:40:55.537 回答
-1

在我试图垂直对齐内部文本内容的情况下button::beforebutton::after我能够使用vertical-align: text-top.

button::after {
  vertical-align: text-top;
}
于 2021-08-24T07:44:13.647 回答