Heim > Web-Frontend > CSS-Tutorial > Verstehen Sie den automatischen Spielraum in Flex in einem Artikel

Verstehen Sie den automatischen Spielraum in Flex in einem Artikel

青灯夜游
Freigeben: 2020-07-01 10:26:18
nach vorne
3888 Leute haben es durchsucht

Um das Thema dieses Artikels einzuführen, schauen wir uns zunächst die Frage an: Wie lässt sich ein Element am schnellsten horizontal und vertikal zentrieren?

Horizontale und vertikale Zentrierung ist auch das häufigste Problem im CSS-Bereich. Die Methoden sind in verschiedenen Szenarien unterschiedlich und haben jeweils ihre eigenen Vor- und Nachteile. Nun, das Folgende sollte als das bequemste angesehen werden:

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

Es ist auch möglich, das obige display:flex durch display:inline-grid | zu ersetzen.

CodePen-Demo – Verwenden Sie Margin Auto, um Elemente horizontal und vertikal zu zentrieren

Wie man margin: auto das Element vertikal zentriert

Hmm. Dabei handelt es sich tatsächlich um die Frage, wie man margin: auto in vertikaler Richtung wirksam werden lässt.

Mit anderen Worten, warum kann margin: bei der herkömmlichen Anzeige: Block BFC (Blockformatierungskontext) Elemente automatisch in horizontaler Richtung, aber nicht in vertikaler Richtung zentrieren?

Normalerweise verwenden wir diesen Code:

div {
    width: 200px;
    height: 200px;
    margin: 0 auto;
}
Nach dem Login kopieren

Zentrieren Sie das Element horizontal relativ zum übergeordneten Element. Wenn wir jedoch möchten, dass das Element relativ zum übergeordneten Element vertikal zentriert ist, funktioniert die Verwendung von margin: auto 0 nicht.

BFC margin: auto Der Grund, warum das Element nicht vertikal zentriert werden kann

Sehen Sie sich das CSS-Dokument für Folgendes an Gründe, in Unter BFC:

Wenn sowohl margin-left als auch margin-right automatisch sind, sind ihre verwendeten Werte gleich, was zu einer horizontalen Zentrierung führt.

—CSS2 Visuelles Formatierungsmodell Details: 10.3.3

Wenn margin-top oder margin-bottom automatisch sind, ist ihr verwendeter Wert 0.

Details zum visuellen CSS2-Formatierungsmodell : 10.6.3

Bei einfacher Übersetzung sind im Kontext der Blockformatierung ihre Ausdruckswerte gleich, wenn margin-left und margin-right beide automatisch sind, was zu dem führt horizontale Zentrierung des Elements. (Der hier berechnete Wert ist die Hälfte des verbleibenden verfügbaren Platzes des Elements)

Und wenn margin-top und margin-bottom beide automatisch sind, dann sind ihre Werte beide 0, und natürlich , Vertikalität kann nicht richtungszentriert verursacht werden.

Verwenden Sie FFC/GFC, um <code><span style="font-size: 18px;">margin: auto</span>marge: auto das Element vertikal zu zentrieren

margin: autoOK, damit ein einzelnes Element

verwenden kann, um das Element in vertikaler Richtung zu zentrieren, muss sich das Element im FFC-Kontext (Flex Formatting Context) oder GFC-Kontext (Grid Formatting Context) befinden. Das ist unter diesen Werten:

{
    display: flex;
    display: inline-flex;
    display: grid;
    display: inline-grid;
}
Nach dem Login kopieren
FFC <code><span style="font-size: 18px;">margin: auto</span><code><span style="font-size: 18px;">margin: auto</span> Der Grund, warum Elemente zentriert werden können die vertikale Richtung

In diesem Artikel wird vorerst nicht auf das Rasterlayout eingegangen. Für unsere Geschäftsanforderungen ist es wahrscheinlicher, dass wir uns im Folgenden auf einige Leistungen des automatischen Randes konzentrieren im Flex-Kontext.

Nun, es gibt auch viele Front-End-Ingenieure, die scherzhaft Flex-Ingenieure genannt werden, und sie können jedes Layout flexen.

Überprüfen Sie das CSS-Dokument aus folgenden Gründen unter Anzeige: Flex:

● Vor der Ausrichtung über justify-content und align-self wird jeder positive freie Platz an auto verteilt Ränder in dieser Dimension.

CSS Flexible Box Layout Module Level 1 – 8.1 Ausrichten mit automatischen Rändern

Eine einfache Übersetzung, das Allgemeine Die Idee ist, dass im Flex-Formatierungskontext Elemente mit „margin: auto“ vor der Ausrichtung durch „justify-content“ und „align-self“ festgelegt werden. Hier wird der freie Platz dem automatischen Rand in dieser Richtung zugewiesen Ein wichtiger Punkt ist, dass die Randautomatik nicht nur in horizontaler Richtung, sondern auch in vertikaler Richtung wirksam wird, um den verbleibenden Platz automatisch zuzuweisen.

Verwenden Sie den automatischen Rand, um space-between | space-around

im Flex-Layout zu implementieren. Verstehen Sie den Kernsatz oben:

● Ausrichtung durch justify-content und align-self Zuvor alle frei Dem automatischen Rand wird in dieser Dimension Platz zugewiesen

Danach können wir den automatischen Rand verwenden, um space-between und space-around unter Flex-Layout zu simulieren.

Auto-Margin-Implementierungspace-around

Für ein solches Flex-Layout:

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

Wenn der CSS-Code lautet:

.g-flex {
    display: flex;
    justify-content: space-around;
}
 
li { ... }
Nach dem Login kopieren

Der Effekt ist wie folgt:

