CSS 居中那些事
一、父子元素高度确定
简单粗暴, 直接通过设置合适的
padding
或margin
实现居中
<style>.p {padding: 20px 0;background: rgba(255, 0, 0, 0.1);}.c {width: 40px;height: 20px;background: blue;}
</style>
<div class="p"><div class="c"></div>
</div>
二、Flex(弹性) 布局
<style>.p {height: 100px;background: rgba(255, 0, 0, 0.1);display: flex;align-items: center; /* 垂直居中 */justify-content: center; /* 水平居中 */}.c {width: 40px;height: 20px;background: blue;}
</style>
<div class="p"><div class="c"></div>
</div>
三、Grid(网格) 布局
<style>.p {height: 100px;background: rgba(255, 0, 0, 0.1);display: grid;place-items: center; /* 直接水平垂直居中 */}.c {width: 40px;height: 20px;background: blue;}
</style>
<div class="p"><div class="c"></div>
</div>
四、子元素通过「绝对定位 + 偏移」实现居中
4.1 子元素高度不固定, 使用 transform
进行偏移
依据: 绝对定位百分比, 是相对于
父元素
进行计算、transform
百分比, 则是相对于自身
进行计算
<style>.p {height: 100px;background: rgba(255, 0, 0, 0.1);position: relative;}.c {width: 40px;background: blue;top: 50%;position: absolute;transform: translateY(-50%);}
</style>
<div class="p"><div class="c">1111<br>2222</div>
</div>
4.2 子元素高度固定, 直接使用 margin
进行偏移
依据: 绝对定位百分比, 是相对于
父元素
进行计算
<style>.p {height: 100px;background: rgba(255, 0, 0, 0.1);position: relative;}.c {width: 40px;height: 40px;background: blue;position: absolute;top: 50%; /* 该百分比, 相对于父元素高度进行计算 */margin-top: -20px; /* 手动计算, 等于高度的一半 */}
</style>
<div class="p"><div class="c"></div>
</div>
4.3 「补充」margin
、padding
百分比计算方式
margin
、padding
上下两个方向的百分比, 相对于父元素自适应
的一边进行计算, 默认情况下是根据父元素宽度
进行计算的 (因为块元素默认宽度自适应
), 之所以要相对于自适应一边进行计算, 是为了避免在未设置宽高情况下, 子元素设置了边距, 引起容器尺寸的变化, 从而造成百分比重新计算, 引起死循环
<style>.p {width: 200px;height: 400px;background: rgba(255, 0, 0, 0.1);}.c {margin: 10%; /* 上下左右边距都, 相对于父元素宽度: 20px */padding: 10%; /* 上下左右边距都, 相对于父元素宽度: 20px */display: inline-block;background: blue;}
</style>
<div class="p"><div class="c"></div>
</div>
通过
writing-mode: vertical-lr
可元素内容 (文字、子元素) 从上到下垂直流动, 元素将从宽度自适应
改为高度自适应
, 这时其子元素paddin
margin
百分比将相对于父元素的高度
进行计算
<style>.p {writing-mode: vertical-lr; /* 元素内容从上到下垂直流动、高度将自适应*/width: 200px;height: 400px;background: rgba(255, 0, 0, 0.1);}.c {margin: 10%; /* 上下左右边距都, 相对于父元素宽度: 40px */padding: 10%; /* 上下左右边距都, 相对于父元素宽度: 40px */display: inline-block;background: blue;}
</style>
<div class="p"><div class="c"></div>
</div>
五、自适应特性 + margin: auto
众所周知
margin: auto
, 可以很容器实现元素的水平居中, 而之所以能够实现水平居中, 是因为父元素宽度自适应
, 只有在自适应情况下margin: auto
才能正确计算出合适的值
<style>.p {width: 200px;height: 200px;background: rgba(255, 0, 0, 0.1);}.c {width: 40px;height: 40px;background: blue;margin: auto;}
</style>
<div class="p"><div class="c"></div>
</div>
从上面例子可以看出,
margin: auto
之所以能实现水平居中, 就是因为父元素宽度自适应
了, 那么很自然就可以想到, 如果可以使父元素高度自适应
, 那么我们就可以借用margin: auto
实现元素的垂直居中
5.1 通过 writing-mode
使元素高度自适应
writing-mode
属性定义了元素内容(文本、子元素)水平或垂直的排列方式, 其中vertical-lr
属性值可使内容由水平流动
改为垂直流动
, 同时元素的宽度自适应
也将变为高度自适应
<style>.p {width: 200px;height: 200px;background: rgba(255, 0, 0, 0.1);writing-mode: vertical-lr; /* 将子元素流向从水平改为垂直, 同时宽度自适应也将变为高度自适应 */}.c {width: 40px;height: 40px;background: blue;margin: auto;}
</style>
<div class="p"><div class="c"></div>
</div>
5.2 为子元素设置绝对定位, 使得在对应方向上具有自适应特性
<style>.p {width: 200px;height: 200px;background: rgba(255, 0, 0, 0.1);position: relative;}.c {width: 40px; /* 需要设置宽度 */height: 40px; /* 需要设置高度 */background: blue;top: 0;left: 0;right: 0;bottom: 0;position: absolute;margin: auto;}
</style>
<div class="p"><div class="c"></div>
</div>
六、子元素为文本或内联元素(包括内联块元素)
6.1 line-height
一把梭哈
对于父元素
高度确定
, 且子元素是单行文本
或者内联元素
, 可直接通过line-height
实现居中
<style>.p {line-height: 80px;background: rgba(255, 0, 0, 0.1);}.inline-block {display: inline-block;height: 20px;width: 40px;background: blue;}
</style>
<div class="p">11111111111111111111
</div>
<br/>
<div class="p"><div class="inline-block"></div>
</div>
6.2 伪元素(::after
) + vertical-align
通过伪类创建一个
隐藏的内联元素
, 高度为父元素高度, 并借用vertical-align
使所有内容垂直居中
<style>.p {width: 200px;height: 200px;background: rgba(255, 0, 0, 0.1);}.p::after {content: '';height: 100%;display: inline-block;vertical-align: middle;}.c {width: 40px; /* 需要设置宽度 */height: 40px; /* 需要设置高度 */background: blue;display: inline-block;}
</style>
<div class="p"><div class="c"></div>
</div>
<br>
<div class="p">111111111111111111111
</div>
6.3 display: table-cell
+ vertical-align
<style>.p {width: 200px;height: 200px;background: rgba(255, 0, 0, 0.1);display: table-cell;vertical-align: middle;}.c {width: 40px; /* 需要设置宽度 */height: 40px; /* 需要设置高度 */background: blue;}
</style>
<div class="p"><div class="c"></div>
</div>
<br>
<div class="p">111111111111111111111
</div>
相关文章:

