前言

居中是页面开发中经常遇到的问题。

使用合适的、简单的、兼容性好的居中方式是我们页面仔在整个工作生涯中都要面对的问题。

text-align:center

来看这个例子,一张图片和文字进行居中。如下图所示:

 

img与文字内容都是行内元素,因此直接使用text-align就行了。代码如下图所示:

 

在最外层的div中使用text-align:center的问题是,会导致所有的子元素都会继承这个属性。如果还有一段文字用作介绍该图片的作用时,这段文字也会被居中。

而我们希望这段文字是左对齐的,就不得不单独设置其text-align:left属性,以覆盖其父元素的属性。并且如果还有更多的子元素也需要这样做,覆盖属性本身就是下策,因此要采用其他方法。

margin: 0 auto

由于显示的图片可能是变化的,宽高是不定的,但显示区域是固定的,所以一般会显式地给图片设置一个宽高。这个时候知道宽度就可以设置margin:0 auto方法,左右的margin设置为auto,浏览器就会自动设置左右的margin值为容器剩余宽度的一半。

 

使用margin: 0 auto可以说是最常用的左右居中的方法,不仅适用于块级元素也适用于行内元素。很多网页的布局都是使用margin: 0 auto,例如淘宝pc端,如下图所示:

 

display: table-cell

第一个垂直居中的方法是借助table-cell属性,效果图如下:

 

table-cell的一个好处就是它可以兼容到IE8

table-cell属性的缺点:

  • 容器的margin属性失效,因为margin不适用于表格布局。所以使用margin: 0 auto属性是不能使container左右居中的。解决的方法也很简单:只需要在container外层再多套一个div容器,然后设置这个外层容器的margin: 0 auto即可。
  • 设置了table-cell的元素再设置宽高为百分比是不起作用的。常见的场景是要将宽度属性设置为外层容器宽度的100%,解决方法是将container的宽度设置成一个很大的值,例如5000px,这样就达到100%的目的。
  • 如果container需要设置positionabsolutetable-cell属性就会失效。因为设置position: absolute就会把元素display强制设置为block类型。解决办法还是在外层套一层div容器,将position: absolute属性作用于这个容器上。

position: relative

上面所说table-cell的第三缺点的解决方法有一个副作用,就是设置内层containerheightwidth为百分比时会失效。由于这个原因,导致有一种情况不能使用display:table-cell垂直居中。

就是需要在页面弹出一个框,这个框的位置需要在当前屏幕中左右上下居中。这时候通常需要将这个框的position设置为absolute,这个时候table-cell就不能发挥作用了。

解决办法是使用relative定位,设置top为50%,将弹窗的起始位置放到页面中间,再设置margin-top为元素高度的负一半,这样使得弹窗在页面中间位置再往上移到一半自身的高度,这就正好在中间了,左右居中也可类似处理。

使用此方法的缺点是需要知道具体的高度,无法根据内容长短自适应。

tranform: translate

tranform方法,将margin-top一个具体像素的负值改成transform: translate(0, -50%),因为translate里面的百分比是根据元素本身的高度计算的,所以就可以达到自适应的效果。

这个办法十分方便,而且加上-webkit-前缀,可以兼容到IE9。

margin-top:-100pxtransform:translate(0, -50%)都有一个缺点,就是如果设置left为50%是借助positionabsolute的话,可能会导致换行

 

本来应该是一行显式的p元素却换行了,这是因为在一个relative元素里面的absolute定位的子元素会通过行内元素换行的方式,尽可能不超过容器的边界。由于设置left为50%,导致p元素超了边界,所以就换行了,即使再设置translate:-50%也已经晚了。

flex布局

flex布局十分容器和方便,只需在副容器设置3个属性就行了

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

flex的缺点是不支持IE

vertical-aligin:middle

vertical-aligin:middle主要是运用在行内元素中的。

如果不做任何处理,那么默认的垂直居中是以baseline为基准的。

为了能够垂直居中,需要改变居中方式。

要每个元素都要设置。

如果container的高度比图片要高,就会有留空的效果,如下:

 

为了让中间的内容能够在container里上下居中,可以设置文字的line-heightcontainer的高度,这样文字就上下居中了。由于图片与文字是垂直居中的,所以图片在container里也是上下居中了。

 

也就是说,如果需要垂直居中一个div里的比div高度小的图片,可以添加一个元素,让它的line-height等于div的高度。下面使用伪元素::before来添加line-height

 

或者使用display: inline-block属性,加上height: 100%。这个方法兼容性更好。

 

absolute与margin:auto

使用absolute定位与margin:auto方法也可以实现居中。

 

如果图片比container大,这种方法就不适用了。因为有一个种比较常见的场景:图片有一边和contianer一样大,另一边按图片的比例缩放,图片居中显示,超出的截断。这种情况下,只需把left/right/top/bottom设置为一个很大的负值即可。

 

总结

以上就是css中常用的居中方法,如果有更好的方法评论区留言讨论。

作者: zhangwinwin
链接:CSS居中的常用方式以及优缺点
来源:github

