【元素水平垂直居中的方法有哪些?元素不定宽高呢?】

简介: 【元素水平垂直居中的方法有哪些?元素不定宽高呢?】

首先有两种方式:已知居中元素的宽高、未知居中元素的宽高

实现方式:

  • 方法1【未知居中元素宽高】:利用定位+margin:auto
  • 方法2【已知居中元素宽高】:利用定位+margin:负值
  • 方法3【未知居中元素宽高】:利用定位+transform
  • 方法4【已知居中元素宽高】:table布局
  • 方法5【未知居中元素宽高】:flex布局
  • 方法6【未知居中元素宽高】:grid布局

方法1【未知居中元素宽高】:

<style>
    .father{
        width:500px;
        height:300px;
        border:1px solid #0a3b98;
        position: relative;
    }
    .son{
        width:100px;
        height:40px;
        background: #f0a238;
        position: absolute;
        top:0;
        left:0;
        right:0;
        bottom:0;
        margin:auto;
    }
</style>
<div class="father">
    <div class="son"></div>
</div>

父级相对定位,子级绝对定位并设置四个位置属性为0,若子级没有宽高,那么会继承父级宽高

这时候直接使用margin:0 auto即可上下居中

方法2【已知居中元素宽高】:

<style>
    .father {
        position: relative;
        width: 200px;
        height: 200px;
        background: skyblue;
    }
    .son {
        position: absolute;
        top: 50%;
        left: 50%;
        margin-left:-50px;
        margin-top:-50px;
        width: 100px;
        height: 100px;
        background: red;
    }
</style>
<div class="father">
    <div class="son"></div>
</div>

62ab0d8dfab54cbebe85caef37fbf220.png

位置1是红块1的位置

当设置left、top为50%后,移动到红块2位置

设置margin为负值时,移动到红块3的位置

方法3【未知居中元素宽高】:

<style>
    .father {
        position: relative;
        width: 200px;
        height: 200px;
        background: skyblue;
    }
    .son {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%,-50%);
        width: 100px;
        height: 100px;
        background: red;
    }
</style>
<div class="father">
    <div class="son"></div>
</div>

解释一下translate(-50%,-50%)将元素位移到子级宽高的50%

方法4【已知居中元素宽高】:

<style>
    .father {
        display: table-cell;
        width: 200px;
        height: 200px;
        background: skyblue;
        vertical-align: middle;
        text-align: center;
    }
    .son {
        display: inline-block;
        width: 100px;
        height: 100px;
        background: red;
    }
</style>
<div class="father">
    <div class="son"></div>
</div>

设置父元素为display:table-cell,子元素设置 display: inline-block

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

方法5【未知居中元素宽高】:

<style>
    .father {
        display: flex;
        justify-content: center;
        align-items: center;
        width: 200px;
        height: 200px;
        background: skyblue;
    }
    .son {
        width: 100px;
        height: 100px;
        background: red;
    }
</style>
<div class="father">
    <div class="son"></div>
</div>

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

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

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

方法6【未知居中元素宽高】:

<style>
    .father {
            display: grid;
            align-items:center;
            justify-content: center;
            width: 200px;
            height: 200px;
            background: skyblue;
        }
        .son {
            width: 10px;
            height: 10px;
            border: 1px solid red
        }
</style>
<div class="father">
    <div class="son"></div></div>

总结

根据元素标签性质分为:内联元素居中布局、块级元素居中布局


块级元素居中布局

水平居中

定宽: margin: 0 auto

绝对定位+left:50%+margin:负自身一半

垂直居中

position: absolute设置left、top、margin-left、margin-top(定高)

display: table-cell

transform: translate(x, y)

flex(不定高,不定宽)

grid(不定高,不定宽),兼容性相对比较差


内联元素居中布局

水平居中

行内元素可设置:text-align: center

flex布局设置父元素:display: flex; justify-content: center

垂直居中

单行文本父元素确认高度:height === line-height

多行文本父元素确认高度:display: table-cell; vertical-align: middle


相关文章
|
5天前
|
前端开发
除了伪元素清除法,还有哪些方法可以解决浮动布局的高度塌陷问题
【10月更文挑战第27天】不同的方法适用于不同的场景和布局需求,在实际开发中,需要根据具体情况选择最合适的方法来解决浮动布局的高度塌陷问题。
|
2月前
元素的浮动属性float
元素的浮动属性float。
15 6
|
6月前
|
前端开发
元素的宽度和高度
【5月更文挑战第4天】元素的宽度和高度。
38 8
|
6月前
|
前端开发 容器
css样式元素的相对定位,绝对定位,固定定位等元素定位运用技巧详解
css样式元素的相对定位,绝对定位,固定定位等元素定位运用技巧详解
元素居中的几种方式
元素居中的几种方式
67 0
元素水平垂直居中的六种方法
元素水平垂直居中的六种方法
90 1
|
前端开发 容器
【清除浮动的 5 种方法】
【清除浮动的 5 种方法】
|
前端开发 容器
关于html元素Css样式设置的一点心得(特别是与位置有关的,还有外边距、内边距有关的那些)
关于html元素Css样式设置的一点心得(特别是与位置有关的,还有外边距、内边距有关的那些)
122 0
关于html元素Css样式设置的一点心得(特别是与位置有关的,还有外边距、内边距有关的那些)
|
Windows
如何确定元素的尺寸
排查一个线上问题时发现 getBoundingClientRect() 方法返回的元素尺寸和元素实际渲染的尺寸不一致,而用 offsetWidth 和 offsetHeight 就是对的,有些奇怪,遂探究之。
155 0