网页元素居中的n种方法
导语:元素居中对齐在很多场景看上去很和谐很漂亮。除此之外,对于前端开发面试者的基础也是很好的一个考察点。下面跟着作者的思路,一起来看下吧。
场景分析
- 一个元素,它有可能有背景,那我要它的背景居中对齐
- 一个元素,它还有可能有个父级元素,那我要它居中于其父级元素
- 一个元素,它也有可能还带有一些子内容,我要让它的子内容居中
场景建模
根据场景分析提出的一些假设,我们试着去建立对应的模型,下面是分别根据上面的三个场景设计的相关模型。
- 搞父子元素居中对齐

- 搞元素背景居中对齐

- 搞元素内容居中对齐

场景实现
相关说明
为了统一,这里我们定义一个400*400px的带着黑色边框粉红色身体的类名为.box的父容器,它有可能会有一个200*200px的带着原谅色身体的类名为.box-son的子容器。这里为了效果能够直观且明显,笔者故意把背景图片的原始大小处理成小于宿主像素的大小。好吧,我们开始吧!
背景居中
我们做这样一件事,在一个div容器中,我们通过background-image属性引入一张背景,之后我们期望这张引入的背景呢,它能够水平垂直居中于宿主元素。
这里介绍两个属性background-repeat和background-position,如果你初中英语好的话,我想你也应该知道了,这里字面意思就是这个属性的意思。一个是设置背景图片怎么铺宿主元素(默认时铺满的)更美丽的,另一个是设置背景图片相对于宿主元素的的位置,你可以传像素、百分比、相关方向单词(top、bottom、left、right)给它。当其为百分比的时候,它的计算公式如下:
(container width - image width) * (position x%) = (x offset value)
(container height - image height) * (position y%) = (y offset value)
简言之,就是宿主元素的宽高减去图片宽高乘以相关百分比就是相对于宿主元素左上角那个原点的位置。
在背景图片不重复的情况下,你想让一张图片居中于宿主元素的方法,可以有background-postion: center center、background-postion: 50%, 50%,也可以简写成background-postion: center或者background-postion: 50%
所以,在楼上这些前提下,我们大致能够归出一个类,形如:
/** 这里以复杂写法的百分比为例, 分别代表距离宿主元素左上角的x和y轴的距离**/
.box-son {
background-repeat: no-repeat;
background-position: 50%, 50%;
}
文字内容居中
如果宿主元素的内容是文字之类的,我们期望它能够居中于宿主元素,这里用到两个属性,一个是text-align,一个是line-height。text-algin:center可以使内容水平居中于宿主元素,将line-height设置成宿主元素相同的高度,便可让宿主元素垂直居中。
相关例子链接:https://ataola.github.io/show/zj/center-middle.html#example11
子元素居中于父元素
相关说明
这里解释下,父相子绝,这个是我阉割了“父级元素相对定位,子级元素绝对定位”这句话浓缩后的叫法。后面出现这个概念我就不过多再进行重复介绍了。
父相子绝 + margin: auto
父元素相对定位子元素绝对定位后,设置其top、right、bottom、left都为0,之后我们将其的margin设置为auto。这样子的话,父级元素与子级元素他们之间空出来的部分都会被这个margin均匀撑开。
.box-position {
position: relative;
}
.box-example1 {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
}
相关例子链接:https://ataola.github.io/show/zj/center-middle.html#example1
父相子绝 + 负值margin
父元素相对定位子元素绝对定位后,子元素设置top: 50%; left:50%;,这里的百分比参考值是相对于父元素的宽高,参考的点是父元素的左上角和子元素的左上角,所以我们需要矫正一下,减去子元素宽高的一半。这件事可以让子元素的margin代劳。
.box-position {
position: relative;
}
.box-example2 {
position: absolute;
top: 50%;
left: 50%;
margin-left: -100px;
margin-top: -100px;
}
相关例子链接: https://ataola.github.io/show/zj/center-middle.html#example2
父相子绝 + 平移(translate)
在楼上那个例子的基础上,为了矫正子元素的偏移,我们其实还可以用css的平移属性。这个平移的百分比是相对于其本身的宽高的,所以是向反方向50%。
.box-position {
position: relative;
}
.box-example3 {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
相关例子链接:https://ataola.github.io/show/zj/center-middle.html#example3
父子double相(不推荐,做着玩玩的)
一个不成熟的做法哈,父子都是相对定位也还是可以勉强居中的,硬算嘛,这里没有太大价值就不展开了。
.box-position {
position: relative;
}
.box-example4 {
position: relative;
top: 90px;
left: 90px;
}
相关例子链接:https://ataola.github.io/show/zj/center-middle.html#example4
父子double相 + rem(不推荐,同楼上)
没有太大价值,略过。
相关例子链接: https://ataola.github.io/show/zj/center-middle.html#example5
父相子绝 + calc
calc这个css属性可以允许在声明css属性值时执行一些计算,回到我们之前的那个矫正偏移量的模型上,那么这里很容易想到子元素top、left属性设置成50%减去子元素一半的这样一个模型。
.box-position {
position: relative;
}
.box-example6 {
position: absolute;
top: calc(50% - 100px);
left: calc(50% - 100px);
}
相关例子链接:https://ataola.github.io/show/zj/center-middle.html#example6
新旧flex
flex布局,但凡一个正经点的初面都会遇到的,因为它好用也很常用,这里介绍两种,一种是新版的flex布局的写法,一种是旧版的flex布局的写法
flex布局你就把它看成是一条轴线,一条长得还挺夯实的轴线,在这条轴线上,我们想要放一个盒子,有很多种放法,具体的可以搜下阮一峰老师的教程这里不再赘述。一个化繁为简的想法哈,这个是跟琦瑞哥学到的,就是我们很多时候也不一定能记得住那么多属性,我们期望做这样一件事,就是把它化抽象为形象。我们可以用具体的方位去表达我们的想法,简言之就是封装成一个类库,然后用一些接地气的类名去控制flex布局。
有兴趣的童鞋可以看下我实现的一个低配版的css样式库:https://ataola.github.io/show/box/assets/taolaui/flex.css
新版flex的写法
在不改变轴方向的情况下,其父元素设置align-items: center;表示垂直居中,justify-content: center;表示水平居中。
父元素设置:
.flex {
display: flex;
}
.flex-middle {
align-items: center;
}
.flex-center {
justify-content: center;
}
相关例子链接:https://ataola.github.io/show/zj/center-middle.html#example7
旧版flex的写法
这里就是提及一下有这么种存在,读者用新版的写法就好。
.box-old {
display: -webkit-box;
-webkit-box-pack: center;
-webkit-box-align: center;
}
相关例子链接:https://ataola.github.io/show/zj/center-middle.html#example8
table布局
父元素设置display: table,子元素设置display:table-cell,在只有一个子元素的情况下它会尽可能撑满父元素,多个子元素的情况下水平均分。设置vertical-align: middle可以使得其内容垂直居中。
.box-table {
display: table;
}
.box-son-table {
display: table-cell;
vertical-align: middle;
}
相关例子链接:https://ataola.github.io/show/zj/center-middle.html#example9
grid布局
前面我们提到的flex布局时轴布局是一维的,这里的grid网格布局时二维的是平面的。将其父元素设置成display:grid,然后子元素设置align-self: center;表示垂直居中,justify-self: center;表示水平居中。
.box-grid {
display: grid;
}
.box-son-grid {
align-self: center;
justify-self: center;
}
相关例子链接:https://ataola.github.io/show/zj/center-middle.html#example10
最后
相关实现地址已开源:https://ataola.github.io/show/zj/center-middle.html,若有不足之处,供批评指正!
其他网页设计基础总结:https://ataola.github.io/show/
参考文献
https://developer.mozilla.org/zh-CN/docs/Web/CSS/background-position
https://developer.mozilla.org/zh-CN/docs/Web/CSS/background-repeat
https://developer.mozilla.org/zh-CN/docs/Web/CSS/calc

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
网页元素居中的n种方法的更多相关文章
- 使用CSS完成元素居中的七种方法
在网页布局中元素水平居中比元素垂直居中要简单不少,同时实现水平居中和垂直居中往往是最难的.现在是响应式设计的时代,我们很难确切的知道元素的准确高度和宽度,所以一些方案不大适用.据我所知, 在CSS中至 ...
- CSS绝对定位元素居中的几种方法
转载自-CSS居中绝对https://www.cnblogs.com/skura23/p/6530556.html 作者:PajamaCat 1,div宽度未知1 <body> <d ...
- 元素居中的两种方法,transform和margin
1.transform :translate(-50%,-50%) <!DOCTYPE html> <html lang="en"> <head> ...
- jquery阻止元素冒泡的两种方法
通常情况下,如果给父元素添加事件之后,子元素也会继承同样的事件,这个时候就要阻止子元素的这种行为,成为阻止冒泡,总结两种解决方法: html代码: <div id="parent&qu ...
- Knockout获取数组元素索引的2种方法,在MVC中实现
原文:Knockout获取数组元素索引的2种方法,在MVC中实现 在遍历数组.集合的时候,通常要获取元素的索引,本篇体验使用Knockout获取索引的2种方法. 假设有这样的一个模型: namespa ...
- after及before伪元素及解决父元素塌陷的几种方法
一.伪类和伪元素 CSS中伪类和伪元素有很多,也很好用!如果熟练使用的话可以解决很多问题 首先明白什么是伪类:伪类是基于当前元素的状态,而不是元素的id class等静态标志,它是动态变化的,它会在一 ...
- 【亲测显式等待】Selenium:元素等待的4种方法
Selenium:元素等待的4种方法 1.使用Thread.sleep(),这是最笨的方法,但有时候也能用到而且很实用. 2.隐式等待,隐性等待是指当要查找元素,而这个元素没有马上出现时,告诉We ...
- js中如何删除某个元素下面的所有子元素?(两种方法)
js中如何删除某个元素下面的所有子元素?(两种方法) 一.总结 方法一:通过元素的innerHTML属性 元素element.innerHTML=""; 方法二:通过元素的remo ...
- Qt中的布局浅析与弹簧的使用,以及Qt居中的两种方法
1. 布局 为什么要布局: 布局之后窗口的排列是有序的 布局之后窗口的大小发生变化, 控件的大小也会对应变化 如果不对控件布局, 窗口显示出来之后有些控件的看不到的 布局是可以嵌套使用 常用的布局方式 ...
随机推荐
- 浙工大新生赛莫队处理+区间DP+KMP+分析题
题目描述 读入一个长度为n的整数数列a1,a2,…,an,以及一个整数K. q组询问. 每组询问包含一个二元组(l, r), 其中1≤l≤r≤ n, 求所有满足以下条件的二元组(l2, r2)的数目: ...
- 【常用工具】vagrant的box哪里下?镜像在哪儿找?教你在vagrant官网下载各种最新.box资源
进入vagrant官网 : https://www.vagrantup.com/ 点击findbox[寻找box],进入有很多box的列表 : https://app.vagrantup.com/bo ...
- MySql 语言分类
(1)数据定义语言,即SQL DDL,用于定义SQL模式.基本表.视图.索引等结构.(2)数据操纵语言,即SQL DML.数据操纵分成数据查询和数据更新两类.(3)数据查询语言,即SQL DQL.(4 ...
- Docker虚拟机配置手札(centos)
一.Docker只支持CentOS7及以上系统,不支持6.x系统 二.yum安装Docker 1.安装相关环境和设置仓库 yum install -y yum-utils device-mapper- ...
- JSP+SSM+Mysql实现的图书馆预约占座管理系统
项目简介 项目来源于:https://gitee.com/gepanjiang/LibrarySeats 因原gitee仓库无数据库文件且存在水印,经过本人修改,现将该仓库重新上传至个人gitee仓库 ...
- 谈谈MySQL 索引
1.索引是什么 索引(Index)是帮助MySQL高效获取数据的数据结构.我们可以简单理解为:索引的目的在于提高查询效率. 2.原理 索引的数据结构是B+树,原理图如下 关于B+树的详细介绍,可以参见 ...
- Life In Changsha College- 第三次冲刺
第三次冲刺任务 设计登录注册功能. 用户故事 用户打开“生活在长大”的界面,选择登录 已注册过则输入用户名和密码直接登录 未注册用户则可选择注册功能,注册成功后登录 登录成功则弹出提示框 系统结构图环 ...
- ForkJoinPool分支合并框架-工作窃取
Fork/Join 框架 Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成 若干个小任务(拆到不可再拆时), 再将一个个的小任务运算的结果进行 join 汇总 For ...
- Spring Cloud Stream微服务消息框架
简介 随着近些年微服务在国内的盛行,消息驱动被提到的越来越多.主要原因是系统被拆分成多个模块后,一个业务往往需要在多个服务间相互调用,不管是采用HTTP还是RPC都是同步的,不可避免快等慢的情况发生, ...
- python3程序开发指南——第1章 笔记
python文件的扩展名为.py ,但是python GUI程序的扩展名为.pyw 在python中,注释以#开始,作用范围为该行 IDLE提供了三个关键功能:输入python表达式与代码,并在pyt ...