CSS 居中那些事
一、父子元素高度确定 简单粗暴, 直接通过设置合适的 padding 或 margin 实现居中 <style>.p {padding: 20px 0;background: rgba(255, 0, 0, 0.1);}.c {width: 40px;height: 20px;background: blue;} </style> <div class"p"><div class"…...

Java项目-基于springboot框架的智能热度分析和自媒体推送平台项目实战(附源码+文档)
作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…...
跨平台进程池背后的思想
背景是基于业务需求,需要实现一个跨平台的项目。项目中由于有部分功能存在大量计算,所以打算单独分配一个进程去进行计算。 进程池的实现与线程池的实现逻辑上如出一辙。但是实现上进程池的实现会比线程池实现复杂的多,主要比较复杂的点的就在于并发安全的任务队列。…...
前端性能优化之加载篇
前端页面加载的过程其实跟我们常常提起的浏览器页面渲染流程几乎一致: 网络请求,服务端返回 HTML 内容。 浏览器一边解析 HTML,一边进行页面渲染。 解析到外部资源,会发起 HTTP 请求获取,加载 Javascript 代码时会暂停页面渲染。 根据业务代码加载过程,会分别进入页面开始…...

数据结构(栈)
每当误会消除冰释前嫌的时候,故事就距离结尾不远了。 栈 概念与结构 1. 栈⼀种特殊的线性表,其只允许在固定的⼀端进行插入和删除元素操作。 2. 进行数据插入和删除操作的⼀端称为栈顶,另⼀端称为栈底。 3. 栈中的数据元素遵守后进先出的原则…...

Aspose.PDF功能演示:使用 JavaScript 从 PDF 中提取文本
在数据提取、业务文档自动化和文本挖掘方面,使用 JavaScript 从PDF中提取文本非常有用。它允许开发人员自动执行从 PDF 收集信息的过程,从而显著提高处理大量文档的生产力和效率。在这篇博文中,我们将学习如何使用 JavaScript 从 PDF 中提取文…...

计算机系统简介
一、计算机的软硬件概念 1.硬件:计算机的实体,如主机、外设、硬盘、显卡等。 2.软件:由具有各类特殊功能的信息(程序)组成。 系统软件:用来管理整个计算机系统,如语言处理程序、操作系统、服…...
学习文档10/18
MySQL高性能优化规范: 数据库命名规范 所有数据库对象名称必须使用小写字母并用下划线分割所有数据库对象名称禁止使用 MySQL 保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)数据库对象的命名要能做到见名识意…...

