将一个 div 在另一个 div 中垂直居中

Vertically center a div inside another div

我正在尝试 vertical-align: middle 一个 div 到另一个 div 中,但由于某种原因它无法正常工作。我做错了什么?

#wrapper {
border: 1px solid red;
width: 500px;
height: 500px;
}
#block {
border: 1px solid blue;
width: 500px;
height: 250px;
vertical-align: middle;
}
<div id = 'wrapper'> 
<div id = 'block'> I'm Block </div>
<div>

PS: 这只是一个例子,所以不,我实际上并不知道 div 的实际宽度和高度,因为它们是动态的,根据它们的内容,所以请不要 margin-top: 125px 或 padding-top: 125px 答案,或类似的答案。

这是我通常的做法。

#wrapper {
border: 1px solid red;
width: 500px;
height: 500px;
position: relative;
}
#block {
border: 1px solid blue;
width: 500px;
height: 250px;
position: absolute;
top: 50%;
transform: translateY(-50%);
}
<div id="wrapper">
<div id="block"></div>
</div>

使其动态化的简单方法。

你可以这样做:

#block {
  border:         1px solid blue;
  margin:         25% 0;
  width:          500px;
  height:         250px;
  vertical-align: middle;
}

但这不是您要找的!

或者像这样:

#wrapper {
  border:         1px solid red;
  width:          500px;
  height:         500px;
  display:        table-cell;
  vertical-align: middle;
}

#block {
  border:  1px solid blue;
  display: inline-block;
  width:   500px;
  height:  250px;
}

vertical-align属性仅适用于inline-leveltable-cell元素(source)。在您的代码中,您使用的是 块级 元素。

试试这个 flexbox 替代方案:

#wrapper {
    border: 1px solid red;
    width: 500px;
    height: 500px;
    display: flex;               /* establish flex container */
    align-items: center;         /* vertically center flex items */
}

#block {
    border: 1px solid blue;
    width: 500px;
    height: 250px;
    /* vertical-align: middle; */
}
<div id='wrapper'>
    <div id='block'> I'm Block </div>
<div>

在此处了解有关弹性对齐的更多信息:

浏览器支持: 所有主流浏览器都支持Flexbox,except IE < 10. Some recent browser versions, such as Safari 8 and IE10, require vendor prefixes. For a quick way to add prefixes use Autoprefixer. More details in .

你可以这样做:

#wrapper {
  border: 1px solid red;
  width: 500px;
  height: 500px;
}
#block {
  border: 1px solid blue;
  width: 500px;
  height: 250px;
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}

这里是实时视图:https://jsfiddle.net/w9bpy1t4/

如果你知道内部 div 的高度,那么你可以在 wrapper 上使用相对位置,在内部 div 中使用绝对位置,并留有一些余量。所以 css 可以是这个

#wrapper {
 border: 1px solid red;
 width: 500px;
 height: 500px;
 position: relative;
 }
#block {
 border: 1px solid blue;
 width: 500px;
 height: 250px;
 vertical-align: middle;
 position: absolute;
 margin-top: 50%;
 top: -125px;
 }