CSS 居中那些事

一、父子元素高度确定

简单粗暴, 直接通过设置合适的 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第 5 章:vuex

1. 理解 vuex vuex 是什么&#xff1a; 概念&#xff1a;专门在 Vue 中实现集中式状态&#xff08;数据&#xff09;管理的一个 Vue 插件&#xff0c;对 vue 应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&#xff09;&#xff0c;也是一种组件间通信的方式&am…

多IP访问浏览器

添加多个ip地址 nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.61.100/24 ipv4.addresses 192.168.61.200/24 ipv4.addresses 192.168.61.128 ipv4.gateway 192.168.61.2 ipv4.dns 114.114.114.114

linux多窗口调试一些常用命令

在 vim 或 neovim 中使用分屏移动光标的方式&#xff1a; 希望光标从左窗口移动到右侧窗口&#xff1a; 按 Ctrlw 然后按 l&#xff08;小写的 L&#xff09;&#xff0c;光标就会从左边窗口移动到右边窗口。 其它分屏操作&#xff1a; Ctrlw h&#xff1a;移动到左边的窗…

民宿在线预订:SpringBoot技术实践指南

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

【VUE小型网站开发】初始环境搭建

1. 初始化VUE项目 1.1 创建vue项目 1.2 删除多余的界面 根据自己情况删除红框内的文件 清理app页面代码 1.3 引入vue-router 1.3.1 下载vue-router npm install vue-router1.3.2 配置vue-router 在 main.js 或 main.ts 中引入 vue-router import ./assets/main.css im…

MySQL-28.事务-介绍与操作

一.为什么需要事务 -- 事务 -- 删除部门 delete from tb_dept where id 1;-- 删除部门下的员工 delete from tb_emp where dept_id 1; 这样的话就可以成功删除&#xff0c;但是有一个问题&#xff1a;如果部门id1的被成功删除了&#xff0c;但是部门下的员工在删除时出错了…

各种查询sql介绍

1. 关联查询&#xff08;JOIN&#xff09; 关联查询用于从多个表中检索数据。它基于两个或多个表之间的共同字段&#xff08;通常是主键和外键&#xff09;来组合数据。 内连接&#xff08;INNER JOIN&#xff09;&#xff1a; sql SELECT a.name, b.order_date FROM custome…

git add操作,文件数量太多卡咋办呢,

git add介绍 Git的add命令是用于将文件或目录添加到暂存区&#xff08;也就是索引库&#xff09;&#xff0c;以便在后续的提交&#xff08;commit&#xff09;操作中一并上传到版本库的。具体来说&#xff0c;git add命令有以下几种常见用法&#xff1a; 添加单个文件&#…

【每日一题】24.10.14 - 24.10.20

10.14 直角三角形1. 题目2. 解题思路3. 代码实现&#xff08;AC_Code&#xff09; 10.15 回文判定1. 题目2. 解题思路3. 代码实现&#xff08;AC_Code&#xff09; 10.16 二次方程1. 题目2. 解题思路3. 代码实现&#xff08;AC_Code&#xff09; 10.17 互质1. 题目2. 解题思路3…

基于单片机的多功能鱼缸控制系统设计

本设计以STC12C5A60S2单片机为核心的多功能鱼缸控制系统&#xff0c;该系统可分别利用温度传感器、水位传感器和浑浊度传感器来检测鱼缸内部的水温、液体高度和浑浊程度&#xff0c;并在显示屏上进行显示。若检测结果超出阈值范围&#xff0c;则继电器工作从而控制内部环境。通…

Golang | Leetcode Golang题解之第482题秘钥格式化

题目&#xff1a; 题解&#xff1a; func licenseKeyFormatting(s string, k int) string {ans : []byte{}for i, cnt : len(s)-1, 0; i > 0; i-- {if s[i] ! - {ans append(ans, byte(unicode.ToUpper(rune(s[i]))))cntif cnt%k 0 {ans append(ans, -)}}}if len(ans) &…

汽车电子存储解决方案:IS61WV20488FALL

ISSI在SRAM领域的技术创新体现在采用高性能CMOS工艺制造&#xff0c;提供低功耗设计&#xff0c;以及支持宽温度范围的稳定运行。其产品集成了错误更正代码&#xff08;ECC&#xff09;&#xff0c;增强了数据完整性和可靠性。ISSI的SRAM优化了数据处理速度&#xff0c;提供多访…

教你不用下载 maven,不用配置环境变量,在 idea 上创建 maven 项目

我的主页&#xff1a;2的n次方_ 1. Maven Maven是⼀个项⽬管理⼯具, 通过 pom.xml ⽂件的配置获取 jar 包&#xff0c;⽽不⽤⼿动去添加 jar 包&#xff0c;这样就大大的提高了开发效率 2. Maven 的核心功能 2.1. 项目构建 创建第一个 Maven 项目 Maven 提供了标准的…

CDC变更数据捕捉技术是什么?和ETL有什么不同?

一、什么是CDC技术? 变更数据捕获&#xff08;Change Data Capture&#xff0c;简称 CDC&#xff09;是一种用于识别和跟踪数据源中发生变化的数据的技术。 工作原理&#xff1a; 1.监测数据源&#xff1a;CDC 工具会持续监测指定的数据源&#xff0c;如数据库表、文件系统…

Qt开发------容器控件(QWidget,QFrame、QMainWindow、QScrollArea)

目录 一、QWidget 二、QFrame 三、QMainWindow 四、QScrollArea&#xff08;面板滚动&#xff09; 层次结构如下&#xff1a; QObject└── QPaintDevice└── QWidget├── QMainWindow├── QDialog├── QFrame│ ├── QLabel│ ├── QSplitter│ …

react 中的hooks中的useState

(1). State Hook让函数组件也可以有state状态, 并进行状态数据的读写操作 (2). 语法: const [xxx, setXxx] React.useState(initValue) (3). useState()说明:参数: 第一次初始化指定的值在内部作缓存返回值: 包含2个元素的数组, 第1个为内部当前状态值, 第2个为更新状态值的…

关于SSD1306的OLED的显示的研究

文章目录 函数作用参数解释嵌套函数分析主代码分析逻辑流程总结 难点的解析&#xff1a;生成器的主要逻辑分解&#xff1a;每次生成的元组 (pixel_x, pixel_y, pixel_mask)&#xff1a;生成器的整体流程举例总结 反转后的文本绘制竖直布局有问题的旋转180度旋转坐标轴绘制矩形绘…

Chromium form表单post提交过程分析c++

form表单get提交参考之前文章Chromium 前端form表单提交过程分析c-CSDN博客 一、表单post提交测试例子&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head&…

【火山引擎】AIGC图像风格化 | 风格实践 | PYTHON

目录 1 准备工作 2 实践 代码 效果图 1 准备工作 ① 服务开通 确保已开通需要访问的服务。您可前往火山引擎控制台,在左侧菜单中选择或在顶部搜索栏中搜索需要使用的服务,进入服务控制台内完成开通流程。

TWS蓝牙耳机发展史

目录 1&#xff1a;人类历史第一副耳机 2&#xff1a;第一台手持式耳机 3&#xff1a;第一台头戴式耳机 4&#xff1a;第一台动圈式耳机 5&#xff1a;第一台立体声耳机 6&#xff1a;第一台压耳式耳机 7&#xff1a;随身听 8&#xff1a;商用降噪耳机 9&#xff1a;i…