Redis入门到精通(二):入门Redis看这一篇就够了
文章目录 一、Redis的双写一致性1.延迟双删2.添加分布式锁3.异步监听可靠消息基于MQ消息队列的异步监听基于Canal的异步通知 二、Redis的持久化持久化流程1.RDB机制1.1save1.2bgsave1.3自动触发 2.AOF机制三种触发机制3.RDB和AOF的对比 三、Redis的数据删除策略1.惰性删除2.定期…...
荒岛逃生游戏
题目描述 一个荒岛上有若干人,岛上只有一条路通往岛屿两端的港口,大家需要逃往两端的港口才可逃生。 假定每个人移动的速度一样,且只可选择向左或向右逃生。 若两个人相遇,则进行决斗,战斗力强的能够活下来ÿ…...

玫瑰花HTML源码
HTML源码 <pre id"tiresult" style"font-size: 9px; background-color: #000000; font-weight: bold; padding: 4px 5px; --fs: 9px;"><b style"color:#000000">0010000100000111101110110111100010000100000100001010111111100110…...

【wpf】07 后端验证及令牌码获取步骤
由于在用wpf开发应用程序时,从后端获取数据需要用到 Authorization 授权的Bearer令牌,而这个令牌的获取需要登录后台进行获取,这里登录时还涉及到的验证码的操作,所以在获取过程中,需要对后台系统进行登录并拿到这个Be…...

学习中,师傅b站泷羽sec——xss挖掘过程
某职业技术学院网站xss挖掘: 资产归纳 例如:先把功能点都看一遍,大部分都是文章 根据信息搜集第一课学习到一般主站的防御力是比较强的,出现漏洞的点不是对新手不友好。 在资产验证过程中还是把主站看了一遍 没有发现有攻击的机会…...
什么是双因素身份验证?双因素身份验证的凭据类型有哪些?
w微服务在数字化的时代,保护个人和企业的敏感信息至关重要。双因素身份验证(Two-Factor Authentication,简称 2FA)作为一种增强安全性的方法,越来越受到广泛关注。那么,什么是双因素身份验证呢?…...

【MR开发】在Pico设备上接入MRTK3(一)——在Unity工程中导入MRTK3依赖
写在前面的话 在Pico上接入MRTK3,目前已有大佬开源。 https://github.com/Phantomxm2021/PicoMRTK3 也有值得推荐的文章。 MRTK3在PICO4上的使用小结 但由于在MacOS上使用MRTK3,无法通过Mixed Reality Feature Tool工具管理MRTK3安装包。 故记录一下…...

利用移动式三维扫描技术创建考古文物的彩色纹理网格【上海沪敖3D】
文章来源于蔡司工业质量解决方案,作者蔡司工业质量 在考古环境中,三维扫描技术应用广泛,如存档、保存、复制和分享(包括实体和虚拟形式)。 文中,通过真实的扫描案例,您将了解到三维光学解决方案…...
Spring AI Java程序员的AI之Spring AI(四)
Spring AI之Java经典面试题智能小助手 前言一、准备面试题二、搭建工程三、文件读取与解析四、Markdown文件解析五、问题搜索六、自定义EmbeddingClient七、定义请求Controller 前言 通过Ollama在本地部署了Llama3大模型,这篇来基于Llama3和Spring AI,以…...

精选20个爆火的Python实战项目(含源码),直接拿走不谢!
今天给大家介绍20个非常实用的Python项目,帮助大家更好的学习Python。 完整版Python项目源码,【点击这里】领取! ① 猜字游戏 import random def guess_word_game(): words ["apple", "banana", "cherry&quo…...
Rocky Linux 9安装Asterisk 20和freepbx 17脚本——筑梦之路
脚本搜集来自Rocky Linux 9安装Asterisk 20和freepbx 17脚本 #!/bin/bash#Preparacion de ambiente de RockyLinuxecho "Deshabilitar SELINUX /etc/selinux/config "sed -i s/^SELINUX.*$/SELINUXdisabled/ /etc/selinux/configecho "Establecer nombre de maq…...

PSPICE FOR TI笔记记录1
快捷放置器件 R旋转 连线 w,单击器件引脚方块部分 电压探测笔 创建仿真文件 Analysis Type 分析模式:比如时域分析,频域分析 Run To Time 仿真时长 Skip intial transient bias point calculation (跳过初始瞬态偏置点计算(SKIPBP))一定要勾选 编辑…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...