zoukankan      html  css  js  c++  java
  • CSS实现水平居中的5种思路

    前面的话

      水平居中是经常遇到的问题。看似方法较多,条条大路通罗马但系统梳理下,其实都围绕着几个思路展开。本文将介绍关于水平居中的5种思路

    text-align

    思路一:在父元素中设置text-align:center实现行内元素水平居中

      将子元素的display设置为inline-block,使子元素变成行内元素

      [注意]若要兼容IE7-浏览器,使用display:inline;zoom:1;来达到inline-block的效果

    <style>
    .parent{text-align: center;}    
    .child{display: inline-block;}
    </style>
    <div class="parent" style="background-color: gray;">
      <div class="child" style="background-color: lightblue;">DEMO</div>
    </div>

       这种方法的不足之处在于,子元素的text-align继承了父元素的center,文字也居中显示,所以需要在子元素中设置text-align:left

    margin

    【思路二】:在本身元素设置margin: 0 auto实现块级元素水平居中

    【1】将子元素的display为table,使子元素成为块级元素,同时table还具有包裹性,宽度由内容撑开

      [注意]若要兼容IE7-浏览器,可把child的结构换成<table class="child">DEMO</table>

    <style>
    .child{
        display: table;
        margin: 0 auto;
    }
    </style>
    <div class="parent" style="background-color: gray;">
      <div class="child" style="background-color: lightblue;">DEMO</div>
    </div>

      该方案的优点在于,只设置父级元素即可实现居中效果

    【2】若子元素定宽,则可以使用绝对定位的盒模型属性,实现居中效果;若不设置宽度时,子元素被拉伸

    <style>
    .parent{
      position: relative;
    }
    .child{
     position: absolute;
     left: 0;
     right: 0;
     margin: 0 auto;
     width: 50px;
    }
    </style>
    <div class="parent" style="background-color: gray;height: 20px;">
        <div class="child" style="background-color: lightblue;">DEMO</div>   
    </div>

    absolute

    【思路三】: 通过绝对定位的偏移属性实现水平居中

    【1】配合translate()位移函数

      translate函数的百分比是相对于自身宽度的,所以left:50%配合translateX(-50%)可实现居中效果

      [注意]IE9-浏览器不支持

    <style>
    .parent{
      position: relative;
    }
    .child{
      position: absolute;
      left: 50%;
      transform:translateX(-50%);
    }
    </style>
    <div class="parent" style="background-color: gray;height: 20px;">
      <div class="child" style="background-color: lightblue;">DEMO</div>
    </div>

    【2】配合relative

      relative数值型的偏移属性是相对于自身的,但百分比却是相对于包含块的。因为子元素已经被设置为absolute,所以若使用relative,则需要增加一层<div>结构,使其宽度与子元素宽度相同

      [注意]该方法全兼容,但是增加了html结构

    <style>
    .parent{
      position: relative;
    }
    .childWrap{
      position: absolute;
      left: 50%;
    }
    .child{
      position: relative;
      left: -50%;
    }
    </style>
    <div class="parent" style="background-color: gray;height: 20px;">
      <div class="childWrap">
        <div class="child" style="background-color: lightblue;">DEMO</div> 
      </div>   
    </div>

    【3】配合负margin

      margin的百分比是相对于包含块的,所以需要增加一层<div>结构。由于宽度width的默认值是auto,当设置负margin时,width也会随着变大。所以此时需要定宽处理

      [注意]虽然全兼容,但需要增加页面结构及定宽处理,所以限制了应用场景

    <style>
    .parent{
      position: relative;
    }
    .childWrap{
      position: absolute;
      left: 50%;
    }
    .child{
      width:50px;
      margin-left:-50%;
    }
    </style>
    <div class="parent" style="background-color: gray;height: 20px;">
      <div class="childWrap">
        <div class="child" style="background-color: lightblue;">DEMO</div> 
      </div>   
    </div>

    flex

    【思路四】: 使用弹性盒模型flex实现水平居中

      [注意]IE9-浏览器不支持

    【1】在伸缩容器上设置主轴对齐方式justify-content:center

    <style>
    .parent{
      display: flex;
      justify-content: center;
    }
    </style>
    <div class="parent" style="background-color: gray;">
        <div class="child" style="background-color: lightblue;">DEMO</div>   
    </div>

    【2】在伸缩项目上设置margin: 0 auto

    <style>
    .parent{display: flex;}
    .child{margin: 0 auto;}
    </style>
    <div class="parent" style="background-color: gray;">
        <div class="child" style="background-color: lightblue;">DEMO</div>   
    </div>

    grid

    【思路五】: 使用栅格布局grid实现水平居中

      [注意]IE10-浏览器不支持

    【1】在网格容器上设置justify-items或justify-content

    <style>
    .parent{
      display:grid;
      justify-items:center;
    /*justify-content:center;*/
    } </style>
    <div class="parent" style="background-color: gray;">
      <div class="child" style="background-color: lightblue;">DEMO</div>
    </div>

    【2】在网格项目中设置justify-self或者margin: 0 auto

    <style>
    .parent{
      display:grid;
    } 
    .child{
      justify-self:center;
    /*margin: 0 auto;*/
    } </style>
    <div class="parent" style="background-color: gray;">
      <div class="child" style="background-color: lightblue;">DEMO</div>
    </div>

  • 相关阅读:
    C#中 @ 的用法
    ASP.NET页面间传值
    ASP.NET中常用的文件上传下载方法
    把图片转换为字符
    把图片转换为字符
    JavaScript 时间延迟
    Using WSDLs in UCM 11g like you did in 10g
    The Definitive Guide to Stellent Content Server Development
    解决RedHat AS5 RPM安装包依赖问题
    在64位Windows 7上安装Oracle UCM 10gR3
  • 原文地址:https://www.cnblogs.com/xiaohuochai/p/5437503.html
Copyright © 2011-2022 走看看