Verstehen Sie den automatischen Spielraum in Flex in einem Artikel

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

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

CodePen Demo -- margin auto 实现 flex 下的 space-around

自动 margin 实现 space-between

同理,使用自动 margin,也很容易实现 flex 下的 space-between,下面两份 CSS 代码的效果的一样的:

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

CodePen Demo -- margin auto 实现 flex 下的 space-between

当然,值得注意的是,很重要的一点:

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)在该维度中不起作用,因为 margin 将在排布后窃取该纬度方向剩余的所有可用空间。

也就是使用了自动 margin 的 flex 子项目,它们父元素设置的 justify-content 已经它们本身的 align-self 将不再生效,也就是这里存在一个优先级的关系。

使用自动 margin 实现 flex 下的 align-self: flex-start | flex-end | center

自动 margin 能实现水平方向的控制,也能实现垂直方向的控制,原理是一样的。

用 margin: auto 模拟 flex 下的 align-self: flex-start | flex-end | center,可以看看下面几个 Demo:

● CodePen Demo -- margin auto 实现 flex 下的 align-self: center

● CodePen Demo -- margin auto 实现 flex 下的 align-self: flex-end

不同方向上的自动 margin

OK,看完上面的一大段铺垫之后,大概已经初步了解了 FFC 下,自动 margin 的神奇。

无论是多个方向的自动 margin,抑或是单方向的自动 margin,都是非常有用的。

再来看几个有意思的例子:

使用 margin-left: auto 实现不规则两端对齐布局

假设我们需要有如下布局:

Verstehen Sie den automatischen Spielraum in Flex in einem Artikel

DOM 结构如下:

<ul class="g-nav">
    <li>导航A</li>
    <li>导航B</li>
    <li>导航C</li>
    <li>导航D</li>
    <li class="g-login">登陆</li>
</ul>
Nach dem Login kopieren

对最后一个元素使用 margin-left: auto,可以很容易实现这个布局:

.g-nav {
    display: flex;
}
 
.g-login {
    margin-left: auto;
}
Nach dem Login kopieren
Nach dem Login kopieren

此时, auto 的计算值就是水平方向上容器排列所有 li 之后的剩余空间。

当然,不一定是要运用在第一个或者最后一个元素之上,例如这样的布局,也是完全一样的实现:

Verstehen Sie den automatischen Spielraum in Flex in einem Artikel

<ul class="g-nav">
    <li>导航A</li>
    <li>导航B</li>
    <li>导航C</li>
    <li>导航D</li>
    <li class="g-login">登陆</li>
    <li>注册</li>
</ul>
Nach dem Login kopieren
.g-nav {
    display: flex;
}
 
.g-login {
    margin-left: auto;
}
Nach dem Login kopieren
Nach dem Login kopieren

Verstehen Sie den automatischen Spielraum in Flex in einem Artikel

Codepen Demo -- nav list by margin left auto

垂直方向上的多行居中

OK,又或者,我们经常会有这样的需求,一大段复杂的布局中的某一块,高度或者宽度不固定,需要相对于它所在的剩余空间居中:

Verstehen Sie den automatischen Spielraum in Flex in einem Artikel

这里有 5 行文案,我们需要其中的第三、第四行相对于剩余空间进行垂直居中。

这里如果使用 flex 布局,简单的 align-self 或者 align-items 好像都没法快速解决问题。

而使用自动 margin,我们只需要在需要垂直居中的第一个元素上进行 margin-top: auto,最后一个元素上进行 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>
Nach dem Login kopieren
.g-container {
    display: flex;
    flex-wrap: wrap;
    flex-direction: column;
}
 
.s-thirf {
    margin-top: auto;
}
 
.s-forth {
    margin-bottom: auto;
}
Nach dem Login kopieren

当然,这里将任意需要垂直居中剩余空间的元素用一个 div 包裹起来,对该 div 进行 margin: auto 0也是可以的。

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

使用 margin-top: auto 实现粘性 footer 布局

OK,最后再来看这样一个例子。

要求:页面存在一个 footer 页脚部分,如果整个页面的内容高度小于视窗的高度,则 footer 固定在视窗底部,如果整个页面的内容高度大于视窗的高度,则 footer 正常流排布(也就是需要滚动到底部才能看到 footer),算是粘性布局的一种。

看看效果:

Verstehen Sie den automatischen Spielraum in Flex in einem Artikel

嗯,这个需求如果能够使用 flex 的话,使用 justify-content: space-between 可以很好的解决,同理使用 margin-top: auto 也非常容易完成:

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

Codepen Demo -- sticky footer by flex margin auto

上面的例子旨在介绍更多自动 margin 的使用场景。当然,这里不使用 flex 布局也是可以实现的,下面再给出一种不借助 flex 布局的实现方式:

CodePen Demo -- sticky footer by margin/paddig

值得注意的点

自动 margin 还是很实用的,可以使用的场景也很多,有一些上面提到的点还需要再强调下:

  • 块格式化上下文中margin-topmargin-bottom 的值如果是 auto,则他们的值都为 0

  • flex 格式化上下文中,在通过 justify-contentalign-self 进行对齐之前,任何正处于空闲的空间都会分配到该方向的自动 margin 中去

  • 单个方向上的自动 margin 也非常有用,它的计算值为该方向上的剩余空间

  • 使用了自动 margin 的 flex 子项目,它们父元素设置的 justify-content 以及它们本身的 align-self 将不再生效

好了,本文到此结束,希望对你有帮助 :)

本文转载自:https://www.cnblogs.com/coco1s/p/10910588.html

原作者:ChokCoco

相关教程推荐:CSS视频教程

Das obige ist der detaillierte Inhalt vonVerstehen Sie den automatischen Spielraum in Flex in einem Artikel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage