在CSS中水平居中和垂直居中:完整的指南

这篇文章将会按照如下思路展开:

一、水平居中

1. 行内元素水平居中

2. block元素水平居中

3. 多个块级元素水平居中

二、垂直居中

1. 行内元素水平居中

2. block元素水平居中

3. 用flexbox

三、水平和垂直居中

1.元素是都有定宽定高

2.元素宽高不定

3.用flexbox

 

 

了解了文章的架构,就让我们追条击破!

一、水平居中

1. 行内元素水平居中

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

该方法适用于inline, inline-block, inline-table, inline-flex

2. block元素水平居中

.center-me {
  margin: 0 auto;
}

3. 多个块级元素水平居中

如果有两个或更多的块级元素需要在一行中水平居中,那么可能会更好地使它们成为不同的显示类型。 这里有一个使它们inline-block和flexbox的例子:

.inline-block-center {
  text-align: center;
  display:inline-block;
}
或
.flex-center{
  display:flex;
  justify-content:center;
}

结果如图

 

如果有多个块级元素堆叠在彼此的顶部,在这种情况下,auto margin就很好。

main div {
  background: black;
  margin: 0 auto;
  color: white;
  padding: 15px;
  margin: 5px auto;
}

结果如图:

二、垂直居中

1. 行内元素垂直

  1.1 单独一行

它们的上和下有相等的padding

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

如果padding由于某种原因不是一个选项,并且你试图居中一些nowrap的文本,有一个窍门是使line-height等于文本高度。

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

  1.2 多行

上下padding相等同样适用。但有时文本是table cell 就不适用了。但是我们还有法宝,vertical-align可以解决这个问题。

.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;
}

或者 flex大神

//这是父元素
.flex-center-vertically
{ display: flex; justify-content: center; flex-direction: column; height: 400px; }

注意,只有父容器具有固定高度(px,%等),这才是真正相关的,这就是为什么这里的容器有一个高度。

如果这两种技术都出来了,你可以使用“ghost element”技术,其中全高度伪元素被放置在容器内,文本与该元素垂直对齐。

.ghost-center {
  position: relative;
}
.ghost-center::before {
  content: " ";
  display: inline-block;
  height: 100%;
  width: 1%;
  vertical-align: middle;
}
.ghost-center p {
  display: inline-block;
  vertical-align: middle;
}

2. block元素垂直居中

  2.1 元素高度已知

.parent {
  position: relative;
}
.child {
  position: absolute;
  top: 50%;
  height: 100px;
  margin-top: -50px; /* account for padding and border if not using box-sizing: border-box; */
}

  2.2 元素高度未知

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

3.用flexbox

.parent {
  display: flex;
  flex-direction: column;
  justify-content: center;
}

 

三、水平和垂直居中

1.元素是都有定宽定高

.parent {
  position: relative;
}

.child {
  width: 300px;
  height: 100px;
  padding: 20px;

  position: absolute;
  top: 50%;
  left: 50%;

  margin: -70px 0 0 -170px;
}

 

2.元素宽高不定

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

 

3.用flexbox

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

 

四、结论

posted @ 2017-01-18 21:29  张三的美丽家园  阅读(336)  评论(0编辑  收藏  举报