Web前端入门第 42 问:聊聊 CSS 元素上下左右(水平+垂直)同时居中有几种方法
影响元素位置的 CSS 属性基本介绍完毕(参考前几篇文章),现思考一个最常见的需求:
一个子元素,要摆放在盒子的正中央,使用 CSS 布局手段,究竟有多少种实现方式?
上下左右(水平方向、垂直方向)要同时居中,在 Web 领域应该算是非常常见的开发需求了,最最常见的地方就是弹窗,比如:
文本居中
先看最简单的文本内容居中的实现方式,需注意此方法仅适用于单行文本,如果出现多行,嘿...会有惊喜!!
文本水平居中:text-align: center;
文本垂直居中:line-height: xxx;
此处的 xxx 用父元素高度即可。
<div class="box">
文本内容
</div>
<style>
.box {
border: 2px solid rgba(255, 71, 87,0.3);
margin: 20px 0;
width: 200px;
height: 160px;
/* 水平居中属性 */
text-align: center;
/* 垂直居中 */
line-height: 160px;
}
</style>
此方法当文本不足一行的时候是挺完美的,但如果出现多行,由于行高是容器高度,会造成多行文本内容溢出容器盒子!!!效果如下:
为什么会出现溢出容器的情况:line-height
设置的高度是每一行文本占用空间,第一行已经占用了整个容器,第二行没位置了当然就占用容器外的空间。
flex 居中
flex 弹性盒子居中应该算是目前使用最多的方法,主要利用弹性盒子的 justify-content
和 align-items
即可实现:
<div class="box">
文本内容
</div>
<div class="box">
文本内容 文本内容 文本内容 文本内容
</div>
<div class="box">
<span class="child">子元素文本内容</span>
</div>
<style>
.box {
border: 2px solid rgba(255, 71, 87,0.3);
margin: 20px 0;
width: 200px;
height: 160px;
display: flex;
/* 水平居中 */
justify-content: center;
/* 垂直居中 */
align-items: center;
}
.child {
border: 1px solid rgba(255, 71, 87,1);
}
</style>
效果:
flex 可以完美实现文本、子元素的居中,掌握此方法已经可以满足大部分的居中需求了。
grid 居中
有 flex 就绝对有 grid,这两兄弟在布局这方面基本上无法占有绝对优势,flex 能干的 grid 就绝对可以抢饭碗。
将 flex 的代码 display: flex;
换成 display: grid;
无需其他修改,就能使用 grid 网格居中:
<div class="box">
文本内容
</div>
<div class="box">
文本内容 文本内容 文本内容 文本内容
</div>
<div class="box">
<span class="child">子元素文本内容</span>
</div>
<style>
.box {
border: 2px solid rgba(255, 71, 87,0.3);
margin: 20px 0;
width: 200px;
height: 160px;
display: grid;
/* 水平居中 */
justify-content: center;
/* 垂直居中 */
align-items: center;
}
.child {
border: 1px solid rgba(255, 71, 87,1);
}
</style>
效果:
grid 居中布局,除了用 justify-content
和 align-items
外,还可以使用 justify-items
和 align-content
,肉眼还看不出啥区别!!他们区别在于有多个子元素的时候,来看看不同的属性值效果:
注意网格线可看出 items 和 content 的区别:items 属性是将子元素放在网格里面居中,而 content 属性是将网格放在容器中居中!!
居中时候用哪个属性想必应该明白了吧。
居中属性简写:
align-content 和 justify-content 可简写为 place-content
。
align-items 和 justify-items 可简写为 place-items
。
place-content: space-around space-evenly; /* 第一个值为 align-content 属性,第二个值为 justify-content */
place-items: start center; /* 第一个值为 align-items 属性,第二个值为 justify-items */
position 居中
此方法不再适合纯文本,毕竟居中属性是要盖在子元素上的,而文本没办法当做子元素设置布局样式!
position 居中需给父元素设置相对定位(relative),子元素使用绝对定位(absolute),然后通过 left
和 top
属性实现居中。
1、子元素大小固定
这种情况可直接使用 left
和 top
属性计算坐标实现居中:
left: (父元素宽度 - 子元素宽度) / 2;
top: (父元素高度 - 子元素高度) / 2;
示例:
<div class="box">
<span class="child">子元素文本内容</span>
</div>
<style>
.box {
border: 2px solid rgba(255, 71, 87,0.3);
margin: 20px 0;
width: 200px;
height: 160px;
position: relative;
}
.child {
border: 1px solid rgba(255, 71, 87,1);
width: 120px;
height: 40px;
position: absolute;
left: 40px; /* (200 - 120) / 2 */
top: 60px; /* (160 - 40) / 2 */
}
</style>
效果:
还可以使用 position + margin 属性实现居中,具体算法:
margin-left: -(子元素宽度 / 2);
margin-top: -(子元素高度 / 2);
示例:
<div class="box">
<span class="child">子元素文本内容 margin</span>
</div>
<style>
.box {
border: 2px solid rgba(255, 71, 87,0.3);
margin: 20px 0;
width: 200px;
height: 160px;
position: relative;
}
.child {
border: 1px solid rgba(255, 71, 87,1);
width: 120px;
height: 40px;
position: absolute;
left: 50%;
top: 50%;
margin-left: -60px; /* -120 / 2 */
margin-top: -20px; /* -40 / 2 */
}
</style>
效果
大小固定的子元素,还可以使用神奇的 margin: auto
实现居中,居中时需要给元素四个方向同时设置为 0
,实现方式:
<div class="box">
<span class="child">子元素文本内容 margin: auto</span>
</div>
<style>
.box {
border: 2px solid rgba(255, 71, 87,0.3);
margin: 20px 0;
width: 200px;
height: 160px;
position: relative;
}
.child {
border: 1px solid rgba(255, 71, 87,1);
width: 120px;
height: 40px;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
margin: auto;
}
</style>
效果
2、子元素大小不固定
子元素大小固定应用场景有限,毕竟不是每种布局都能确定元素大小,子元素的大小会受到子元素内容多少影响!
在使用 position 居中时,子元素大小不固定,则需要使用 transform
属性实现居中,具体用法:
<div class="box">
<span class="child">子元素文本内容 transform</span>
</div>
<style>
.box {
border: 2px solid rgba(255, 71, 87,0.3);
margin: 20px 0;
width: 200px;
height: 160px;
position: relative;
}
.child {
border: 1px solid rgba(255, 71, 87,1);
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
</style>
此处的 translate(-50%, -50%)
表示元素向左和向上同时位移自身大小一半。
效果:
table-cell 居中
使用 table-cell 居中,在目前的布局方案中,应该使用比较少了,毕竟弹性盒子当道,哪还有用 table 布局的道理!这种方法可以当作扩充知识面。
使用方法:
<div class="box">
<span class="child">子元素文本内容 margin: auto</span>
</div>
<style>
.box {
border: 2px solid rgba(255, 71, 87,0.3);
margin: 20px 0;
width: 200px;
height: 160px;
display: table-cell;
text-align: center; /* 水平 */
vertical-align: middle; /* 垂直 */
}
.child {
display: inline-block;
border: 1px solid rgba(255, 71, 87,1);
width: 120px;
}
</style>
需注意:使用 table-cell 时,元素的 margin
值将失效,而且 flex 子元素设置 display: table-cell;
也不生效!
效果:
before 伪元素居中
神奇的 before 伪元素(也可以使用 after),创建一个 height: 100%;
的锚点,再给子元素设置 inline-block
,再使用 vertical-align: middle;
可实现居中。
此方法应该算是很偏门了,可作为扩充知识面了解。使用方法:
<div class="box">
<span class="child">子元素文本内容</span>
</div>
<style>
.box {
border: 2px solid rgba(255, 71, 87,0.3);
margin: 20px 0;
width: 200px;
height: 160px;
text-align: center; /* 水平居中 */
font-size: 0; /* 处理 inline-block 元素之间的空白 */
}
.box::before {
content: '';
height: 100%;
display: inline-block;
vertical-align: middle;
}
.child {
display: inline-block;
border: 1px solid rgba(255, 71, 87,1);
width: 120px;
vertical-align: middle; /* 垂直方向相对 before 对象居中 */
font-size: 16px;
}
</style>
效果:
总结
以上的这些居中方案,应该包含了目前所有的居中方法。
当然未来 CSS 规范会更新,也许会有更好的居中方法加入,需不断地学习才不会掉队。
flex 居中应该是最常用的方案,但如果面试时问到有几种居中方法,您只回答了 flex、grid 和 position,面试官可能会觉得您掌握的 CSS 还是不够全面。
Web前端入门第 42 问:聊聊 CSS 元素上下左右(水平+垂直)同时居中有几种方法的更多相关文章
- CSS实现水平垂直同时居中的5种思路
× 目录 [1]水平对齐+行高 [2]水平+垂直对齐 [3]margin+垂直对齐[4]absolute[5]flex 前面的话 水平居中和垂直居中已经单独介绍过,本文将介绍水平垂直同时居中的5种思路 ...
- CSS实现水平垂直同时居中的6种思路
前面的话 水平居中和垂直居中已经单独介绍过,本文将介绍水平垂直同时居中的6种思路 水平对齐+行高 [思路一]text-align + line-height实现单行文本水平垂直居中 <style ...
- web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史
秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...
- Android零基础入门第42节:自定义BaseAdapter
原文:Android零基础入门第42节:自定义BaseAdapter 在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作.也就是说,这个ListView不再只是展示数据,也不 ...
- Android零基础入门第17节:Android开发第一个控件,TextView属性和方法大全
原文:Android零基础入门第17节:Android开发第一个控件,TextView属性和方法大全 前面简单学习了一些Android UI的一些基础知识,那么接下来我们一起来详细学习Android的 ...
- 解读CSS布局之-水平垂直居
对一个元素水平垂直居中,在我们的工作中是会经常遇到的,也是CSS布局中很重要的一部分,本文就来讲讲CSS水平垂直居中的一些方法.由于我们大搜车的日常工作中已经不再需要理会低版本IE,所以本文所贴出的方 ...
- css3-7 如何让页面元素水平垂直都居中(元素定位要用css定位属性)
css3-7 如何让页面元素水平垂直都居中(元素定位要用css定位属性) 一.总结 一句话总结:元素定位要用css定位属性,而且一般脱离文档流更加好操作.先设置为绝对定位,上左都50%,然后margi ...
- web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】
http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,J ...
- web前端基础知识-(二)CSS基本操作
1. 概述 css是英文Cascading Style Sheets的缩写,称为层叠样式表,用于对页面进行美化. 存在方式有三种:元素内联.页面嵌入和外部引入,比较三种方式的优缺点. 语法:style ...
- 给 Web 前端开发人员推荐20款 CSS 编辑器
CSS 和 HTML,JavaScript 是网页的基础,作为前端开发人员,对这三者都要很熟悉.特别是未来流行全栈开发的时代,每项技术都是你知识结构中必要的一个节点. 在开发中,选择好工具是非常重要的 ...
随机推荐
- initDB.sh初始化磁盘脚本centos7
新加磁盘初始化脚本 跳转:优化(2022-4-14) vim initDB.sh #!/bin/bash # auther by wangxp EXCLUDE_LIST='2,11' EXCLUDE_ ...
- FLink自定义Sink,生产的数据导出到Redis
一.pom文件 https://www.cnblogs.com/robots2/p/16048648.html 二.自定义sink 2.1 自定义sink package net.xdclass.cl ...
- Hetao P1391 操作序列 题解 [ 绿 ] [ 二维线性 dp ]
操作序列:简单的二维 dp. 观察 我们每次操作可以让 \(x\) 变为 \(2x-1\),或者当 \(x\) 为奇数时让 \(x\) 变为 \(\frac{x+1}{2}\). 显然,执行第一种操作 ...
- Salt key 系统的接口
官方文档:https://docs.saltstack.com/en/3000/ref/wheel/all/salt.wheel.key.html Wheel 系统包装了Salt key 系统,以编程 ...
- 本地AI搭建
搭建本地博客AI 目录 搭建本地博客AI 环境 下载ollama 选择模型 选择embedding模型 查看性能测试 选择合适的嵌入模型(Embedder) 估算内存 选择模型 量化类型介绍 Q5_0 ...
- 割以咏志:Stoer–Wagner 算法求解全局最小割
全局最小割问题(Global Min-Cut Problem)是图论中的一个经典问题,旨在通过切割图中的边来划分图的顶点集合.具体来说,给定一个加权无向图 $ G = (V, E) $,图中每条边 $ ...
- [HNOI2009] 图的同构计数
因为要求本质不同的图,容易想到群论. 为了方便处理,将边是否存在转化为边的黑白染色问题(实际上就是 \([SHOI2006]\) 有色图 的弱化版本,最终公式也差不多). 根据 \(Burnside\ ...
- SSM - 狂神的项目示例
出于对狂神的崇拜,总结SSM项目. 基本介绍 项目分层 基本介绍 项目名称:ssmbuild 介绍:通过书籍管理系统实现一个简单的SSM项目,可以作为其他Java Web项目的借鉴. 主要功能模块:查 ...
- RedHat8密码复杂度策略配置
1.密码复杂度策略概念 在Linux系统中,确保用户密码的复杂度是提高系统安全性的重要措施之一.通过配置密码策略,可以强制用户使用强密码,从而降低被破解的风险.本文将详细介绍如何在 Linux 系统中 ...
- Twain Capabilities属性
Asynchronous Device Events 异步设备事件 CAP_DEVICEEVENT MSG_SET选择应用程序希望Twain源报告的事件; MSG_RESET返回Twain源的首选设置 ...