div 中元素居中的N种常用方法

本文主要记录几种常用的div盒子水平垂直都居中的方法。本文主要参考了该篇博文并实践加以记录说明以加深理解记忆 css之div盒子居中常用方法大全

本文例子使用的 html body结构下的div 盒子模型如下:

html 复制代码
<body>
	<div class="container">
		<div class="box"></div>
	</div>
</body>

例子盒子居中效果都如下图:

注:当把div 盒子模型中子div换成其他块级元素,如<p>或<h1>~<h6>时,以下方法仍然奏效。但当把子div换成行内元素,如<span>时,第6,第7种方法将失效。

1、弹性布局 设置容器项目在横轴和纵轴上都居中对齐

html 复制代码
<style>
	.container{
		height: 300px;
		width: 300px;
		border: 1px solid black;
		background-color: aliceblue;
		display: flex;
		justify-content: center;
		align-items: center;
	}
		
	.box{
		width: 120px;
		height: 120px;
		background: #55a9ff;
	}
</style>

2、弹性布局 设置容器项目 margin:auto

该方法可以不设置容器项目横轴和纵轴的对齐方式,直接设置margin:auto即可2、弹性布局 设置容器项目 margin:auto

html 复制代码
<style>
	.container{
		height: 300px;
		width: 300px;
		border: 1px solid black;
		background-color: aliceblue;
		display: flex;
	}
		
	.box{
		width: 120px;
		height: 120px;
		margin: auto;
		background: #55a9ff;
	}
</style>

3、绝对定位法

父div要使用其中一种定位方式:relative / absolute / sticky / fixed**,**子div使用绝对定位,并使它的 top、left、right、bottom 都为0且margin:auto 即可

html 复制代码
<style>
	.container{
		height: 300px;
		width: 300px;
		border: 1px solid black;
		background-color: aliceblue;
		position: relative;
	}
			
	.box{
		width: 120px;
		height: 120px;
		position: absolute;
		background: #55a9ff;
		top: 0;
		left: 0;
		right: 0;
		bottom: 0;
		margin: auto;
	}
</style>
  • 绝对定位法还可以只设置top、bottom为0,实现只垂直居中
html 复制代码
<style>
	.container{
		height: 300px;
		width: 300px;
		border: 1px solid black;
		background-color: aliceblue;
		position: relative;
	}
			
	.box{
		width: 100px;
		height: 100px;
		position: absolute;
		background: #55a9ff;
		top: 0;
		bottom: 0;
		margin: auto;
	}
</style>
  • 同理可以只设置left、right为0,实现只水平居中

4、transform居中法

使用 transform 可以不用管子div自身的宽高,但要设置父子div的position属性,可都设置成 relative / absolute,此方法IE9 以下不支持

html 复制代码
<style>
	.container{
		height: 300px;
		width: 300px;
		border: 1px solid black;
		background-color: aliceblue;
		position: relative;
	}
			
	.box{
		width: 120px;
		height: 120px;
		position: absolute;
		background: #55a9ff;
		top: 50%;
		left: 50%;
		transform: translate(-50%,-50%);
	}	
</style>

5、负margin居中

利用子div 负的margin来进行居中,此方法要知道子div固定的宽高,且margin-top、margin-left 要是子div 自身宽高负的一半值

html 复制代码
<style>
	.container{
		height: 300px;
		width: 300px;
		border: 1px solid black;
		background-color: aliceblue;
		position: relative;
	}
			
	.box{
		width: 120px;
		height: 120px;
		position: absolute;
		background: #55a9ff;
		top: 50%;
		left: 50%;
		margin-top: -60px;
		margin-left: -60px;
	}	
    /* 如果box的宽高都是100px,那margin-top和margin-left要是-50px */
</style>

6、margin固定宽高居中

此方法要知道父子div的宽高,且要算出子div的margin 的高度和宽度 恰好在父div居中

该方法把子div换成行内元素,如<span>时将会失效

html 复制代码
<style>
	.container{
		height: 300px;
		width: 300px;
		border: 1px solid black;
		background-color: aliceblue;
	}
			
	.box{
		width: 120px;
		height: 120px;
		background: #55a9ff;
		margin: 90px 90px;
	}
	/* 如果 box 的宽高都是 100px,那么 margin: 100px 100px; */
</style>

7、table-cell居中

此方法是将父div转换成表格单元格显示,然后使用垂直居中并且子div左右margin auto实现,该方法把子div换成行内元素,如<span>时将会失效

html 复制代码
<style>
	.container{
		height: 300px;
		width: 300px;
		border: 1px solid black;
		background-color: aliceblue;
		display: table-cell;
		vertical-align: middle;
	}
			
	.box{
		width: 120px;
		height: 120px;
		background: #55a9ff;
		margin: 0 auto;				/* 不能省 */
	}
</style>

8、不确定宽高居中( 绝对定位百分数**)**

此方法不设置子div的宽高,其宽高根据设置占用父div的比例来算,left和right的百分数一样就可以实现水平居中,top和bottom的百分数一样就可以实现垂直居中。其中子div要设置成绝对定位,父div 要设置成 relative / absolute / fixed / sticky

html 复制代码
<style>
	.container{
		height: 300px;
		width: 300px;
		border: 1px solid black;
		background-color: aliceblue;
		position: relative;
	}
			
	.box{
		position: absolute;
		background: #55a9ff;
		top: 25%;
		left: 25%;
		right: 25%;
		bottom: 25%;
		margin: auto;
	}
    /* top / left / right / bottom 设置的比例不一样,box 的宽高将会随之变大或变小*/
</style>

以上方法如有错误请各位不吝指教,如以后有别的方法将会往下继续添加,各位有其他方法可留言告知。

相关推荐
kyriewen2 小时前
我排查了一个React内存泄漏——罪魁祸首是这3个被忽略的清理函数
前端·javascript·面试
IT_陈寒2 小时前
我又被JavaScript的隐式类型转换坑了
前端·人工智能·后端
其美杰布-富贵-李3 小时前
03 ref、reactive 与 computed 响应式数据
前端·javascript·vue.js
OpenTiny社区3 小时前
GenUI SDK v1.3.0 发布|多框架兼容,一键换物料,渲染器 & 演练场全面增强!
前端·ai编程
用户938515635073 小时前
useRef + Web Worker 实战:React 如何优雅地拥抱多线程
前端·javascript·react.js
他们叫我秃子3 小时前
前端开发转 Go 全栈(五):终于遇到熟人了,Go 的闭包和高阶函数原来这么像 JavaScript
前端·后端·go
用户61595868000223 小时前
从 0 写一个迷你 wujie:用原生 Web API 实现微前端
前端
妙码生花3 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(五十七):AI时代对组件封装的新理解、agInput 统一入口,动态表单预备
前端·后端·go
fairyly3 小时前
接手新项目不用硬啃源码,我的 TRAE Work 快速上手实战工作流
前端·ai编程·trae
搬砖记录员3 小时前
用 PyAutoGUI 手搓录屏"老板键":从原理到四套可跑源码,附工程化落地思考
前端