码迷,mamicode.com
首页 > Web开发 > 详细

CSS 垂直水平完全居中手册

时间:2018-02-14 10:34:14      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:text   需要   nowrap   middle   translate   idt   ted   jsf   hat   

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

  

水平居中

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

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

1 .center-children {
2   text-align: center;
3 }

块级元素(block level)居中?

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

1 .center-me {
2   margin: 0 auto;
3 }

如果有很多块级元素呢?

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

 在线示例: http://jsfiddle.net/ourjs/0b6b7wt8/

<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>

  

 1 body {
 2   background: #f06d06;
 3   font-size: 80%;
 4 }
 5 main {
 6   background: white;
 7   margin: 20px 0;
 8   padding: 10px;
 9 }
10 main div {
11   background: black;
12   color: white;
13   padding: 15px;
14   max-width: 125px;
15   margin: 5px;
16 }
17 .inline-block-center {
18   text-align: center;
19 }
20 .inline-block-center div {
21   display: inline-block;
22   text-align: left;
23 }
24 .flex-center {
25   display: flex;
26   justify-content: center;
27 }

垂直居中

 垂直居中在CSS中有点棘手

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

 它是一行的吗?

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

1 .link {
2   padding-top: 30px;
3   padding-bottom: 30px;
4 }

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

1 .center-text-trick {
2   height: 100px;
3   line-height: 100px;
4   white-space: nowrap;
5 }

它是多行的?

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

 在线演示: http://jsfiddle.net/ourjs/0fn2u4rc/

<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>

  

 1 body {
 2   background: #f06d06;
 3   font-size: 80%;
 4 }
 5 table {
 6   background: white;
 7   width: 240px;
 8   border-collapse: separate;
 9   margin: 20px;
10   height: 250px;
11 }
12 table td {
13   background: black;
14   color: white;
15   padding: 20px;
16   border: 10px solid white;
17   /* default is vertical-align: middle; */
18 }
19 .center-table {
20   display: table;
21   height: 250px;
22   background: white;
23   width: 240px;
24   margin: 20px;
25 }
26 .center-table p {
27   display: table-cell;
28   margin: 0;
29   background: black;
30   color: white;
31   padding: 20px;
32   border: 10px solid white;
33   vertical-align: middle;
34 }

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

 你知道元素的高度吗?

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

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

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

元素的高度是未知的

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

 在线演示: http://jsfiddle.net/ourjs/9sLf7p56/

1 .parent {
2   position: relative;
3 }
4 .child {
5   position: absolute;
6   top: 50%;
7   transform: translateY(-50%);
8 }

你可以使用flexbox吗?

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

<main>  
  <div>
     I‘m a block-level element with an unknown height, centered vertically within my parent.
  </div>  
</main>

  

 1 body {
 2   background: #f06d06;
 3   font-size: 80%;
 4 }
 5 main {
 6   background: white;
 7   height: 300px;
 8   width: 200px;
 9   padding: 20px;
10   margin: 20px;
11   display: flex;
12   flex-direction: column;
13   justify-content: center;
14   resize: vertical;
15   overflow: auto;
16 }
17 main div {
18   background: black;
19   color: white;
20   padding: 20px;
21   resize: vertical;
22   overflow: auto;
23 }

同时水平和垂直居中

 元素有固定的宽度和高度

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

 1 .parent {
 2   position: relative;
 3 }
 4 .child {
 5   width: 300px;
 6   height: 100px;
 7   padding: 20px;
 8   position: absolute;
 9   top: 50%;
10   left: 50%;
11   margin: -70px 0 0 -170px;
12 }

元素的宽度高度未知

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

1 .parent {
2   position: relative;
3 }
4 .child {
5   position: absolute;
6   top: 50%;
7   left: 50%;
8   transform: translate(-50%, -50%);
9 }

 

CSS 垂直水平完全居中手册

标签:text   需要   nowrap   middle   translate   idt   ted   jsf   hat   

原文地址:https://www.cnblogs.com/mhxy13867806343/p/8447881.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!