视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
CSS垂直水平完全居中手册
2020-11-27 18:53:24 责编:小采
文档

居中一直是CSS中被抱怨的典型。为什么实现起来这么辛苦?所以有人被嘲笑。我觉得问题不是没有办法做到,只是视情况而定,有很多不同方式,但是很难弄清楚应该用何种方式。

因此我写了这篇文章,希望能把他变得容易点。

水平居中

内联元素(inline or inline-*)居中?

你可以让他相对父级块级元素居中对齐

.center-children {
 text-align: center;
}

块级元素(block level)居中?

你可以通过设置margin-left和margin-right为auto让它居中(同时还要设置width,否则它就会承满整个容器,无法看出居中效果),如。

.center-me {
 margin: 0 auto;
}

如果有很多块级元素呢?

如果你有很匀块级元素需要水平居中成一行,你最好使用一个不同的display类型。这是一个使用inline-block和flex的例子。

<main class="inline-block-center">
 <div>
 I'm an element that is block-like with my siblings and we're centered in a row.
 </div>
 <div>
 I'm an element that is block-like with my siblings and we're centered in a row. I have more content in me than my siblings do.
 </div>
 <div>
 I'm an element that is block-like with my siblings and we're centered in a row.
 </div>
</main>
<main class="flex-center">
 <div>
 I'm an element that is block-like with my siblings and we're centered in a row.
 </div>
 <div>
 I'm an element that is block-like with my siblings and we're centered in a row. I have more content in me than my siblings do.
 </div>
 <div>
 I'm an element that is block-like with my siblings and we're centered in a row.
 </div>
</main>
body {
 background: #f06d06;
 font-size: 80%;
}
main {
 background: white;
 margin: 20px 0;
 padding: 10px;
}
main div {
 background: black;
 color: white;
 padding: 15px;
 max-width: 125px;
 margin: 5px;
}
.inline-block-center {
 text-align: center;
}
.inline-block-center div {
 display: inline-block;
 text-align: left;
}
.flex-center {
 display: flex;
 justify-content: center;
}

垂直居中

垂直居中在CSS中有点棘手

内联元素(inline or inline-*)居中,像文本和链接那样的?

它是一行的吗?

有时侯元素可以表现像垂直居中,只是因为它们有相等的上下padding

.link {
 padding-top: 30px;
 padding-bottom: 30px;
}

如果padding因为某些原因不能用,而且文本不会换行的情况下,你可以使用line-height,让其与height相等去对齐文本。

.center-text-trick {
 height: 100px;
 line-height: 100px;
 white-space: nowrap;
}

它是多行的?

上下等padding的方式也可以让多行居中,但是如果这方法没用,你可以让这些文字的容器按table cell模式显示,然后设置文字的vertical-align属性对齐,就像talbe那样

<table>
 <tr>
 <td>
 I'm vertically centered multiple lines of text in a real table cell.
 </td>
 </tr>
</table>
<div class="center-table">
 <p>I'm vertically centered multiple lines of text in a CSS-created table layout.</p>
</div>
body {
 background: #f06d06;
 font-size: 80%;
}
table {
 background: white;
 width: 240px;
 border-collapse: separate;
 margin: 20px;
 height: 250px;
}
table td {
 background: black;
 color: white;
 padding: 20px;
 border: 10px solid white;
 /* default is vertical-align: middle; */
}
.center-table {
 display: table;
 height: 250px;
 background: white;
 width: 240px;
 margin: 20px;
}
.center-table p {
 display: table-cell;
 margin: 0;
 background: black;
 color: white;
 padding: 20px;
 border: 10px solid white;
 vertical-align: middle;
}

块级元素(block level)垂直居中?

你知道元素的高度吗?

出于很多方面的原因,不知道网页布局的高度是相当普遍的。

但是如果你的布局有一个固定高度,你就可以这样垂直居中:

.parent {
 position: relative;
}
.child {
 position: absolute;
 top: 50%;
 height: 100px;
 margin-top: -50px; /* 如果没有使用: border-box; 的盒子模型则需要设置这个 */
}

元素的高度是未知的

尽管未知,但你仍有可能向上推移50%的宽度

.parent {
 position: relative;
}
.child {
 position: absolute;
 top: 50%;
 transform: translateY(-50%);
}

你可以使用flexbox吗?

这并不奇怪,使用flexbox会容易非常多

<main> 
 <div>
 I'm a block-level element with an unknown height, centered vertically within my parent.
 </div> 
</main>
body {
 background: #f06d06;
 font-size: 80%;
}
main {
 background: white;
 height: 300px;
 width: 200px;
 padding: 20px;
 margin: 20px;
 display: flex;
 flex-direction: column;
 justify-content: center;
 resize: vertical;
 overflow: auto;
}
main div {
 background: black;
 color: white;
 padding: 20px;
 resize: vertical;
 overflow: auto;
}

同时水平和垂直居中

元素有固定的宽度和高度

如果元素的宽度和高度是固定的,你需要先绝对居中,然后上移和左移50%的宽度即可,这种方案有极好的跨浏览器支持。

.parent {
 position: relative;
}
.child {
 width: 300px;
 height: 100px;
 padding: 20px;
 position: absolute;
 top: 50%;
 left: 50%;
 margin: -70px 0 0 -170px;
}

元素的宽度高度未知

如果你不知道高度和宽度(可变的),你可以使用transofrm属性在两个方向都平移负50%

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

更多CSS 垂直水平完全居中手册相关文章请关注PHP中文网!

下载本文
显示全文
专题