Skip to content

Latest commit

 

History

History
158 lines (134 loc) · 4.94 KB

布局垂直居中.md

File metadata and controls

158 lines (134 loc) · 4.94 KB

垂直居中

首先将<html><body>的高度设置为100%(为演示父元素不定宽高的效果),并清除<body>的默认样式

    html,body{
        margin: 0;
        height: 100%;
    }

垂直居中大致分为两类,父元素定宽高与父元素不定宽高,将两类样式以及子容器设定好

    .set-parent,.dy-parent{
        width: 300px;
        height: 200px;
        background: #eee;
        margin: 10px 0;
    }
    .child{
        width: 20px;
        height: 10px;
        background: #fff;
    }
    .dy-parent{ 
        width: 30%;
        height: 20%;
    }

1. 父元素定宽高 position+margin

使用margin: auto使水平居中,将子容器设定为relative以在不脱离文档流的情况下偏移50%,由于本身子容器占用一定宽高,会将其撑下,使用margin使其向上偏移。
若是子容器使用absolute定位,则父容器应设置为relative,否则会其相对于static定位以外的第一个父元素进行定位,在本Demo中会以浏览器为基准定位;此外absolute无法使用margin: auto水平居中。

    <!-- 父元素定宽高 position+margin -->
    <div class="set-parent" >
        <div class="child" style="position: relative;top: 50%;margin: auto;margin-top: -5px;"></div>
    </div>

2. 父元素定宽高 position+transform

原理与position+margin相同,CSS3的transform使得div向上平移自身高度的50%。

<!-- 父元素定宽高 position+transform -->
    <div class="set-parent" >
        <div class="child" style="position: relative;top: 50%;margin: auto;transform: translateY(-50%);"></div>
    </div>

3. 父元素定宽高 position+calc

css3提供calc函数,能够进行动态计算

    <div class="set-parent" >
        <div class="child" style="position: relative;top: calc(50% - 5px);left: calc(50% - 10px);"></div>
    </div>

4. 父元素不定宽高 flex

flex布局可以说是布局神器,极其强大,现在大部分浏览器都兼容性flex布局

    <div class="dy-parent" style="display: flex;justify-content: center;align-items: center;">
        <div class="child" ></div>
    </div>

5. 父元素不定宽高 grid

Grid布局将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局
Grid布局与Flex布局有一定的相似性,都可以指定容器内部多个项目的位置。但是,它们也存在重大区别。
Flex 布局是轴线布局,只能指定"项目"针对轴线的位置,可以看作是一维布局。Grid 布局则是将容器划分成"行"和"列",产生单元格,然后指定"项目所在"的单元格,可以看作是二维布局。Grid 布局远比 Flex 布局强大。

    <div class="dy-parent" style="display: grid;justify-content: center;align-content: center;">
        <div class="child" ></div>
    </div>

6. 父元素不定宽高 table

table中有vertical-align属性设置垂直对齐方式

    <div class="dy-parent" style="display: table;">
        <div style="display: table-cell;vertical-align: middle;">
            <div class="child" style="margin: auto;" ></div>
        </div>
    </div>
上述垂直居中布局的Demo
<!DOCTYPE html>
<html>
<head>
    <title>垂直居中</title>
    <meta charset="utf-8">
</head>
<body>

    <!-- 父元素定宽高 position+margin -->
    <div class="set-parent" >
        <div class="child" style="position: relative;top: 50%;margin: auto;margin-top: -5px;"></div>
    </div>

    <!-- 父元素定宽高 position+transform -->
    <div class="set-parent" >
        <div class="child" style="position: relative;top: 50%;margin: auto;transform: translateY(-50%);"></div>
    </div>

    <!-- 父元素定宽高 position+calc -->
    <div class="set-parent" >
        <div class="child" style="position: relative;top: calc(50% - 5px);left: calc(50% - 10px);"></div>
    </div>

    <!-- 父元素不定宽高 flex -->
    <div class="dy-parent" style="display: flex;justify-content: center;align-items: center;">
        <div class="child" ></div>
    </div>

    <!-- 父元素不定宽高 grid -->
    <div class="dy-parent" style="display: grid;justify-content: center;align-content: center;">
        <div class="child" ></div>
    </div>

    <!-- 父元素不定宽高 table -->
    <div class="dy-parent" style="display: table;">
        <div style="display: table-cell;vertical-align: middle;">
            <div class="child" style="margin: auto;" ></div>
        </div>
    </div>


</body>
<style type="text/css">
    html,body{
        margin: 0;
        height: 100%;
    }
    .set-parent,.dy-parent{
        width: 300px;
        height: 200px;
        background: #eee;
        margin: 10px 0;
    }
    .child{
        width: 20px;
        height: 10px;
        background: #fff;
    }
    .dy-parent{
        width: 30%;
        height: 20%;
    }
</style>
</html>