CSS实现水平垂直居中的方法

864 阅读3分钟

行内块或块元素元素水平垂直居中,子元素不设置宽高

方法一: absolute + margin auto

  <div>
      <img src="1.png" alt="">
  </div>
  
        div {
            width: 800px;
            height: 800px;
            border: 1px dotted red;
            position: relative;
         }
         div img{
            position: absolute;
            top:0;
            bottom: 0;
            left: 0;
            right: 0;
            margin: auto;
         } 

实现效果

image.png

  <div>
       <p>我是块元素</p>
  </div>
  div {
            width: 800px;
            height: 800px;
            border: 1px dotted red;
            position: relative;
         }
         div p{
            position: absolute;
            top:0;
            bottom: 0;
            left: 0;
            right: 0;
            margin: auto;
         } 

实现效果

image.png

看起来好像是没有水平垂直居中,用了这个方法,P的宽高和父元素DIV是一样的 800*800。是已经达到效果的。建议用此方法,子元素设置宽高

方法二:flex+margin

  <div>
       <p>我是块元素</p>
  </div>
     div {
            width: 800px;
            height: 800px;
            border: 1px dotted red;
            display: flex;
         }
         div p{
            margin: auto;
         }

实现效果

image.png

   <div>
      <img src="1.png" alt="">
  </div>
 div {
            width: 800px;
            height: 800px;
            border: 1px dotted red;
            display: flex;
         }
         div img{
            margin: auto;
         }

实现效果

image.png 这种方法是非常好用,现在IE已经没有了,不用担心兼容的问题,子元素为行内元素一样可以实现水平垂直居中

方法三:flex

   <div>
      <img src="1.png" alt="">
     <!-- <p>我是块元素</p> -->
  </div>
div{
         display: flex;
         justify-content: center;
         align-items: center;
         width: 800px;
         height: 800px;
         border: 1px dotted red;
       }

实现效果

image.png

这种方法,无论子元素是行内元素,行内块,块元素,都可以实现水平垂直居中效果

方法四:table

   <table>
        <tbody>
           <tr>
            <td  class="wp">
               <img src="1.png" alt="">
            </td>
           </tr>
        </tbody>
     </table>
 td{
         width: 800px;
         height: 800px;
         border: 1px dotted red;
         text-align: center;
       }

    因为我这里的是图片,本身是行内块元素,不需要转换为行内块,如果是行元素,需要通过display: inline-block;来转换

实现效果

image.png

  <table>
        <tbody>
           <tr>
            <td  class="wp">
              <p>我是块元素</p>
            </td>
           </tr>
        </tbody>
     </table>
  td{
         width: 800px;
         height: 800px;
         border: 1px dotted red;
         text-align: center;
       }

       td img{
         display: inline-block;
       } 

实现效果

image.png 对于子元素 为行内元素,一样有效。

方法五:css-table

css新增的table属性,可以让我们把普通元素,变为table元素的现实效果,通过这个特性也可以实现水平垂直居中

 <div>
      <!-- <img src="1.png" alt=""> -->
      <!-- <p>我是块元素</p> -->
      <span> 我是行内元素</span>
     </div>

  div{
          width: 800px;
          height: 800px;
          border: 1px dotted red;
          display: table-cell;
          text-align: center;
          vertical-align: middle;
       }
       div span{
         display: inline-block;
       }
       
      如果本身是行内块元素,不需要加 display: inline-block;
      块元素及行内元素均有效

实现效果

image.png 这种方法和table一样的原理,但却没有那么多冗余代码,兼容性也还不错

第六种:grid 此方法非常强大,可自行了解,以上五种已经够用了。

当子元素设置有高宽,还有3种方法可设置

方法一:absolute+负margin

     <div> 
      <p>我是块元素</p>
     </div>
 div{
          width: 800px;
          height: 800px;
          border: 1px dotted red;
          position: relative;
     }
     div p{
       width:  200px;
       height: 200px;
       background-color: green;
       position: absolute;
       top:50%;
       left: 50%;
       margin-left:-100px;
       margin-top: -100px;
     }

实现效果

image.png

此方法 行内元素,及行内块元素,一样可以

方法二:## absolute + transform

 <div> 
      <p>我是块元素</p>
     </div>
 div{
          width: 800px;
          height: 800px;
          border: 1px dotted red;
          position: relative;
     }
     div p{
       width:  200px;
       height: 200px;
       background-color: green;
       position: absolute;
       top: 50%;
       left: 50%;
       transform: translate(-50%,-50%);
     }

实现效果

image.png

方法三:## absolute + calc

感谢css3带来了计算属性,既然top的百分比是基于元素的左上角,那么在减去宽度的一半就好了,代码如下

<div> 
      <p>我是块元素</p>
     </div>
 div{
          width: 800px;
          height: 800px;
          border: 1px dotted red;
          position: relative;
     }
     div p{
       width:  200px;
       height: 200px;
       background-color: green;
       position: absolute;
       top:calc(50% - 100px);
       left:calc(50% - 100px)
     }

实现效果

image.png

方法四:vertical-align 此方法子元素只能是行内块或者行内元素

<div>
      <!-- <img src="1.png" alt=""> -->
      <span> 我是行内元素</span>
     </div>
 div{
    width: 800px;
    height: 800px;
    border: 1px dotted  red;
    line-height: 800px;
    text-align: center;
   }

   div span{
    vertical-align: middle;
    background-color: green;
    
   }

实现效果

image.png