CSS居中的常用方式以及优缺点的更多相关文章

  1. 我已经说了5种css居中实现的方式了,面试官竟然说还不够?

    这是一篇关于居中对齐方式的总结 开篇之前,先问一下大家都知道几种居中的实现方式? 面试时答出来两三个就不错了,就怕面试官还让你继续说.今天就来总结一下这些居中的方式 使用flex布局设置居中. 使用f ...

  2. 常用的CSS居中方式

    1.水平居中margin 0 auto;(浮动元素除外) 这个属性在网页制作的过程中是经常被用到的,一般情况下页面的版心你就可以看到它. <style> .father { width: ...

  3. 各种div+css居中方式调整(转载)

    盘点8种CSS实现垂直居中水平居中的绝对定位居中技术 分类: 前端开发2013-09-11 21:06 24959人阅读 评论(3) 收藏 举报 绝对居中垂直居中水平居中CSS居中代码   目录(?) ...

  4. 【基础】这15种CSS居中的方式,你都用过哪几种?

    简言 CSS居中是前端工程师经常要面对的问题,也是基本技能之一.今天有时间把CSS居中的方案汇编整理了一下,目前包括水平居中,垂直居中及水平垂直居中方案共15种.如有漏掉的,还会陆续的补充进来,算做是 ...

  5. 第212天:15种CSS居中的方式,最全了

    CSS居中是前端工程师经常要面对的问题,也是基本技能之一.今天有时间把CSS居中的方案整理了一下,目前包括水平居中,垂直居中及水平垂直居中方案共15种.如有漏掉的,还会陆续的补充进来,算做是一个备忘录 ...

  6. CSS属性(常用的属性)

    CSS属性(常用的属性)http://www.w3school.com.cn/cssref/index.asp 一:文本与字体属性 1.字体属性 (1):font-size:字体的大小(例如:font ...

  7. css居中小结

    从css入门就开始接触,无所不在的,一直备受争议的居中问题. css居中分为水平居中和垂直居中,水平居中方式也较为常见和统一,垂直居中的方法就千奇百怪了. 博客原文地址:Claiyre的个人博客 ht ...

  8. vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结

    vue—你必须知道的   目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...

  9. css两种常用的不定宽高的水平垂直居中方法,记住它,不再为样式发愁

    css 几种常用的简单容易记住的水平垂直居中方法 前言 正文 第一种方法 第二种方法 结束语 前言 我们在设计网页时,会大量的运用到水平垂直居中,如果知道元素的宽高,那水平垂直居中是很简单的,无非是用 ...

随机推荐

  1. [Machine Learning] 多变量线性回归(Linear Regression with Multiple Variable)-特征缩放-正规方程

    我们从上一篇博客中知道了关于单变量线性回归的相关问题,例如:什么是回归,什么是代价函数,什么是梯度下降法. 本节我们讲一下多变量线性回归.依然拿房价来举例,现在我们对房价模型增加更多的特征,例如房间数 ...

  2. editmd输出到前端显示

    官方案例:html-preview-markdown-to-html.html 输出后台数据显示在前端,格式化内容<!DOCTYPE html> <html lang="z ...

  3. Java学习日报7.23

    import java.util.Scanner;public class LandP {public static void main(String args[]) { System.out.pri ...

  4. UDP 通讯方式

    1.创建套接字:2.绑定端口:3.收发数据: 收到的数据中包含发送方的端口信息4.关闭套接字:

  5. java线程调度

    JAVA线程调度分抢占式和协调式 协调式的线程切换由线程本身自己控制,好处是实现简单,当前线程只有当事情做完才会通知系统进行切换并没有同步开销,坏处是容易引发事故,假如阻塞的线程由于代码BUG没有通知 ...

  6. java中装箱,拆箱

    (1)包装类 java中不能定义基本数据类型的对象,但是提供了基本数据类型的包装类来解决这一问题,例如int类型的包装类Integer, 包装类的常用方法有Integer.ParseInt()方法类将 ...

  7. 一张图看懂sql的各种join

    下图展示了 LEFT JOIN.RIGHT JOIN.INNER JOIN.OUTER JOIN 相关的 7 种用法.

  8. 天梯赛练习 L3-006 迎风一刀斩 (30分) 几何关系

    题目分析: 对于给出的两个多边形是否可以组成一个矩形,这里我们分以下几种情况讨论 1.首先对于给出的两个多边形只有3-3,3-4,3-5,4-4才有可能组成一个矩形,并且两个多边形只可能是旋转90,1 ...

  9. [工作札记]02: .Net Winform控件TreeView最简递归绑定方法

    前言:Treeview控件是我们在WinForm.WebForm开发中经常使用的控件,需要从数据库动态加载数据,然后递归绑定每一个节点:同样,递归的思路在其他程序中也经常运用,包括.Net MVC等. ...

  10. 断言封装整合到requests封装中应用(纠错False,Result循环,tag测试)

    检查json_key_value: 检查: requests.py # -*- coding: utf-8 -*-#@File :demo_04.py#@Auth : wwd#@Time : 2020 ...