• 元素水平垂直居中,若元素不定宽高怎么实现


    前言

    居中是一个非常基础但又是非常重要的应用场景,实现居中有很多方法,我这边把这些方法分为两大类

    • 居中元素(子元素)的宽高已知
    • 居中元素宽高未知

    实现方式

    • 利用定位+margin:auto

    • 利用定位+margin:负值

    • 利用定位+transform

    • table布局  (已知宽高)

    • flex布局  (简单实现垂直水平居中)

    • grid布局

    体实现

    1.利用定位+margin:auto

    代码实施

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <style>
    9. .father{
    10. width: 400px;
    11. height: 200px;
    12. border: 1px solid #000;
    13. position: relative;
    14. }
    15. .son{
    16. width: 100px;
    17. height: 40px;
    18. background-color: pink;
    19. position: absolute;
    20. top: 0;
    21. left: 0;
    22. right: 0;
    23. bottom: 0;
    24. margin: auto;
    25. }
    26. style>
    27. head>
    28. <body>
    29. <div class="father">
    30. <div class="son">div>
    31. div>
    32. body>
    33. html>

    实现效果

     注解

    父级设置为相对定位,子级绝对定位,(子绝父相)并且四个定位属性的值都设置了0,那么这时候如果子级没有没有设置宽高,则会被拉开到和父级一样宽高

    这里子元素设置了宽高,所以宽高会按照我们的设置来显示,但是实际上子元素的虚拟占位已经撑满了整个父级,这时候在给它一个margin:auto它就可以上下左右都居中了

    2.利用定位+margin:负值

    代码实施

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <style>
    9. .father{
    10. width: 200px;
    11. height: 200px;
    12. background-color: skyblue;
    13. position: relative;
    14. }
    15. .son{
    16. width: 100px;
    17. height: 100px;
    18. background-color: pink;
    19. position: absolute;
    20. top: 50%;
    21. left: 50%;
    22. margin-left: -50px;
    23. margin-top: -50px;
    24. }
    25. style>
    26. head>
    27. <body>
    28. <div class="father">
    29. <div class="son">div>
    30. div>
    31. body>
    32. html>

    实现效果

     注解

    这种方案不要求父元素的高度,也就是即使父元素的高度变化了,仍然可以保持在父元素的垂直居中位置,水平方向上是一样的操作

    但是该方案需要知道子元素自身的宽高,但是我们可以通过下面transform属性进行移动

    3.利用定位+transform

    代码实施

    就是把上部的margin-left/top: -50px 改为 transform:translate(-50%,-50%)

    注解:

    translate(-50%,-50%)将会把元素位移自己宽度和高度的-50%

    这种方法其实和最上面被否定掉的margin负值用法一样,可以说是margin负值的替代方案,并不需要知道自身元素的宽高

    4.table布局

    实现代码

    1. <html lang="en">
    2. <head>
    3. <meta charset="UTF-8">
    4. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <title>Documenttitle>
    7. <style>
    8. .father{
    9. width: 200px;
    10. height: 200px;
    11. background-color: skyblue;
    12. display: table-cell;
    13. vertical-align: middle;
    14. text-align: center;
    15. }
    16. .son{
    17. width: 100px;
    18. height: 100px;
    19. background-color: red;
    20. display: inline-block;
    21. }
    22. style>
    23. head>
    24. <body>
    25. <div class="father">
    26. <div class="son">div>
    27. div>
    28. body>
    29. html>

    注解:

    给父元素设置display:table-cell(指定对象为表格单元格,一行可以放置多个,类似flex布局)

    子元素设置display:inline-block(指定对象为行内块元素,可以设置宽高,且一行可以放置多个)

    利用vertical和text-align可以让所有的行内块元素水平垂直居中

    vertical-align:middle(使单元格内边距盒模型在该行内居中)

    5.flex弹性布局

    实现代码

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <style>
    9. .father{
    10. width: 200px;
    11. height: 200px;
    12. background-color: skyblue;
    13. display: flex;
    14. justify-content: center;
    15. align-items: center;
    16. }
    17. .son{
    18. width: 100px;
    19. height: 100px;
    20. background-color: red;
    21. }
    22. style>
    23. head>
    24. <body>
    25. <div class="father">
    26. <div class="son">div>
    27. div>
    28. body>
    29. html>

    注解

    c3中flex布局,可以非常简单的实现垂直水平居中

    主要原因是下面的代码起到了关键作用

    • display: flex时,表示该容器内部的元素将按照flex进行布局

    • align-items: center表示这些元素将相对于本容器水平居中

    • justify-content: center也是同样的道理垂直居中

    6.grid网格布局

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. <style>
    9. .father{
    10. display: grid;
    11. justify-content: center;
    12. align-items: center;
    13. width: 200px;
    14. height: 200px;
    15. background-color: skyblue;
    16. }
    17. .son{
    18. width: 100px;
    19. height: 100px;
    20. border: 1px solid red;
    21. }
    22. style>
    23. head>
    24. <body>
    25. <div class="father">
    26. <div class="son">div>
    27. div>
    28. body>
    29. html>

    实现效果

     注解

    display:grid(网格布局)

  • 相关阅读:
    【ManageEngine卓豪】网络运维管理是什么,网络运维平台有什么用
    java springboot 监控线程池的状态
    vite.config.js-element-plus
    MLX90614红外测温传感器使用arduino采集温度数据OLED显示
    小小装饰器大大用处
    一文了解 io.LimitedReader类型
    I/O设备的分配与回收
    《BEV LaneDet:Fast Lane Detection on BEV Ground》论文笔记
    SpringMVC:获取请求数据
    js监听页面滚动
  • 原文地址:https://blog.csdn.net/LJM51200/article/details/126069454