欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于flex 上下文中自動 margin的問題(完整例子)

  發(fā)布時(shí)間:2021-05-20 15:26:17   作者:ChokCoco   我要評論
本文給大家分享flex 上下文中神奇的自動 margin問題,代碼中通過使用 margin auto 水平垂直居中元素,文中給大家提供完整的代碼,喜歡的朋友跟隨小編一起學(xué)習(xí)下吧

為了引出本文的主題,先看看這個問題,最快水平垂直居中一個元素的方法是什么?

水平垂直居中也算是 CSS 領(lǐng)域最為常見的一個問題了,不同場景下的方法也各不相同,各有優(yōu)劣。嗯,下面這種應(yīng)該算是最便捷的了:

<div class="g-container">
    <div class="g-box"></div>
</div>
.g-container {
    display: flex;
}
 
.g-box {
    margin: auto;
}

上面的display: flex替換成display: inline-flex | grid | inline-grid也是可以的。

CodePen Demo -- 使用 margin auto 水平垂直居中元素

如何讓margin: auto在垂直方向上居中元素

嗯。這里其實(shí)就涉及了一個問題,如何讓margin: auto在垂直方向上生效?

換句話說,傳統(tǒng)的display: blockBFC(塊格式化上下文)下,為什么margin: auto在水平方向可以居中元素在垂直方向卻不行?

通常我們會使用這段代碼:

div {
    width: 200px;
    height: 200px;
    margin: 0 auto;
}

讓元素相對父元素水平居中。但是如果我們想讓元素相對父元素垂直居中的話,使用margin: auto 0是不生效的。

BFC 下margin: auto垂直方向無法居中元素的原因

查看 CSS 文檔,原因如下,在 BFC 下:

If both margin-left and margin-right are auto, their used values are equal, causing horizontal centring.

—CSS2 Visual formatting model details: 10.3.3

If margin-top, or margin-bottom are auto, their used value is 0.

CSS2 Visual formatting model details: 10.6.3

簡單翻譯下,在塊格式化上下文中,如果margin-leftmargin-right都是 auto,則它們的表達(dá)值相等,從而導(dǎo)致元素的水平居中。( 這里的計(jì)算值為元素剩余可用剩余空間的一半)

而如果margin-topmargin-bottom都是 auto,則他們的值都為 0,當(dāng)然也就無法造成垂直方向上的居中。

使用 FFC/GFC 使margin: auto在垂直方向上居中元素

OK,這里要使單個元素使用margin: auto在垂直方向上能夠居中元素,需要讓該元素處于 FFC(flex formatting context),或者 GFC(grid formatting context) 上下文中,也就是這些取值中:

{
    display: flex;
    display: inline-flex;
    display: grid;
    display: inline-grid;
}

FFC 下margin: auto垂直方向可以居中元素的原因

本文暫且不談 grid 布局,我們業(yè)務(wù)中需求中更多的可能是使用 flex 布局,下文將著重圍繞 flex 上下文中自動 margin 的一些表現(xiàn)。

嗯,也有很多前端被戲稱為 flex 工程師,什么布局都 flex 一把梭。

查看 CSS 文檔,原因如下,在dispaly: flex下:

Prior to alignment via justify-content and align-self, any positive free space is distributed to auto margins in that dimension.

CSS Flexible Box Layout Module Level 1 -- 8.1. Aligning with auto margins

簡單翻譯一下,大意是在flex 格式化上下文中,設(shè)置了margin: auto的元素,在通過justify-contentalign-self進(jìn)行對齊之前,任何正處于空閑的空間都會分配到該方向的自動 margin 中去

這里,很重要的一點(diǎn)是,margin auto 的生效不僅是水平方向,垂直方向也會自動去分配這個剩余空間。

使用自動 margin 實(shí)現(xiàn) flex 布局下的space-between | space-around

了解了上面最核心的這一句 :

