资讯专栏INFORMATION COLUMN

CSS水平或垂直居中技巧

CastlePeaK / 2426人阅读

摘要:适用情景单对象水平居中原理将子元素设置块级表格,再设置水平居中。结语有些是水平居中,有些是垂直居中,将它们某两个合在一起就能实现水平和垂直均居中。

前言

css水平和垂直居中是一个亘古不变的话题,它常常出现在优美的网页上以及各大前端面试当中。说来惭愧,在两年前面试的时候,我完全不知道如何做到水平和垂直均居中的方法,那场面别提有多尴尬了(ps:特想找个地洞钻进去)。。。时隔两年,对于这个问题算是有一些了解了,现做个小小的整理,也算是对自己学习的总结。

注:文中例子没写明html代码时,使用的是下面结构:

</>复制代码

  1. 超级好用超级放心
  2. 在线压缩图片
  3. 压缩完可以

只是类名会有所不同。

1、Line-height

适用情景:单行文字(垂直居中)
原理:将单行文字的行高设定后,文字会位于行高的垂直中间位置。
html:

</>复制代码

  1. Lorem ipsam.

css:

</>复制代码

  1. .example{
  2. width: 400px;
  3. background: #afddf3;
  4. line-height: 50px;
  5. }

效果:

2、Line-height + inline-block

原理:将多个元素或多行元素当成一个行元素来看待,所以我们必须要将这些数据多包一层,并将其设定为inline-block。由于inline-block在不同浏览器会有空隙产生,因此设定父元素font-size:0来消除,从而达到完美的垂直居中。
css:

</>复制代码

  1. .example2{
  2. width: 400px;
  3. border: 1px solid #dcdcdc;
  4. line-height: 100px;
  5. font-size: 0;
  6. }
  7. .example2 .con {
  8. display: inline-block;
  9. line-height: 2;
  10. vertical-align: middle;
  11. width: 300px;
  12. font-size: 15px;
  13. background: #afddf3;
  14. }

3、:before + inline-block

原理::before 伪类元素搭配 inline-block 属性的写法应该是很传统的垂直居中的技巧了,此方式的好处在于子元素居中可以不需要特别设定高度,我们将利用:before伪类元素设定为100%高的inline-block,再搭配上将需要居中的子元素同样设置成inline-block性质后,就能使用vertical-align: middle来达到垂直居中的目的了,此方式在以往其实是个非常棒的垂直居中解决方案,唯独需要特别处理掉inline-block元素之间的4-5px空间这个小缺陷,不用怕,设置父元素font-size: 0,子元素font-size: 15px即可。
css:

</>复制代码

  1. .example3 {
  2. margin-top: 10px;
  3. width: 400px;
  4. height: 150px;
  5. font-size: 0;
  6. border: 1px solid #dcdcdc;
  7. }
  8. .example3::before {
  9. content: "";
  10. display: inline-block;
  11. height: 100%;
  12. width: 0;
  13. vertical-align: middle;
  14. }
  15. .example .con {
  16. width: 300px;
  17. font-size: 15px;
  18. background: #afddf3;
  19. display: inline-block;
  20. vertical-align: middle;
  21. }

4、table + margin

适用情景:单对象(水平居中)
原理:将子元素设置块级表格,再设置水平居中。
css:

</>复制代码

  1. .example4 {
  2. margin-top: 10px;
  3. width: 400px;
  4. height: 150px;
  5. font-size: 0;
  6. border: 1px solid #dcdcdc;
  7. }
  8. .example .con {
  9. display: table;
  10. margin: 0 auto;
  11. width: 300px;
  12. font-size: 15px;
  13. background: #afddf3;
  14. }

5、table + table-cell + vertical-align: middle

适用情景:多对象(垂直居中)
html:

</>复制代码

  1. 超级好用超级放心
  2. 在线压缩图片
  3. 压缩完可以打包下载哦
  4. CSS-TRICKS

css:

</>复制代码

  1. .example5 {
  2. display: table;
  3. margin-top: 10px;
  4. width: 400px;
  5. height: 150px;
  6. font-size: 0;
  7. border: 1px solid #dcdcdc;
  8. }
  9. .example .con {
  10. display: table-cell;
  11. vertical-align: middle;
  12. width: 300px;
  13. font-size: 15px;
  14. background: #afddf3;
  15. }

6、absolute + margin 负值

原理:设置绝对定位,top: 50%;后,再设置高度一半的负值实现。说来说去,这就是一道简单的数学题而已。
缺陷:需要设置居中元素的高度。
优势:无浏览器兼容性问题
css:

