居中的实现方法

149 阅读3分钟

一、水平居中(要求:里外容器宽度都不一定,里面容器宽度自适应内容宽)

  • (1)table + margin

   在不受父级属性影响的情况下,只有当 child 不是行内元素的时候,margin 才能生效。
   若是 child 宽度已知情况下,可直接用 margin0 auto; 实现水平居中。
  • 优点:不需要设置父级样式;兼容性好,IE8 兼容,将该元素<div>改成<table>可兼容 IE6/7 table 2.jpeg

  • (2)margin + 父级:flex

  • 缺点:flex 兼容性不够好,IE6/7/8 不兼容 WechatIMG99 2 2.jpeg

  • (3)inline/inline-block + 父级:text-align

  • 优点:兼容性很好

  • 缺点:后代会继承 text-align:center 的属性 inline-block 2.jpeg

  • (4)absolute + transform

  • 优点:居中元素脱离文档流,不会对其他元素造成影响

  • 缺点:兼容性不够好,transform 是 CSS3 新增的,需要给不同浏览器加前缀 absolute 2.jpeg

  • (5)父级:flex + justify-content

  • 优点:只需设置父节点样式即可

  • 缺点:flex 兼容性不够好,IE6/7/8 不兼容 justuify-content 2.jpeg

有浮动(float)属性时的区别:

table + margininline/inline-block + 父级:text-align 被包裹的元素不能有浮动(float)属性。否则居中这个属性就会失效。

margin + 父级:flexabsolute + transform父级:flex + justify-content被包裹的元素有浮动(float)属性,居中也不会受到影响。

二、垂直居中(要求:里外容器高度都不一定,里面容器宽度自适应内容宽)

  • (1)父级:table-cell + verticall-align

    该方式是将元素转换成表格样式,再利用表格的样式来进行居中(推荐)
  • 优点:只需设置父节点样式;兼容性好,IE8 兼容,将结构改成表结构可兼容 IE6/7
    .parent{
        display: table-cell;
        vertical-align: middle;
    }
  • (2)absolute + transform

  • 优点:居中元素脱离文档流,不会对其他元素造成影响
  • 缺点:兼容性不够好,transform 是 CSS3 新增的,需要给不同浏览器加前缀
    .parent{
        position: relative;
    }
    .child{
        position: absolute;
        top: 50%;
        transform: translateY(-50%);
    }
  • (3)父级:flex + align-items

  • 优点:只需设置父节点样式即可
  • 缺点:flex 和 align-items 兼容性不够好,IE8+ 才兼容
    .parent{
        display: flex;
        align-items: center;
    }

!注 以上方法均不受浮动(float)属性影响。

三、水平垂直居中(前三要求:里外容器宽高都不一定,里容器自适应内容宽)

  • (1)inline/inline-block + 父级:text-align + table-cell + vertical-align

  • 优点:兼容性好,IE8 兼容;将结构改成表结构,用 inline + zoom:1 替代 inline-block 可兼容 IE6/7

WechatIMG103.jpeg

  • (2)absolute + transform

  • 优点:居中元素脱离文档流,不会对其他元素造成影响
  • 缺点:兼容性不够好,transform 是 CSS3 新增的,需要给不同浏览器加前缀

WechatIMG104.jpeg

  • (3)父级:flex + justify-content + align-items

  • 优点:只需设置父节点样式即可
  • 缺点:flex 和 align-items 兼容性不够好,IE8+ 才兼容

WechatIMG105.jpeg

  • (4)其他情况

  • 绝对定位 + margin:auto(要求:居中元素有一定的宽高,具体值可不知)

    父级:position:relative;
    子级:position:absolute,上下左右都是0margin:auto;
  • 绝对定位+margin负值(要求:知道居中元素具体的宽高值)

    父级:position:relative;
    子级:position:absolute;top50%left50%margin-top:-(高度/2)px;margin-left:-(宽度/2)px

!注 以上方法均不受浮动(float)属性影响。