笔记:前端开发中的「居中」整理


前言

标题中说的「居中」在这里其实更加特指指垂直居中。因为一般情况下,前端开发中的水平居中还是挺简单的,比如 text-align: center 或者 margin: 0 auto 两者基本就可以解决大部分水平居中的需求。

但垂直居中可能就会出现在许多不同需求场景中,也因运而生了很多不同的解决方案,网络上其实已经有了很多这方面的文章和讨论,不过还是想自己来梳理一遍。

例子中使用到的 HTML 结构

例子中使用到的 HTML 结构尽可能保持了一致,如下。非常简单,外层一个 div.box 作为容器,居中内部作为目标的 div.content

基于相对、绝对定位的方案(一)

最基本的居中定位方案采用的方式最基础,也为各前端所熟知:外层容器做相对定位,内部做绝对定位。

但其实这一方案也有两种写法,第一种是比较常规,但要求内部外部都有一个固定的宽和高,通过 left: 50%top: 50% 配合 margin-left: -width/2margin-top: -height/2 来得到居中的结果。

或者可以通过 CSS3 中的 calc() 的方法使用 top: calc(50% - height/2)left: (50% - width/2) 来简化样式表的书写。

See the Pen 前端开发中的「居中」: 1. 绝对定位2 by Lien (@movii) on CodePen.

基于相对、绝对定位的方案(二)

第二种相对、绝对定位的方法其实有点 heck 的感觉,通过设置目标元素的 leftrightbottomtop 值为 0 配合 margin: auto (注意不是 margin: 0 auto)来实现。

发现这种方法应该是很早以前一个排列不规则大小图片到规定尺寸的容器内的需求,要求中不能改变 HTML 结构将 <img> 标签在容器内进行居中,应该是在 Stack Overflow 上找到的(这会儿一下子没找到)。

See the Pen 前端开发中的「居中」: 1. 绝对定位 by Lien (@movii) on CodePen.

利用相对、绝对方法的前两个方案,后者对比前者,只是免去了计算宽高的步骤,看上去似乎没有了宽和高的限制,但两者都有个潜在的前提:居中内容的宽和高不能大于容器的宽和高,否则,前者在容器设置了 overflow: hidden 的时候,超过外部容器的区域就不会显示,后者则直接错位。

基于相对、绝对定位的方案(三)

第三种相对、绝对定位的方案是通过在内容中使用 transform: translate(-50%, -50%) 来代替 margin-leftmargin-top 来实现元素居中的目的。相比月第一个方案可以免去了针对内容宽和高的计算,相对于第二个方案又不会那么的 heck 感,毕竟 transform: translate 也是正经的元素二维变换样式规则。

See the Pen 前端开发中的「居中」: 2. CSS 的 transform by Lien (@movii) on CodePen.

## 居于视窗单位 vw、wh 的居中 视窗窗口的单位 `vw` 和 `vh` 分别是指 viewport width 和 viewport height。这个方案和之前不同的是,它的使用场景没有上面的多,只在需求是明确要求模态框是基于视窗(viewport)的居中才可以。

See the Pen 前端开发中的「居中」: 4. vw 和 vh by Lien (@movii) on CodePen.

👆 CodePen 中的例子是将外层容器直接设置了基于 viewport 的居中,对宽和高相对之前的也缩小了一些。在不同的大小的设备上打开,可以看到,都是基于视窗窗体本身居中的。

通过 flex 布局实现的居中

基于 CSS3 的 Flexbox 布局如今的浏览器支持已经挺成熟了,特别是移动端上,至少配合足够的 vendor perfix 大部分时候都可以无碍使用。而具体到元素的居中效果实现,Flexbox 可以提供的最简单的方案也短得令人发指:容器和内容都只需要一句样式规则就可以实现,作为容器的 display: flex 和作为内容的 margin: auto

See the Pen 前端开发中的「居中」: 3. 通过 flex 布局 by Lien (@movii) on CodePen.

感谢阅读

你们好, 2018 年初把小站从 Jekyll 迁移到 Hugo 的过程中,删除了评论区放的 Disqus 插件,考虑有二:首先无论评论、还是对笔记内容的进一步讨论,读者们更喜欢通过邮件、或者 Twitter 私信的方式来沟通;其次一年多以来 Disqus 后台能看到几乎都是垃圾留言(spam),所以这里直接贴一下邮件、以及 Twitter 账户 地址。

技术发展迭代很快,所以这些笔记内容也有类似新闻的时效性,不免有过时、或者错误的地方,欢迎指正 ^_^。

BEST
Lien(A.K.A 胡椒)
本站总访问量 本站总访客量 本文总阅读量