在通過justify-contentalign-self進(jìn)行對齊之前,任何正處于空閑的空間都會分配到該維度中的自動 margin 中去

之后,我們就可以在 flex 布局下使用自動 margin 模擬實(shí)現(xiàn) flex 布局下的space-between以及space-around了。

自動 margin 實(shí)現(xiàn)space-around

對于這樣一個 flex 布局:

<ul class="g-flex">
    <li>liA</li>
    <li>liB</li>
    <li>liC</li>
    <li>liD</li>
    <li>liE</li>
</ul>

如果它的 CSS 代碼是:

.g-flex {
    display: flex;
    justify-content: space-around;
}
 
li { ... }

效果如下:

那么下面的 CSS 代碼與上面的效果是完全等同的:

.g-flex {
    display: flex;
    // justify-content: space-around;
}
 
li {
    margin: auto;
}

CodePen Demo -- margin auto 實(shí)現(xiàn) flex 下的 space-around

自動 margin 實(shí)現(xiàn)space-between

同理,使用自動 margin,也很容易實(shí)現(xiàn) flex 下的space-between,下面兩份 CSS 代碼的效果的一樣的:

.g-flex {
    display: flex;
    justify-content: space-between;
}
 
li {...}
.g-flex {
    display: flex;
    // justify-content: space-between;
}
 
li {
    margin: auto;
}
 
li:first-child {
    margin-left: 0;
}
 
li:last-child {
    margin-right: 0;
}

CodePen Demo -- margin auto 實(shí)現(xiàn) flex 下的 space-between

當(dāng)然,值得注意的是,很重要的一點(diǎn):

Note: If free space is distributed to auto margins, the alignment properties will have no effect in that dimension because the margins will have stolen all the free space left over after flexing.

CSS Flexible Box Layout Module Level 1 -- 8.1. Aligning with auto margins

意思是,如果任意方向上的可用空間分配給了該方向的自動 margin ,則對齊屬性(justify-content/align-self)在該維度中不起作用,因?yàn)?margin 將在排布后竊取該緯度方向剩余的所有可用空間。

也就是使用了自動 margin 的 flex 子項(xiàng)目,它們父元素設(shè)置的justify-content已經(jīng)它們本身的align-self將不再生效,也就是這里存在一個優(yōu)先級的關(guān)系。

使用自動 margin 實(shí)現(xiàn) flex 下的align-self: flex-start | flex-end | center

自動 margin 能實(shí)現(xiàn)水平方向的控制,也能實(shí)現(xiàn)垂直方向的控制,原理是一樣的。

margin: auto模擬 flex 下的align-self: flex-start | flex-end | center,可以看看下面幾個 Demo:

CodePen Demo -- margin auto 實(shí)現(xiàn) flex 下的 align-self: center

CodePen Demo -- margin auto 實(shí)現(xiàn) flex 下的 align-self: flex-end

不同方向上的自動 margin

OK,看完上面的一大段鋪墊之后,大概已經(jīng)初步了解了 FFC 下,自動 margin 的神奇。

無論是多個方向的自動 margin,抑或是單方向的自動 margin,都是非常有用的。

再來看幾個有意思的例子:

使用margin-left: auto實(shí)現(xiàn)不規(guī)則兩端對齊布局

假設(shè)我們需要有如下布局:

DOM 結(jié)構(gòu)如下:

<ul class="g-nav">
    <li>導(dǎo)航A</li>
    <li>導(dǎo)航B</li>
    <li>導(dǎo)航C</li>
    <li>導(dǎo)航D</li>
    <li class="g-login">登陸</li>
</ul>

對最后一個元素使用margin-left: auto,可以很容易實(shí)現(xiàn)這個布局:

.g-nav {
    display: flex;
}
 
.g-login {
    margin-left: auto;
}

此時(shí),auto的計(jì)算值就是水平方向上容器排列所有 li 之后的剩余空間。

