CSS 居中那些事

news2024/10/21 13:14:48

一、父子元素高度确定

简单粗暴, 直接通过设置合适的 paddingmargin 实现居中

<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 「补充」marginpadding 百分比计算方式

marginpadding 上下两个方向的百分比, 相对于父元素自适应的一边进行计算, 默认情况下是根据父元素宽度进行计算的 (因为块元素默认宽度自适应), 之所以要相对于自适应一边进行计算, 是为了避免在未设置宽高情况下, 子元素设置了边距, 引起容器尺寸的变化, 从而造成百分比重新计算, 引起死循环

<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>

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2220042.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器模块测试

目录 测试逻辑 测试工具 测试 测试逻辑 我们可以使用一个简单的业务处理逻辑来进行测试。 最简单的&#xff0c;我们业务逻辑就直接返回一个固定的字符串 void Message(const PtrConnection&con,Buffer* inbuffer) //模拟用户新数据回调 {inbuffer->MoveReadOf…

Vite 前端开发的超级加速器 - 从入门到精通

大家好&#xff01;今天我们来聊聊前端开发中的一个革命性工具 - Vite。如果你觉得你的前端开发速度慢得像蜗牛爬&#xff0c;那么Vite就是为你量身打造的超级加速器&#xff01; 一、什么是Vite&#xff1f; Vite&#xff08;法语意为"快速"&#xff09;是一个现代化…

LDR6500芯片:引领USB-C拓展坞转接器新风

在当今这个数字化浪潮汹涌澎湃的时代&#xff0c;手机和电脑已然深深融入我们生活的每一个角落&#xff0c;成为了不可或缺的关键工具。然而&#xff0c;不得不承认的是&#xff0c;它们所配备的接口数量往往有限&#xff0c;难以充分满足我们日益多样化、丰富化的需求。正因如…

5G 现网信令参数学习(1) - MIB

MIB消息中的参数 systemFrameNumber 000101B, subCarrierSpacingCommon scs30or120, ssb-SubcarrierOffset 6, dmrs-TypeA-Position pos2, pdcch-ConfigSIB1 { controlResourceSetZero 10, searchSpaceZero 4 }, cellBarred notBarred, intraFreqReselection allowed, sp…

nginx解决非人类使用http打开的443,解决网安漏扫时误扫443端口带来的问题

一、问题描述 正常访问https的站点时&#xff0c;使用网址https://www.baidu.com&#xff0c;但会有一种错误的访问请求http://www.baidu.com:443&#xff0c;一般都是非人类所为&#xff0c;如漏洞扫描工具&#xff0c;那么请求以后带来的后果是个错误页面 400 Bad Request T…

Vue及项目结构介绍

今天滴学习目标&#xff01;&#xff01;&#xff01; 项目结构介绍1.Vue 项目文件结构2. 文件结构详解2.1 index.html2.2 src/main.js2.3 src/App.vue2.4 src/components/2.5 src/assets/2.6 package.json 3. 项目启动 首先我们先学习Vue项目结构&#xff0c;我们创建Vue项目时…

【专题】计算机网络之物理层

计算机网络体系结构&#xff1a; 1. 物理层的基本概念 物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体。 作用&#xff1a;尽可能屏蔽掉不同传输媒体和通信手段的差异。 用于物理层的协议也常称为物理层规程 (procedu…

js.矩阵置零

链接&#xff1a;73. 矩阵置零 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],…

如何使用Java语言调用API数据

在当今的数据驱动世界中&#xff0c;API&#xff08;应用程序编程接口&#xff09;成为了连接不同服务和数据源的桥梁。无论是社交媒体数据、金融市场信息还是地理位置服务&#xff0c;API都能提供一种便捷的方式来获取这些数据。Java&#xff0c;作为最受欢迎的编程语言之一&a…

无mac电脑在苹果开发者上传构建版本

我们登录苹果开发者网站的后台&#xff0c;进入app store后&#xff0c;发现上架的页面需要上传一个构建版本。 这个构建版本的意思就是我们的应用二进制文件&#xff0c;是上架最重要的文件。但是在苹果开发者后台是无法直接上传这个文件的&#xff0c;它提示我们可以使用xco…

VSCODE c++不能自动补全的问题

