实现水平垂直居中的十种方式

news2024/11/27 0:31:50

本文节选自我的博客:实现水平垂直居中的十种方式

  • 💖 作者简介:大家好,我是MilesChen,偏前端的全栈开发者。
  • 📝 CSDN主页:爱吃糖的猫🔥
  • 📣 我的博客:爱吃糖的猫
  • 📚 Github主页: MilesChen
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 💬介绍:The mixture of WEB+DeepLearning+Iot+anything🍁

前言

实现水平垂直居中是一道经典的面试题,如果你能侃侃而谈这十种实现水平垂直居中的方式,一定会令面试官眼前一亮。按照实现方式的不同可粗略分为三类:绝对定位实现的四种、flex实现的两种、其他四种。

绝对定位实现的四种

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>水平垂直居中</title>
    <style>
        /* 公共代码 */
        .father {
            border: 1px solid red;
            width: 300px;
            height: 300px;
        }
        .box {
            width: 100px;
            height: 100px;  
            background: green;  
        }
        /* 公共代码 */

        /* 方法一 absolute+负margin  常用、兼容性好。缺点是要知道子元素的宽高 */
        .father {
            position: relative;
        }
        .box {
            position: absolute;;
            top: 50%;
            left: 50%;
            margin-left: -50px;
            margin-top: -50px;
        }
        
        /* 方法二 absolute + margin auto  兼容性好。缺点是要知道子元素的宽高*/
        /* .father {
            position: relative;
        }
        .box {
            position: absolute;;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            margin: auto;
        } */

        /* 方法三 absolute + calc  兼容性依赖calc的兼容性,缺点是要知道子元素的宽高*/
        /* .father {
            position: relative;
        }
        .box {
            position: absolute;;
            top: calc(50% - 50px);
            left: calc(50% - 50px);
        } */

        /* 方法四 absolute + transform 兼容性依赖translate2d的兼容性,不需要知道子元素的宽高 */
        /* .father {
            position: relative;
        }
        .box {
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
        } */
    </style>
</head>
<body>
    <div class="father">
        <div class="box">content</div>
    </div>    
</body>
</html>

flex实现的两种

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>水平垂直居中</title>
    <style>
        /* 公共代码 */
        .father {
            border: 1px solid red;
            width: 300px;
            height: 300px;
        }
        .box {
            width: 100px;
            height: 100px;  
            background: green;    
        }
        /* 公共代码 */

        /* 方法5 flex 目前在移动端已经完全可以使用flex了,PC端需要看自己业务的兼容性情况 */
        .father {
            display: flex;
            justify-content: center;
            align-items: center;
        }

        /* 方法6 flex 的另外一种写法*/
        /* .father {
            display: flex;
        }
        .box {
            margin: auto;
        } */
    </style>
</head>
<body>
    <div class="father">
        <div class="box">content</div>
    </div>    
</body>
</html>

其他四种

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>水平垂直居中</title>
    <style>
        /* 公共代码 */
        .father {
            border: 1px solid red;
            width: 300px;
            height: 300px;
        }
        .box {
            width: 100px;
            height: 100px;  
            background: green;    
        }
        /* 公共代码 */

        /* 方法7 行内块 将父元素设置text-align: center;line-height: 300px;;子标签display: inline-block;vertical-align: middle;line-height: initial;*/
        /* 适用于行内块,利用了行内块和行内标签具有文本属性的特点 */
        /* .father {
            line-height: 300px;
            text-align: center;
        }
        .box {
            font-size: 16px;
            display: inline-block;
            vertical-align: middle;
            line-height: initial;
        } */

        /* 方法8 grid 但兼容性不如flex,不推荐使用 */
        /* .father {
            display: grid;
        }
        .box {
            align-self: center;
            justify-self: center;
        } */

        /* 方法9 css-table  css新增的table属性,可以让我们把普通元素,变为table元素的现实效果,通过这个特性也可以实现水平垂直居中*/
        /* .father {
            display: table-cell;
            text-align: center;
            vertical-align: middle;
        }
        .box {
            display: inline-block;
        } */
    </style>
</head>
<body>
    <div class="father">
        <div class="box">content</div>
    </div>    
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>水平垂直居中</title>
    <style>
        /* 公共代码 */
        .father {
            border: 1px solid red;
            width: 300px;
            height: 300px;
        }
        .box {
            width: 100px;
            height: 100px;  
            background: green;    
        }
        /* 公共代码 */

        /* 方法10 table 天然支持垂直居中,设置水平居中即可;缺点是 复杂;table本身就不适合做居中布局的*/
    </style>
</head>
<body>
    <table class="father">
        <tr align="center">
          <td><div class="box">content</div></td>
        </tr>
      </table>
</body>
</html>

总结

