元素居中

82 阅读2分钟

最近在面试,现在有点不想学习(其实不是有点,是很不想学习),就实践下面试被问的面试题吧

本文总结了垂直居中(6种方法),水平居中(5种方法),以及他们适用的范围。

将分为三部分: 公共代码,垂直居中,水平居中

公共样式、

定义了高度,只是方便查看,实际使用场景可能更复杂,但是垂直居中必然是父盒子有高度,水平居中必然是父盒子有高度

<style>
    .container {
        border: 1px solid red;
        height: 200px;
        width: 200px
    }
    .content {
        height: 50px;  width: 100px; background-color: red;
    }
</style>

垂直居中

方法一: 文本元素相对父盒子居中

适用场景: 因为是使用的行高属性,所以只适合单行文本的情况
注意:

  • line-height属性是会继承,所以场景2也是可以居中的
  • line-height: 1.5;行高是当前盒子字体的大小 * 15, content的字体大小 * 1.5
  • line-height: 150;行高是设置line-height的盒子字体大小 * 150%,container的字体大小 * 150%;
// 情景一
<div class="container" style="line-height: 200px">文字相对盒子居中</div>

// 情景二
<div class="container" style="line-height: 200px">
    <div class="content">123123</div>
</div>

方法二 postion + margin

使用场景:单独对某一个元素进行居中显示。

同时设置了top和bottom,top优先级更高

<div  class="container" style="position: relative;">
    <div  class="content" style="position: absolute; top: 0; bottom: 0;margin: auto">内部盒子</div>
</div>

方法三 postion+transform

使用场景:单独对某一个元素进行居中显示。

  • top: 50%是以父盒子的高度作为base进行计算的
  • transform: translateY(-50%)是以盒子自身高度作为base计算的
<div  class="container" style="position: relative;">
    <div  class="content" style="position: absolute; top: 50%; transform: translateY(-50%);">内部盒子</div>
</div>

方法四 flex + align-item

适用场景:将子元素(一个或多个)都垂直居中

align-item 控制交叉轴上对其的方式

<div class="container" style="display: flex; align-items: center; ">
    <div class="content" style="width: 80px;">内部盒子</div>
    <div class="content" style="width: 80px;">内部盒子</div>
</div>

方法五 grid + align-item

适用场景:将子元素(一个或多个)都垂直居中

flex是一维布局,grid是二维布局

// 情景一:只有一个子元素
<div class="container" style="display: grid; align-content: space-evenly;">
   <div class="content" style="width: 80px;">内部盒子</div>
</div>

// 情景二 多个子元素
<div class="container" style="display: grid; align-content: space-evenly; grid-template-columns: repeat(3, 100px);">
    <div class="content" style="width: 80px;">内部盒子</div>
    <div class="content" style="width: 80px;">内部盒子</div>
</div>

方法六 display + vertical-align

适用场景:只有一个子元素(多个的时候,建议用div进行包裹)

<div class="container" style="display: table-cell; vertical-align: middle;">
    <div class="content">内部盒子</div>
</div>

水平居中

整体思路和垂直居中差不多

方法一 文字相对盒子居中

<div  class="container" style="text-align: center;">文字相对盒子居中</div>

方法二 margin

<div  class="container" style="position: relative;">
    <div class="content" style="margin: auto">内部盒子</div>
</div>

方法三 postion+transform

<div  class="container" style="position: relative;">
    <div class="content" style="position: absolute; left: 50%; transform: translateX(-50%);">内部盒子</div>
</div>

方法四 flex

<div class="container" style="display: flex; justify-content: center;">
    <div class="content">内部盒子</div>
</div>

方法五 grid

<div class="container" style="display: grid; justify-content: center">
    <div class="content">内部盒子</div>
</div>