水平垂直居中深入挖掘

简介: 水平垂直居中深入挖掘

在上篇文章 -- 一行 CSS 代码的魅力 的最后,提到了两种快速实现水平垂直居中的方式。


当然,CSS 中实现水平垂直居中的方式很多。别看到水平垂直居中就准备右上角 x 掉,本文的重点不是罗列有多少种方式实现水平垂直居中方式,而是探讨一下常见的几种水平垂直居中的方式的利弊。


嗯哼?也就是:


  • 那么多种水平垂直居中的方式,如果真的在业务中需要使用了,你脑海里第一时间会想到哪个?
  • 不同的水平垂直居中方式,它们肯定存在差异,那么最显著的不同是什么?
  • 有没有所谓的最完美的水平垂直居中?


本文将讨论 4 种水平垂直居中的方式,分别是,并且每个起个名字方面下面看图:


  1. absolute: position: absolute 配合 top:50%;left:50%;transform:translate(-50%, -50%)
  2. autobot: display:flex 配合 margin:auto
  3. flex: display:flex 配合 align-items:center、justify-content:center
  4. grid: display:grid 配合 place-content:center;

 

居中单个元素


对于如下简单的结构:

<div class="g-container">
    <div class="sub"></div>
</div>

居中单个元素而言,上述 4 种方法都很好,没有问题。


608782-20210108103358500-893977478.png


CodePen Demo -- Centering in CSS

 

居中多个元素



对于如下稍微复杂点的结构:

<div class="g-container">
    <div class="sub">1</div>
    <div class="sub">123</div>
    <div class="sub">123456</div>
</div>

那么如果是居中多个子元素,上述 4 种方法,就能体现出明显的不一样。稍微也修改一下子元素,不给它设定宽度,通过 padding 撑开即可:


.sub {
    border: 1px solid deeppink;
    padding: 10px;
    border-radius: 5px;
}


看看结果如何:


608782-20210108103412707-1759218070.png


CodePen Demo -- Centering in CSS 2


简单分析分析:


  1. absolute 的方法明显有问题,由于用的绝对定位,其实 3 个子元素都叠在了一起
  2. flex 和 grid 的方法,如果不手动添加边距(margin 或者 gap),会贴在一起
  3. 不限制方向的话,flex 默认是水平排列,grid 是竖直排列
  4. 非常重要的一点,grid 布局下的子元素的宽度,所有子元素的宽度会被强行拉伸至最宽的一个子元素的内容的宽度(也就是拉伸至网格宽度)


对于多个子元素,absolute 方法明显不适用, 接下来主要看剩余 3 个方法在一些细节上的差异。

 

控制间距


如果我们希望控制每个元素之间的间距呢?我们给 autobot、flex、grid 的容器各自加上 gap: 5px,再看看:


.g-container{
    gap: 5px;
}

608782-20210108103427050-1032396118.png



CodePen Demo -- Centering in CSS 3

  1. margin: auto 由于需要均分剩余空间,所以表现并不好,无法按照我们设想的 5px 宽度进行间隔

 

让元素多到溢出


OK,接下来,我们让内容再多一点,多到溢出整个容器,看看有什么不一样。

608782-20210108103449877-1639197913.png

再来一张竖直方向排列的:

608782-20210108103503163-444342900.png


CodePen Demo -- Centering in CSS 4


可以看到:


  1. 非常重要的一点,由于没有了剩余空间,margin: auto 已经无法做到均匀分配,水平垂直居中了,而是一边贴着容器边,另外一边溢出
  2. flex 和 grid 都做到了即便超出容器空间,依然是水平垂直居中的

 

总结一下



经由上述几个 DEMO 可以看出来,在目前比较常用的水平垂直居中方案当中。flex 方案应该是目前而言最优的选择,它能够在各种环境下都保持内部元素的水平垂直居中并且不改变子元素的某些特征:


  1. 便捷的水平垂直居中单个元素
  2. 便捷的水平垂直居中多个元素,无论是横向、竖向,亦或内容超出
  3. 非常方便控制子元素之间的间距
  4. 不会改变子元素的宽度

当然,美中不足的是,可能相对而言,要敲多几个字符。😳

而 margin: auto 和 grid 则或多或少有一些小问题。absolute 无法应付多个元素。

 

最后



本文知识点比较细,也表明 CSS 虽然简单,但是不代表它容易。我们日常工作中用到的很多属性其实还有很多细节可以挖掘深入。

目录
相关文章
|
26天前
|
前端开发 JavaScript 开发者
告别居中难题!揭秘未知宽高元素如何轻松实现水平和垂直居中的神奇技巧!
【8月更文挑战第23天】本文介绍了在Web前端开发中实现未知宽度和高度元素的水平垂直居中的四种方法:使用Flexbox布局、Grid布局、绝对定位结合transform属性以及利用负margin。每种方法均提供了示例代码,帮助开发者根据不同场景和兼容性需求选择最合适的解决方案,从而轻松应对各种居中布局需求。
26 1
|
23天前
|
前端开发 UED 开发者
布局革命:块级与行内元素的史诗级碰撞,重塑你的网页设计观
【8月更文挑战第26天】在Web前端开发中,理解和运用HTML的块级与行内元素至关重要。块级元素(如 `&lt;div&gt;` 和 `&lt;p&gt;`)独占一行,可用于构建页面结构;行内元素(如 `&lt;a&gt;` 和 `&lt;span&gt;`)则与其他元素同排显示,适合文本修饰。通过CSS调整`display`属性,开发者能灵活转换元素类型,实现复杂多变的设计布局,同时确保页面在不同设备上的良好适应性和用户体验。
25 1
|
3月前
|
前端开发 UED 开发者
必知的技术知识:Flex布局常用属性详解
必知的技术知识:Flex布局常用属性详解
|
4月前
|
人工智能 前端开发 开发者
Baidu千帆大模型赋能——CSS控制DIV垂直水平居中——送给大一的孩子们,学会用AI思维来帮助你解决问题
Baidu千帆大模型赋能——CSS控制DIV垂直水平居中——送给大一的孩子们,学会用AI思维来帮助你解决问题
60 1
|
4月前
|
前端开发 JavaScript API
CSS基础框盒模型:打造炙手可热的网页布局!
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。 ———————————————— 版权声明:本文为博主原创文
圣杯布局和双飞翼布局
圣杯布局和双飞翼布局
|
4月前
|
前端开发 容器
Flex布局的三个属性要深刻理解!
Flex布局的三个属性要深刻理解!
|
Web App开发 前端开发 算法
探索现代CSS布局技术:Flexbox和Grid
探索现代CSS布局技术:Flexbox和Grid
探索现代CSS布局技术:Flexbox和Grid
|
11月前
|
前端开发 Cloud Native Go
《深入Flexbox和Grid:现代CSS布局的秘密武器》
《深入Flexbox和Grid:现代CSS布局的秘密武器》
55 0
|
前端开发
前端经典圣杯布局和双飞翼布局
圣杯布局和双飞翼布局解决的问题是一样的 就是两边顶宽,中间自适应的三栏布局,中间栏要在放在文档流前面以优先渲染
93 0