绝对定位的四种,前三种要知道子元素的宽高

  1. absolute+负margin 常用、兼容性好。top: 50%;left: 50%;margin-left: -50px;margin-top: -50px;
  2. absolute + margin auto;兼容性好。top: 0;left: 0;right: 0;bottom: 0;margin: auto;
  3. absolute + calc;兼容性依赖calc的兼容性;top: calc(50% - 50px);left: calc(50% - 50px);
  4. absolute + transform; 兼容性依赖translate2d;top: 50%;left: 50%;transform: translate(-50%, -50%);

flex两种:目前在移动端已经完全兼容flex,PC端需要看业务的兼容性情况

  1. 父元素设置display: flex;justify-content: center;align-items: center;即可
  2. 父元素设置display: flex;子元素margin: auto;

其他四种写法:

  1. 行内块;将父元素设置text-align: center;line-height: 300px(撑满);子标签display: inline-block;vertical-align: middle;line-height: initial; (控制好行高)利用了行内块和行内标签具有文本属性的特点
  2. grid ;但兼容性不如flex,子标签align-self: center;justify-self: center;
  3. css-table :css新增的table属性,可以让我们把普通元素,变为table元素的现实效果,通过这个特性也可以实现水平垂直居中display: table-cell; text-align: center;vertical-align: middle;
  4. table标签;table天然支持垂直居中,设置水平居中即可;缺点是 复杂;table本身就不适合做居中布局的

感谢小伙伴们的耐心观看,本文为笔者个人学习记录,如有谬误,还请告知,万分感谢!如果本文对你有所帮助,还请点个关注点个赞~,您的支持是笔者不断更新的动力!

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

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

相关文章

leetcode:2806. 取整购买后的账户余额(python3解法)

难度&#xff1a;简单 一开始&#xff0c;你的银行账户里有 100 块钱。 给你一个整数purchaseAmount &#xff0c;它表示你在一次购买中愿意支出的金额。 在一个商店里&#xff0c;你进行一次购买&#xff0c;实际支出的金额会向 最近 的 10 的 倍数 取整。换句话说&#xff0c…

网络工程师学习中但是发现这个岗位非常卷怎么办

大家好&#xff0c;我是网络工程师成长日记实验室的郑老师&#xff0c;您现在正在查看的是网络工程师成长日记专栏&#xff0c;记录网络工程师日常生活的点点滴滴 有个同学说&#xff0c;他说现在有很多培训机构搞的这个网络工程师也非常卷。他现在还没有入行&#xff0c;他现在…

Scala第十四章节

Scala第十四章节 1. 隐式转换和隐式参数介绍 2. 隐式转换 3. 隐式参数 4. 案例: 获取列表元素平均值 scala总目录 文档资料下载

计算机竞赛 深度学习疫情社交安全距离检测算法 - python opencv cnn

文章目录 0 前言1 课题背景2 实现效果3 相关技术3.1 YOLOV43.2 基于 DeepSort 算法的行人跟踪 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习疫情社交安全距离检测算法 ** 该项目较为新颖&#xff0c;适合作为竞赛…

神经网络中的知识蒸馏

多分类交叉熵损失函数&#xff1a;每个样本的标签已经给出&#xff0c;模型给出在三种动物上的预测概率。将全部样本都被正确预测的概率求得为0.70.50.1&#xff0c;也称为似然概率。优化的目标就是希望似然概率最大化。如果样本很多&#xff0c;概率不断连乘&#xff0c;就会造…

手把手教你用 Milvus 和 Towhee 搭建一个 AI 聊天机器人

