How to center in CSS

一步步拆解你的需求,是水平居中还是垂直居中?还是水平垂直居中?父容器是inline还是block,高度知不知,宽度造不造?一个子元素还是多个子元素?一行还是多行?文字?图片?

理论知识

属性:text-align

用法:text-align CSS 属性定义行内内容(例如文字)如何相对它的块父元素对齐。text-align并不控制块级元素自己的对齐,只控制它的行内内容的对齐→→(demo展示text-align对行内元素与块元素的区别

除了默认的行内元素(没有标签包围的文本默认是匿名行内元素)外,我们可以通过设置元素的display:inline、 inline-block、 inline-table、 inline-flex等一切inline 或 inline-*elements值。

属性:verical-align

用法:CSS 的属性 vertical-align 用来指定行内元素(inline)或表格单元格(table-cell)元素的垂直对齐方式。

1.水平居中

content: inline or inline-* elements (like text or links)

.container {
text-align: center;
}

content: block-level element

多个块级元素一行展示

.container {
text-align: center;
}
.content-center {
display: inline-block;
}

可实现多个块级多行展示(前提:知道width值px/em/%)

.content-center {
width: 400px;
margin: 0 auto;
}

2.垂直居中

content: for inline or inline-* elements (like text or links)

  • 单行

    • padding-top = padding-bottom
    • line-height = height(需要注意的是,必须先设置字号font-size,再设置line-height,否则文本居中。因为字号的改变,会使行高发生改变。)
  • 多行
    • padding-top = padding-bottom

    • Table cell(前提:知道container高度height值px/em/%)

        .container {
      display: table;
      }
      .content-center {
      display: table-cell;
      verical-align: middle;
      }
    • flexbox(前提:知道container高度height值px/em/%)

        .container {
      display: flex;
      justify-content: center;
      flex-direction: column;
      height: 400px;
      }
    • 给父容器加一个伪类元素作为子内容的vertical:middle校准内容。

        .container {
      position: relative;
      }
      .container::before {
      content: " ";
      display: inline-block;
      height: 100%;
      width: 1%;
      vertical-align: middle;
      }
      .container content-center {
      display: inline-block;
      vertical-align: middle;
      }

content: block-level element

  • known: 元素的高度height

    • 使用定位position与负外边距margin

        .container {
      position: relative;
      }
      .content-center {
      position: absolute;
      top: 50%;
      height: 100px;
      margin-top: -50px; /* account for padding and border if not using box-sizing: border-box; */
      }
  • unknown: 元素的高度height

    • 使用定位positiontransform

        .container {
      position: relative;
      }
      .content-center {
      position: absolute;
      top: 50%;
      transform: translateY(-50%);
      }
  • flexbox(高度知不知都行,缺点是IE11+才能用)

      .container {
    display: flex;
    flex-direction: column;
    justify-content: center;
    }

3.水平垂直居中

  • known: 元素的高度height值和width

    • 使用定位position与负外边距margin

      .container {

      position: relative;

      }

        .content-center {
      position: absolute;
      top: 50%;
      left: 50%; width: 300px;
      height: 100px;
      padding: 20px;
      margin: -70px 0 0 -170px; /* 此处元素的高度、宽度要加上padding的大小 */
      }
  • unknown: 元素的高度heightwidth

      .container {
    position: relative;
    }
    .content-center {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    }
  • flexbox

      .parent {
    display: flex;
    justify-content: center;
    align-items: center;
    }

浏览器兼容性

主要考虑IE浏览器,其他现代浏览器支持较好(chrome、firefox)

Method IE
text-align IE3+
vertical-aglign IE4+
line-height IE4+
table-cell IE8+
position IE9+
flexbox IE11

如何选择最优方案

  • 如果不用考虑兼容性的话,使用flexbox代码最简洁
  • 考虑兼容性的话,margin,padding,text-align,vertical-align,line-height > table-cell > positon > flexbox,再结合具体需求选择最合适的方案,代码越清晰简洁越好。
  • 通过上面的方案可知,这些属性很多时候都是配合着使用的,从而得到兼容性更好的方法,具体可见于 HOW TO CENTER IN CSS

参考资料

CSS如何居中元素的更多相关文章

  1. CSS行内元素和块级元素的居中

    一.水平居中 行内元素和块级元素不同,对于行内元素,只需在父元素中设置text-align=center即可; 对于块级元素有以下几种居中方式: 1.将元素放置在table中,再将table的marg ...

  2. css使子元素在父元素居中的各种方法

    html结构: <div class="parent"> <div class="child"></div> </di ...

  3. 浅谈css的伪元素::after和::before

    css中的::after和::before已经被大量地使用在我们日常开发中了,使用他们可以使我们的文档结构更加简洁.但是很多人对::after和::before仍不是特别了解,究竟他们是做什么的?如何 ...

  4. 【转】css布局居中和CSS内容居中区别和对应DIV CSS代码

    原文地址:http://www.divcss5.com/jiqiao/j771.shtml css布局居中和CSS内容居中区别和对应DIV CSS代码教程与图文代码案例篇 对于新手来说DIV CSS布 ...

  5. 使用Flexbox实现CSS竖向居中

    竖向居中需要一个父元素和一个子元素合作完成. <div class="flexbox-container"> <div>Blah blah</div& ...

  6. css常用居中

    对一个已知大小的元素上下左右居中(已知大小了,直接margin也就行了): css如下:.parent{height:100px;width:100px;background:grey;positio ...

  7. css设置居中的方案总结

    回想一下,自己平时项目里遇到的比较多的就是css如何让元素居中显示,其实差不多每种情况都遇到过,所采用的方法也都各有利弊,下面对这些方法来做个概括,对其中的坑点,也会一一指出来,希望能给遇到问题的同学 ...

  8. CSS布局---居中方法

    在web页面布局中居中是我们常遇到的情况,而居中分为水平居中与垂直居中 文本的居中 CSS中对文本的居中做的非常友好,我们是需要text-align, line-height 两个属性就可以控制文本的 ...

  9. amazeui学习笔记--css(HTML元素5)--表格Table

    amazeui学习笔记--css(HTML元素5)--表格Table 一.总结 1.基本样式:am-table:直接模块名  <table class="am-table"& ...

随机推荐

  1. 最优的cuda线程配置

    1 每个SM上面失少要有192个激活线程,寄存器写后读的数据依赖才能被掩盖   2 将 寄存器 的bank冲突降到最低,应尽量使每个block含有的线程数是64的倍数   3 block的数量应设置得 ...

  2. StampedLock原理

    原文链接:https://blog.csdn.net/sunhaoning/article/details/68924625 StamppedLock是Java 8中引入的一种新的锁机制.读写锁虽然分 ...

  3. 插头DP学习笔记

    插头DP(我也不知道该怎么定义...)是一种类似于洛谷题目([模板]插头DP)的题目 题目特征为: 在棋盘上 某一维的数据范围很小 完全铺满 计数问题 直接看题吧. [模板]插头DP 给出n*m的方格 ...

  4. [比赛|考试]nowcoder NOIPpj组第二场

    nowcoder NOIPpj组第二场 370pts/400pts(100,100,100,70) rank3 给自己的反思:前3题都A了,T4O(N^2)不会就是不会(没准是我懒得推了),DP了70 ...

  5. linux中tomcat内存溢出

    刚开始测试服务器与线上后台都不能上传10分钟以上的视频,后来只要是视频就不能上传,进入服务器查日志得到如下错误: Caused by: java.lang.OutOfMemoryError: Java ...

  6. Winscp使用密钥登录

    Winscp使用密钥登录 背景:通常我们使用winscp通过密码认证去连接服务器进行文件的ftp操作,但是为了安全,我们服务器上经常会禁止使用密码连接,而改用密钥认证.而且服务器上经常会禁止root用 ...

  7. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_new新建对象

    CLR使用 new 操作符来创建新对象,例如:Employee e=new Employee("Param1");  以下是 new  操作符所做的事情. 它计算类型及其所有基类型 ...

  8. Java 初始化和清理

    初始化和清理是影响代码安全的两个重要因素. 一.初始化 1. 方法重载 构造器与类名相同,成为强制重载方法名的原因之一.重载规则:每个重载的方法必须拥有独一无二的参数类型列表.不能根据返回值来区分重载 ...

  9. Python IDLE快捷键汇总

    Python IDLE快捷键汇总 在Options→configure IDLE→keys,查看现存的快捷键,也可以配置选择快捷 编辑状态时: Ctrl+Shift+space(默认与输入法冲突,修改 ...

  10. Autel MaxiSys MS908CV Diagnostic System for Commercial Vehicles

    As a new member of Autel’s MaxiSys family, the MaxiSys CV is built on the powerful MaxiSys 908 platf ...