最近安装了vscode&#xff0c;配置了C/C扩展&#xff0c;也按照网上说的配置了头文件路径 我发现有部分头文件是没办法解析的&#xff0c;只要包含这些头文件中的一个或者多个&#xff0c;就没有代码高亮和代码自动补全了&#xff0c;确定路径配置是没问题的&#xff0c;因为鼠…

Caffeine Cache解析(一):接口设计与TinyLFU

Caffeine is a high performance Java caching library providing a near optimal hit rate. 自动加载value, 支持异步加载基于size的eviction&#xff1a;frequency and recency基于时间的过期策略&#xff1a;last access or last write异步更新valuekey支持weak referenceva…

RK3588部署及其RKNPU工具链使用学习

文章目录 RKNPU 推理框架推理软件框架RKNPU 硬件层&#xff1a;RKNPU 驱动层&#xff1a;RKNPU 应用层 RKNN 模型RKNN 的工具链介绍RKNN 软件栈整体介绍RKNN-Toolkit2 功能介绍RKNPU2-SDK总结 开发环境搭建PC 端采用 虚拟机上的 Ubunt20.04 系统安装 anconda通过 conda 创建虚拟…

机器学习“捷径”:自动特征工程全面解析

引言 在机器学习项目中&#xff0c;特征工程是影响模型性能的关键步骤。它通过从原始数据中提取出更有用的特征&#xff0c;帮助模型更好地捕捉数据中的模式。然而&#xff0c;传统的特征工程过程往往需要大量的领域知识和实验调整&#xff0c;是一项耗时费力的工作。 近年来…

关于modbus与HMI车载侧屏通信的错误机制处理

目录 1.关于6个人机交互功能按钮逻辑图设计 2.错误处理机制 1.关于6个人机交互功能按钮逻辑图设计 初次的设计想法是按钮亮表示大家能按&#xff0c;但要是想在按一次&#xff0c;发送有效数据&#xff0c;就得先按亮&#xff0c;在按灭。这里以上料区为例&#xff0c;其它区…

Midjourney中文版:创意无界,绘梦成真

在数字艺术的浩瀚宇宙中&#xff0c;Midjourney中文版如同一颗璀璨的新星&#xff0c;以其独特的魅力和无限可能&#xff0c;引领着每一位创作者探索创意的无限边界。作为专为国内用户打造的AI绘画工具&#xff0c;Midjourney中文版不仅继承了原版的核心优势&#xff0c;更在本…

基于cloudreve(Docker应用)搭建网盘服务,用于目录的分享和在线预览。

文章目录 I 基于cloudreve(Docker应用)搭建网盘服务安装主要功能设置角色最大容量II 知识扩展:网盘类的文件预览需求背景: iOS可以直接预览PDF等常见格式文件,但是Android浏览器需要先下载文件,才能查看文件内容,因此需要搭建支持目录的分享和在线预览的MinIO文件服务提供…

【Redis】Zset类型常用命令

文章目录 一. Zset有序集合简介.二. 添加元素相关命令.2.1 向有序集合中添加元素(zadd) 三. 查询元素相关操作.3.1 查询有序集合中的元素个数( zcard zcount)3.2 查询指定区间内的元素(zrange zrevrange zrangebyscore)3.3 查询有序集合中指定成员的排名(zrank zrevrank )3.4 查…

AI大模型学习路线路径,巨详细!

大模型技术已经成为推动人工智能发展的关键力量。无论你是初学者还是有经验的开发者&#xff0c;想要掌握大模型应用&#xff0c;都需要遵循一定的学习路线。 从核心技术解析到模型微调与私有化部署&#xff0c;逐步深入大模型应用的世界。 这份学习路线图详细的介绍了那年每…

规划控制复现:Apollo LQR横向控制(算法原理推导与流程)

本文在前文已经搭建好的规划控制验证平台中进行LQR算法的复现&#xff1a; 1.车辆动力学建模 汽车轨迹跟踪误差模型示意图如下&#xff1a; 为车辆横向速度,为车辆纵向速度;和 分别为质心到前、 后轴的距离 ; 为车辆的横 摆角 ; 和 分别为车辆前 、 后轮的侧偏角。并设车辆…