作为向量数据库的佼佼者,Milvus 适用于各种需要借助高效和可扩展向量搜索功能的 AI 应用。 举个例子,如果想要搭建一个聊天机器人,Milvus 一定是其进行数据管理的首选。那么,如何让这个应用程序开发变得易于管理及更好理解,那就需要借助 Towhee(https://towhee.io/)了。…

PHP 反序列化漏洞:__PHP_Incomplete_Class 与 serialize(unserialize($x)) !== $x;

文章目录 参考环境声明__PHP_Incomplete_Class灵显为什么需要 __PHP_Incomplete_Class&#xff1f;不可访问的属性 serialize(unserialize($x)) $x;serialize(unserialize($x)) ! $x;雾现__PHP_Incomplete_Class 对象与其序列化文本的差异试构造 __PHP__Incomplete_Class 对象…

JMeter学习第一、二、三天

JMeter介绍 Apache JMeter 是一个开源软件&#xff0c;它最初被设计为用来进行压力测试和性能测试&#xff0c;但后来添加了更多的测试功能&#xff0c;如功能测试和服务测试等。JMeter 可以用于分析和衡量各种服务的性能&#xff0c;包括网络服务、数据库、FTP服务器、HTTP服务…

文心一言 VS 讯飞星火 VS chatgpt (104)-- 算法导论10.1 2题

二、用go语言&#xff0c;说明如何在一个数组 A[1…n]中实现两个栈&#xff0c;使得当两个栈的元素个数之和不为 n 时&#xff0c;两者都不会发生上溢。要求 PUSH 和 POP 操作的运行时间为 O(1)。 文心一言&#xff1a; 在这个问题中&#xff0c;我们要在一个数组 A[1…n] 中…

Vue3 引入使用 vant组件详解

目录 Vue3 引入使用 vant组件详解1.安装2.引入2.1 全局引入2.2 按需引入2.2.1 vite项目:vite.config.js2.2.2 Webpack项目&#xff1a;webpack.config.js2.2.3 配置在vue.config.js中 3.使用 Vue3 引入使用 vant组件详解 Vant是一个强大的移动端组件库&#xff0c;目前Vant 官…

C/C++程序的内存开辟

前面我们说过&#xff0c;计算机中内存分为三个区域&#xff1a;栈区&#xff0c;堆区&#xff0c;静态区 但是这只是个简化的版本&#xff0c;接下来我们仔细看看内存区域的划分 C/C程序内存分配的几个区域&#xff1a; 栈区&#xff08;stack&#xff09;&#xff1a;在执行…

c++ 学习 之static 和 const深入学习

作用域 static 和 const 的作用域都是当前模块&#xff08;当前cpp文件),所以不同的模块可以定义同名的static 和 const 变量 在上面的例子中&#xff0c;我们先了解一些基础知识&#xff1a; static int x 1; const int x 1; static const int x 1;上面的三种声明都涉及到…

c语言练习73:统计位数为偶数的数字

统计位数为偶数的数字 给你⼀个整数数组 nums &#xff0c;请你返回其中位数为 偶数 的数字的个数。 • ⽰例 1&#xff1a; 输⼊&#xff1a;nums [12,345,2,6,7896] 输出&#xff1a;2 解释&#xff1a; 12 是 2 位数字&#xff08;位数为偶数&#xff09; 345 是 3 位…

代码随想录算法训练营第五十一天 | 动态规划 part 12 | 买卖股票含冷冻期、含手续费

目录 309.最佳买卖股票时机含冷冻期思路代码 714.买卖股票的最佳时机含手续费思路代码 309.最佳买卖股票时机含冷冻期 Leetcode 思路 因为有冷静期&#xff0c;我们可以区分出如下的四个状态&#xff1a; dp数组含义 状态一(j 0)&#xff1a;持有股票状态&#xff08;今…

分布式文件存储系统Minio实战

分布式文件系统应用场景 互联网海量非结构化数据的存储需求电商网站&#xff1a;海量商品图片视频网站&#xff1a;海量视频文件网盘 : 海量文件社交网站&#xff1a;海量图片 1. Minio介绍 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存…

解决二叉树遍历相关问题(过程中深入一下C++递归程序栈编译和执行)

解决二叉树遍历相关问题&#xff08;过程中深入一下C递归程序栈编译和执行&#xff09; 首先&#xff0c;事情是这样的&#xff1a;问题是求二叉树的根节点到某个节点的路径。 方法自然很多&#xff1a;树的后序遍历&#xff0c;图的BFS、DFS遍历等等。 这里&#xff0c;为了快…

CentOS 7 上编译和安装 SQLite 3.9.0

文章目录 可能报错分析详细安装过程 可能报错分析 报错如下&#xff1a; django.core.exceptions.ImproperlyConfigured: SQLite 3.9.0 or later is required (found 3.7.17). 原因&#xff1a;版本为3.7.太低了&#xff0c;需要升级到3.9.0至少 详细安装过程 1.安装所需的…

c语言:通讯录管理系统(增删查改)

前言&#xff1a;在大多数高校内&#xff0c;都是通过设计一个通讯录管理系统来作为c语言课程设计&#xff0c;通过一个具体的系统设计将我们学习过的结构体和函数等知识糅合起来&#xff0c;可以很好的锻炼学生的编程思维&#xff0c;本文旨在为通讯录管理系统的设计提供思路和…

【STM32基础 CubeMX】PWM输出

文章目录 前言一、PWM是什么&#xff1f;二、CubeMX配置PWM三、代码分析3.1 CubeMX生成代码3.2 PWM的几个库函数HAL_TIM_PWM_Start 3.3 PWM回调函数3.4 占空比占空比是什么__HAL_TIM_SET_COMPARE设置占空比 四、呼吸灯示例总结 前言 STM32微控制器是一系列功能强大的微控制器&…

unordered_map/unordered_set的学习[unordered系列]

文章目录 1.老生常谈_遍历2.性能测试3.OJ训练3.1存在重复元素3.2两个数组的交集Ⅱ3.3两句话中的不常见单词3.4两个数组的交集3.5在长度2N的数组中找出重复N次的元素 1.老生常谈_遍历 #pragma once #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <l…