【CSS】8種常見的垂直水平居中方法

在這裏插入圖片描述1.比較傳統的方式 absolute+margin負值偏移

特點:父容器要設置寬高,需要知道子容器寬高,偏移量是子容器寬高的一半且是負值,兼容性好

  /* absolute+margin負值偏移佈局 */

  .layout.absolute {
      position: relative;
  }

  .layout.absolute  article {
      position: absolute;
      top: 50%;
      left: 50%;
      margin-top: -50px;
      margin-left: -160px;
  }
        
   <section class="layout absolute">
       <article>
           <p>
               1.absolute+margin負值偏移<br>
               (父容器要設置寬高,需要知道子容器寬高)
           </p>
       </article>
   </section>
   

2.absolute+transform佈局

特點:父容器要設置寬高


  /* absolute+transform佈局 */
  .layout.transform {
      position: relative;
  }

  .layout.transform article {
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%,-50%);
  }

   <section class="layout transform">
       <article>
           <p>2.absolute+transform<br>
           (父容器要設置寬高)
           </p>
       </article>
   </section>     
      

3.flex佈局

特點:自適應

  /* flex佈局 */
  .layout.flex {
      display: flex;
      justify-content: center;
      align-items: center;
  }
  
  <section class="layout flex">
      <article>
          <p>3.flex<br>(自適應)</p>
      </article>
  </section>
  

4.table-cell佈局

特點:比其他方法多1個容器,注意邊距重疊

  .layout.table-cell {
      display: table;
      width: 100%;
  }

  .layout.table-cell .outer {
      display: table-cell;
      vertical-align: middle;
      text-align: center;
  }

  .layout.table-cell article {
      margin: 0 auto;
      overflow: auto;
  }
  
  <section class="layout table-cell">
      <div class="outer">
          <article>
              <p>
                  4.table-cell<br>(多1個容器,注意邊距重疊)
              </p>
          </article>                      
      </div>
  </section>  
  

5.grid佈局

特點:自適應,要考慮兼容性

   .layout.grid{
       display: grid;
   }

   .layout.grid article {
       justify-self: center;
       align-self: center;
   }

   <section class="layout grid">
       <article>
           <p>5.grid<br>(自適應,要考慮兼容性)</p>
       </article>
   </section>   
   

6.inline-block佈局

特點:自適應,兼容性好

   .layout.inline-block {
       text-align: center;
   }

   .layout.inline-block::after {
       content: '';
       height: 100%;
       display: inline-block;
       vertical-align: middle;
   }

   .layout.inline-block article {
       display: inline-block;
       vertical-align: middle;
   }
        
    <section class="layout inline-block">
        <article>
            <p>6.inline-block<br>(自適應)</p>
        </article>
    </section>      
    

7.absolute + margin-auto 佈局

特點:內外容器都要設置寬高,兼容性好

  .layout.margin-auto {
      position: relative;
  }

  .layout.margin-auto article{
      position: absolute;
      top: 0;
      bottom: 0;
      left: 0;
      right: 0;
      margin: auto;
  }
        
   <section class="layout margin-auto">
       <article>
           <p>7.absolute + margin-auto<br>(內外容器都要設置寬高) </p>
       </article>
   </section>
   

8.line-height 佈局

特點:只適合單行inline,而且要知道父容器的高度,兼容性好

 .layout.line-height {
     line-height: 150px;
 }

 .layout.line-height article {
     display: inline;
     margin:  auto;
 }
  <section class="layout line-height">
      <article>
          <p>8.line-height(只適合單行inline,而且要知道父容器的高度)</p>
      </article>
  </section>
  

完整例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>垂直居中</title>
    <style>
        html,body {
            padding: 0;
            margin: 0;
        }
        .layout {
            margin-bottom: 15px;
            height: 150px;
            background-color: blueviolet;
            background-clip: content-box;
        }

        .layout article {
            background-color: lightcoral;
            color: #fff;
            width: 320px;
            height: 100px;  
            text-align: center;
        }

        /* absolute+margin負值偏移佈局 */

        .layout.absolute {
            position: relative;
        }

        .layout.absolute  article {
            position: absolute;
            top: 50%;
            left: 50%;
            margin-top: -50px;
            margin-left: -160px;
        }

        /* absolute+transform佈局 */
        .layout.transform {
            position: relative;
        }

        .layout.transform article {
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%,-50%);
        }

        /* flex佈局 */
        .layout.flex {
            display: flex;
            justify-content: center;
            align-items: center;
        }

        /* table-cell佈局 */
        .layout.table-cell {
            display: table;
            width: 100%;
        }

        .layout.table-cell .outer {
            display: table-cell;
            vertical-align: middle;
            text-align: center;
        }

        .layout.table-cell article {
            margin: 0 auto;
            overflow: auto;
        }

        /* grid佈局 */
        .layout.grid{
            display: grid;
        }

        .layout.grid article {
            justify-self: center;
            align-self: center;
        }

        /* inline-block佈局 */
        .layout.inline-block {
            text-align: center;
        }

        .layout.inline-block::after {
            content: '';
            height: 100%;
            display: inline-block;
            vertical-align: middle;
        }

        .layout.inline-block article {
            display: inline-block;
            vertical-align: middle;
        }


        /* absolute + margin-auto */
        .layout.margin-auto {
            position: relative;
        }

        .layout.margin-auto article{
            position: absolute;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
            margin: auto;
        }

        /* line-height 佈局 */
        .layout.line-height {
            line-height: 150px;
        }

        .layout.line-height article {
            display: inline;
            margin:  auto;
        }

    </style>
</head>
<body>
    <section class="layout absolute">
        <article>
            <p>
                1.absolute+margin負值偏移<br>
                (父容器要設置寬高,需要知道子容器寬高)
            </p>
        </article>
    </section>

    <section class="layout transform">
        <article>
            <p>2.absolute+transform<br>
                (父容器要設置寬高)
            </p>
        </article>
    </section>

    <section class="layout flex">
        <article>
            <p>3.flex<br>(自適應)</p>
        </article>
    </section>

    <section class="layout table-cell">
        <div class="outer">
            <article>
                <p>
                    4.table-cell<br>(多1個容器,注意邊距重疊)
                </p>
            </article>
        </div>
    </section>

    <section class="layout grid">
        <article>
            <p>5.grid<br>(自適應,要考慮兼容性)</p>
        </article>
    </section>

    <section class="layout inline-block">
        <article>
            <p>6.inline-block<br>(自適應)</p>
        </article>
    </section>

    <section class="layout margin-auto">
        <article>
            <p>7.absolute + margin-auto<br>(內外容器都要設置寬高) </p>
        </article>
    </section>

    <section class="layout line-height">
        <article>
            <p>8.line-height(只適合單行inline,而且要知道父容器的高度)</p>
        </article>
    </section>

</body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章