當(dāng)然,不一定是要運(yùn)用在第一個或者最后一個元素之上,例如這樣的布局,也是完全一樣的實(shí)現(xiàn):

<ul class="g-nav">
    <li>導(dǎo)航A</li>
    <li>導(dǎo)航B</li>
    <li>導(dǎo)航C</li>
    <li>導(dǎo)航D</li>
    <li class="g-login">登陸</li>
    <li>注冊</li>
</ul>
.g-nav {
    display: flex;
}
 
.g-login {
    margin-left: auto;
}

Codepen Demo -- nav list by margin left auto

垂直方向上的多行居中

OK,又或者,我們經(jīng)常會有這樣的需求,一大段復(fù)雜的布局中的某一塊,高度或者寬度不固定,需要相對于它所在的剩余空間居中:

這里有 5 行文案,我們需要其中的第三、第四行相對于剩余空間進(jìn)行垂直居中。

這里如果使用 flex 布局,簡單的align-self或者align-items好像都沒法快速解決問題。

而使用自動 margin,我們只需要在需要垂直居中的第一個元素上進(jìn)行margin-top: auto,最后一個元素上進(jìn)行margin-bottom: auto即可,看看代碼示意:

<div class="g-container">
    <p>這是第一行文案</p>
    <p>這是第二行文案</p>
    <p class="s-thirf">1、剩余多行文案需要垂直居中剩余空間</p>
    <p class="s-forth">2、剩余多行文案需要垂直居中剩余空間</p>
    <p>這是最后一行文案</p>
</div>
.g-container {
    display: flex;
    flex-wrap: wrap;
    flex-direction: column;
}
 
.s-thirf {
    margin-top: auto;
}
 
.s-forth {
    margin-bottom: auto;
}

當(dāng)然,這里將任意需要垂直居中剩余空間的元素用一個 div 包裹起來,對該 div 進(jìn)行margin: auto 0也是可以的。

嗯,非常的好用且方便:CodePen Demo -- 自動margin快速垂直居中任意段落

使用margin-top: auto實(shí)現(xiàn)粘性 footer 布局

OK,最后再來看這樣一個例子。

要求:頁面存在一個 footer 頁腳部分,如果整個頁面的內(nèi)容高度小于視窗的高度,則 footer 固定在視窗底部,如果整個頁面的內(nèi)容高度大于視窗的高度,則 footer 正常流排布(也就是需要滾動到底部才能看到 footer),算是粘性布局的一種。

看看效果:

嗯,這個需求如果能夠使用 flex 的話,使用justify-content: space-between可以很好的解決,同理使用margin-top: auto也非常容易完成:

<div class="g-container">
    <div class="g-real-box">
        ...
    </div>
    <div class="g-footer"></div>
</div>
.g-container {
    height: 100vh;
    display: flex;
    flex-direction: column;
}
 
.g-footer {
    margin-top: auto;
    flex-shrink: 0;
    height: 30px;
    background: deeppink;
}

Codepen Demo -- sticky footer by flex margin auto

上面的例子旨在介紹更多自動 margin 的使用場景。當(dāng)然,這里不使用 flex 布局也是可以實(shí)現(xiàn)的,下面再給出一種不借助 flex 布局的實(shí)現(xiàn)方式:

CodePen Demo -- sticky footer by margin/paddig

值得注意的點(diǎn)

自動 margin 還是很實(shí)用的,可以使用的場景也很多,有一些上面提到的點(diǎn)還需要再強(qiáng)調(diào)下:

  • 塊格式化上下文中margin-topmargin-bottom的值如果是 auto,則他們的值都為 0
  • flex 格式化上下文中,在通過justify-contentalign-self進(jìn)行對齊之前,任何正處于空閑的空間都會分配到該方向的自動 margin 中去
  • 單個方向上的自動 margin 也非常有用,它的計(jì)算值為該方向上的剩余空間
  • 使用了自動 margin 的 flex 子項(xiàng)目,它們父元素設(shè)置的justify-content以及它們本身的align-self將不再生效