</>复制代码

  1. .example6 {
  2. position: relative;
  3. margin-top: 10px;
  4. width: 400px;
  5. height: 150px;
  6. font-size: 0;
  7. border: 1px solid #dcdcdc;
  8. }
  9. .example6 .con {
  10. position: absolute;
  11. top: 50%;
  12. height: 80px;
  13. margin-top: -40px;
  14. width: 300px;
  15. font-size: 15px;
  16. background: #afddf3;
  17. }

7、absolute + margin auto

原理:当元素设置为绝对定位后,假设它是抓不到整体可运用的空间范围,所以margin: auto会失效,但当你设置了top:0;bottom:0;时,绝对定位元素就抓到了可运用的空间了,这时你的margin:auto就生效了。
缺陷:定位元素必须有固定的宽高(百分比也算)。
css:

</>复制代码

  1. .example7 {
  2. position: relative;
  3. margin-top: 10px;
  4. width: 400px;
  5. height: 150px;
  6. font-size: 0;
  7. border: 1px solid #dcdcdc;
  8. }
  9. .example7 .con {
  10. position: absolute;
  11. top: 0;
  12. bottom: 0;
  13. left: 0;
  14. right: 0;
  15. margin: auto;
  16. height: 80px;
  17. width: 300px;
  18. font-size: 15px;
  19. background: #afddf3;
  20. }

8、absolute + translate

原理:利用绝对定位时的top 与right设置元素的上方跟左方各为50%,再利用transform: translate(-50%, -50%);位移居中元素自身宽与高的50%就能达成居中的目的了。
缺陷:translate是css3属性,低版本浏览器不支持。
显著优势:无需固定定位元素的宽高。
css:

</>复制代码

  1. .example8 {
  2. position: relative;
  3. margin-top: 10px;
  4. width: 400px;
  5. height: 150px;
  6. font-size: 0;
  7. border: 1px solid #dcdcdc;
  8. }
  9. .example8 .con {
  10. position: absolute;
  11. left: 50%;
  12. top: 50%;
  13. transform: translate(-50%, -50%);
  14. font-size: 15px;
  15. background: #afddf3;
  16. }

9、Flex + align-items

适用情景:多行文字(垂直居中)
原理:弹性布局,align-items定义flex子项在flex容器的当前行的侧轴(纵轴)方向上的对齐方式,参考CSS-TRICKS
缺陷:css3属性,低版本浏览器不支持。
显著优势:无需固定定位元素的宽高,代码干净利索。
css:

</>复制代码

  1. .example9 {
  2. display: flex;
  3. align-items: center;
  4. margin-top: 10px;
  5. width: 400px;
  6. height: 150px;
  7. font-size: 0;
  8. border: 1px solid #dcdcdc;
  9. }
  10. .example9 .con {
  11. font-size: 15px;
  12. background: #afddf3;
  13. }

10、Flex + justify-content

适用情景:多行文字(水平居中)
原理:弹性布局,justify-content设置或检索弹性盒子元素在主轴(横轴)方向上的对齐方式,参考CSS-TRICKS
缺陷:css3属性,低版本浏览器不支持。
显著优势:无需固定定位元素的宽高,代码干净利索。
css:

</>复制代码

  1. .example10 {
  2. display: flex;
  3. justify-content: center;
  4. margin-top: 10px;
  5. width: 400px;
  6. height: 150px;
  7. font-size: 0;
  8. border: 1px solid #dcdcdc;
  9. }
  10. .example .con {
  11. height: 80px;
  12. font-size: 15px;
  13. background: #afddf3;
  14. }

11、Flex + :before + flex-grow

适用情景:多行文字(垂直居中)
原理:弹性布局,Flex-direction:column;将项目垂直显示,正如一个列一样。flex-grow: [number];规定项目将相对于其他灵活的项目进行扩展的量,参考CSS-TRICKS
缺陷:css3属性,低版本浏览器不支持,并且难度稍大,一般不会想到这种方法。
显著优势:无需固定定位元素的宽高
css:

</>复制代码

  1. .example11 {
  2. display: flex;
  3. flex-direction: column;
  4. margin-top: 10px;
  5. width: 400px;
  6. height: 150px;
  7. font-size: 0;
  8. border: 1px solid #dcdcdc;
  9. }
  10. .example11:before {
  11. content: "";
  12. flex-grow: .5;
  13. }
  14. .example11 .con {
  15. font-size: 15px;
  16. background: #afddf3;
  17. }

