CSS 技巧篇(七):設定元素居中

Madman0621發表於2019-02-26

以下將整理關於使用CSS使元素居中的一些方法

案例模版:

<body>
    <div id="main">
        <div id="center">這個塊居中</div> 
    </div>
</body>

<style>
    body{
        height: 200px;
    }
    #main{
        border:1px red solid;
    }
    #center{
        border: 1px green solid;
    }
</style>
複製程式碼

一、水平居中

1、使用margin:0 auto配合元素的width

#center{
    width: 100px;
    margin: 0 auto;
}
複製程式碼

要讓居中元素滿足兩個條件:其一,元素需要有一個固定寬度值;其二元素的margin-left和margin-right都必須設定為auto,這兩個條件少了任何一個都無法讓元素達到水平居中的效果。

缺點:需要固定居中元素的寬度。

注意:當元素處於position:absolute;時,margin:0 auto無效,需要將right於left都設為0才可以,如下所示:

#center{
    width: 100px;
    margin: 0 auto;
    position:absolute;
    right:0;
    left:0;
}
複製程式碼

2、使用絕對定位配合margin

#center{
    width: 100px;
    position: absolute;
    left: 50%;
    margin-left: -100px; /*值為width的一半*/
} 
複製程式碼

居中元素設定一個負的“margin-left”並且值等於寬度的一半,另外如果元素不是相對於瀏覽器的話,還需要在其父元素上設定一個相對定位“position: relative”。

缺點:需要固定居中元素的寬度。

以上兩種方式都必須設定固定的寬度值,下面將解決不需要固定寬度值的方法。

3、塊級父元素讓行內元素居中

#main{
    text-align: center;
}
複製程式碼

對居中元素的父元素設定text-align屬性。

優點:不需要設定元素的固定寬度。

缺點:居中元素必須是inline或者設定為inline-block。

4、利用relative定位與行內樣式

#main{
    display: inline-block;
    position: relative;
    left: 50%;
}
#center{
    display: inline-block;
    position: relative;
    right: 50%;
}
複製程式碼

1、將#main與#center全部設定為inline-block,將包裹他們的內容:

CSS 技巧篇(七):設定元素居中

2、將#main往右移其寬度的50%:

CSS 技巧篇(七):設定元素居中

3、然後將#center往左移其寬度的50%:

CSS 技巧篇(七):設定元素居中

4、最終#center元素居中。

優點:不需要設定元素的固定寬度。

缺點:居中元素的元素被設定為inline-block。

5、通過transform進行設定

#main{
    position: relative;
}
#center{
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
}
複製程式碼

首先left:50%先右移#main50%的寬度,然後通過translateX(-50%)在左移本身50%的寬度。

優點:不需要設定元素的固定寬度。

缺點:居中元素被設定為absolute。

6、通過flex-box

#main{
    display: flex; 
    justify-content: center; 
}
複製程式碼

優點:不需要設定元素的固定寬度。

缺點:父元素被設定為flex。

二、垂直居中

1、通過line-height

#main{
    height: 200px;
    line-height: 200px;
}
複製程式碼

居中元素的父元素必須要設定準確height數值。並且居中元素如果是多行文字將錯亂。這種方式適合小元素,單行文字。

缺點:需要固定父元素的height值,並且居中元素如果是多行文字將錯亂。僅適合小元素,單行文字。

2、使用絕對定位搭配margin

#main{
    position: relative;
}
#center{
    height: 50px;
    position: absolute;
    top: 50%;
    margin-top: -25px; /*值為height的一半*/
}
或
#center{
    height: 50px;
    position: absolute;
    top: calc(50% - 25px);
}
複製程式碼

缺點:需要固定居中元素的height值。

以上兩種方式都必須設定固定的height值,下面將解決不需要固定heignt值的方法。

3、通過table-cell與vertical-align

#main{
    height: 100%;
    display: table;
}
#center{
    display: table-cell;
    vertical-align: middle;
}
複製程式碼

父元素設定為display:table;子元素設定為display:table-cell;並且設定vertical-align:midden;

4、通過新增一個額外的標籤

<body>
    <div id="main">
        <div id="center">這個塊居中</div> 
        <div id="other"></div>
    </div>
</body>
<style>
#main{
    height: 100%;
}
#center,#other{
    display: inline-block;
    vertical-align: middle;
}
#other{
    height: 100%;
}
</style>
複製程式碼

為同一行的inline-block元素設定vertical-align:middle,該行內的inline-block元素會按照元素的垂直中心線對齊。

缺點:需要額外新增一個元素。

5、通過transform進行設定

#main{
    height:100%;
    position: relative;
}
#center{
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
}
複製程式碼

首先top:50%先下移#main50%的高度,然後通過translateY(-50%)在上移本身50%的高度。

優點:不需要設定元素的固定高度。

缺點:居中元素被設定為absolute。

下移到#main50%的高度還有另外的方式

#center{
    margin:50% auto 0; //下移到#main50%的高度
    transform: translateY(-50%);
}
或
#center{
    margin:50vh auto 0; //下移到視口50%的高度
    transform: translateY(-50%);
}
複製程式碼

6、通過flex-box

#main{
    height:100%;
    display: flex; 
    align-items: center; 
}
複製程式碼

優點:不需要設定元素的固定寬度。

缺點:父元素被設定為flex。

相關文章