最后

更多精彩 CSS 技術(shù)文章匯總在我的Github -- iCSS,持續(xù)更新,歡迎點(diǎn)個 star 訂閱收藏。

到此這篇關(guān)于flex 上下文中自動 margin(完整例子)的文章就介紹到這了,更多相關(guān)flex 自動 margin內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!

相關(guān)文章

  • 前端CSS Grid 布局示例詳解

    CSS Grid 是一種二維布局系統(tǒng),可以同時(shí)控制行和列,相比 Flex(一維布局),更適合用在整體頁面布局或復(fù)雜模塊結(jié)構(gòu)中,這篇文章主要介紹了前端CSS Grid 布局詳解,需要的朋
    2025-04-16
  • CSS Padding 和 Margin 區(qū)別全解析

    CSS 中的 padding 和 margin 是兩個非?;A(chǔ)且重要的屬性,它們用于控制元素周圍的空白區(qū)域,本文將詳細(xì)介紹 padding 和 margin 的概念、區(qū)別以及如何在實(shí)際項(xiàng)目中使用它們
    2025-04-07
  • CSS will-change 屬性示例詳解

    will-change 是一個 CSS 屬性,用于告訴瀏覽器某個元素在未來可能會發(fā)生哪些變化,本文給大家介紹CSS will-change 屬性詳解,感興趣的朋友一起看看吧
    2025-04-07
  • CSS去除a標(biāo)簽的下劃線的幾種方法

    本文給大家分享在 CSS 中,去除a標(biāo)簽(超鏈接)的下劃線的幾種方法,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-04-07
  • 前端高級CSS用法示例詳解

    在前端開發(fā)中,CSS(層疊樣式表)不僅是用來控制網(wǎng)頁的外觀和布局,更是實(shí)現(xiàn)復(fù)雜交互和動態(tài)效果的關(guān)鍵技術(shù)之一,隨著前端技術(shù)的不斷發(fā)展,CSS的用法也日益豐富和高級,本文將
    2025-04-07
  • css中的 vertical-align與line-height作用詳解

    文章詳細(xì)介紹了CSS中的`vertical-align`和`line-height`屬性,包括它們的作用、適用元素、屬性值、常見使用場景、常見問題及解決方案,感興趣的朋友跟隨小編一起看看吧
    2025-03-26
  • 淺析CSS 中z - index屬性的作用及在什么情況下會失效

    z-index屬性用于控制元素的堆疊順序,值越大,元素越顯示在上層,它需要元素具有定位屬性(如relative、absolute、fixed或sticky),本文給大家介紹CSS 中z - index屬性的作用
    2025-03-21
  • CSS @media print 使用詳解

    文章詳細(xì)介紹了CSS中的打印媒體查詢@mediaprint包括基本語法、常見使用場景和代碼示例,如隱藏非必要元素、調(diào)整字體和顏色、處理鏈接的URL顯示、分頁控制、調(diào)整邊距和背景等
    2025-03-18
  • CSS模擬 html 的 title 屬性(鼠標(biāo)懸浮顯示提示文字效果)

    本文介紹了如何使用CSS模擬HTML的title屬性,通過鼠標(biāo)懸浮顯示提示文字效果,通過設(shè)置`.tipBox`和`.tipBox.tipContent`的樣式,實(shí)現(xiàn)了提示內(nèi)容的隱藏和顯示,感興趣的朋友一起
    2025-03-10
  • 前端 CSS 動態(tài)設(shè)置樣式::class、:style 等技巧(推薦)

    本文介紹了Vue.js中動態(tài)綁定類名和內(nèi)聯(lián)樣式的兩種方法:對象語法和數(shù)組語法,通過對象語法,可以根據(jù)條件動態(tài)切換類名或樣式;通過數(shù)組語法,可以同時(shí)綁定多個類名或樣式,此外
    2025-02-26

最新評論