12、Flex + margin

缺陷:css3属性,低版本浏览器不支持。
css:

</>复制代码

  1. .example12 {
  2. display: flex;
  3. margin-top: 10px;
  4. width: 400px;
  5. height: 150px;
  6. font-size: 0;
  7. border: 1px solid #dcdcdc;
  8. }
  9. .example12 .con {
  10. margin: auto;
  11. width: 300px;
  12. font-size: 15px;
  13. background: #afddf3;
  14. }

13、Flex + align-self

原理:align-self定义flex子项多带带在侧轴(纵轴)方向上的对齐方式。
缺陷:css3属性,低版本浏览器不支持。
css:

</>复制代码

  1. .example13 {
  2. display: flex;
  3. justify-content: center;
  4. margin-top: 10px;
  5. width: 400px;
  6. height: 150px;
  7. font-size: 0;
  8. border: 1px solid #dcdcdc;
  9. }
  10. .example13 .con {
  11. align-self: center;
  12. width: 300px;
  13. font-size: 15px;
  14. background: #afddf3;
  15. }

14、Flex + align-content

原理:align-content在弹性容器内的各项没有占用交叉轴上所有可用的空间时对齐容器内的各项(垂直),弹性项目有多项此属性才会发挥作用。
缺陷:css3属性,低版本浏览器不支持。
css:

</>复制代码

  1. .example14 {
  2. display: flex;
  3. align-content: center;
  4. flex-wrap: wrap;
  5. margin-top: 10px;
  6. width: 400px;
  7. height: 150px;
  8. font-size: 0;
  9. border: 1px solid #dcdcdc;
  10. }
  11. .example14:before, .example14:after {
  12. content: "";
  13. display: block;
  14. width: 100%;
  15. }
  16. .example14 .con {
  17. height: 80px;
  18. width: 300px;
  19. font-size: 15px;
  20. background: #afddf3;
  21. }

下面是一个比较常见的例子,往往是不想让图片发生变形并且不管尺寸大小均会显示在容器的正中央(以下例子应用的是第8条)。
html:

</>复制代码

css:

</>复制代码

  1. .imgbox-box {
  2. display: flex;
  3. justify-content: center;
  4. margin-bottom: 40px;
  5. }
  6. .imgbox {
  7. width: 200px;
  8. height: 200px;
  9. position: relative;
  10. background: #ebf8ed;
  11. overflow: hidden;
  12. }
  13. .imgbox img {
  14. position: absolute;
  15. left: 50%;
  16. top: 50%;
  17. transform: translate(-50%, -50%);
  18. max-width: 100%;
  19. max-height: 100%;
  20. }

结语:有些是水平居中,有些是垂直居中,将它们某两个合在一起就能实现水平和垂直均居中。不过我相信肯定不止这些方法,还有其他的值得我们去探究。若文中有错,请大家指正,谢谢!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/114954.html

相关文章

  • css居中的一点总结

    摘要:为了更好的加深对居中的理解,搜集和阅读相关资料,发现不错的文章将其整理出来。 在学习前端的过程中,发现元素和文本的水平居中和垂直居中,是经常会出现的问题,在实际工作中也会经常碰到。居中的技巧有很多,但在编写代码的过程中,发现有时候技巧管用,有时候不管用,于是就将每个知道的方案都试一遍,找到合适的。这种情况究其原因是对居中的认识不够深入,只是停留在实现需求的水平上。为了更好的加深对居中的...

    BenCHou 评论0 收藏0
  • CSS实现元素垂直水平居中-非固定宽度

    这里不讨论行内元素的居中!! 盒子垂直居中+水平居中的需求时经常遇到的,看到的较多实现逻辑是固定content-box的宽度,通过让margin-left和margin-top等于宽或高的负一半来实现,抑或不固定宽度,通过JS调整margin-left和margin-top的值,这俩种方法原理都一样。 而我接下来要讲的是content不定宽的情况下,CSS的源生实现。 利用table实现垂直水平...

    shusen 评论0 收藏0
  • CSS实现元素垂直水平居中-非固定宽度

    这里不讨论行内元素的居中!! 盒子垂直居中+水平居中的需求时经常遇到的,看到的较多实现逻辑是固定content-box的宽度,通过让margin-left和margin-top等于宽或高的负一半来实现,抑或不固定宽度,通过JS调整margin-left和margin-top的值,这俩种方法原理都一样。 而我接下来要讲的是content不定宽的情况下,CSS的源生实现。 利用table实现垂直水平...

    zhonghanwen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<