[Lesezeichen] CSS: Verwenden von Einrückung und Einrückung

Wenn sich mehrere Elemente einer Webseite nahe beieinander befinden, haben Benutzer das Gefühl, dass diese Elemente etwas gemeinsam haben. Die Gruppierung von Elementen hilft dem Benutzer, ihre Beziehung zu verstehen, indem der Abstand zwischen ihnen bewertet wird. Wenn sich alle Elemente im gleichen Abstand voneinander befinden würden, wäre es für den Benutzer schwierig, durch die Seite zu blättern, um herauszufinden, welche von ihnen miteinander in Beziehung stehen und welche nicht. Dieser Artikel widmet sich allem, was Sie über das Festlegen von Abständen zwischen Elementen und das Einrichten von Innenräumen von Elementen wissen müssen. Insbesondere werden wir darüber sprechen, in welchen Situationen es sich lohnt, interne Polster zu verwenden, und in welchen - externen (Rand).




CSS-Entfernungstypen


Es gibt zwei Arten von Abständen zwischen Elementen und ihren Teilen, die durch CSS angepasst werden können. Sie sind in Bezug auf das Element in interne und externe unterteilt. Stellen Sie sich vor, wir haben ein Element. Wenn zwischen einigen Teilen ein gewisser Abstand besteht, handelt es sich um einen internen Einzug. Wenn wir über den Abstand zwischen den einzelnen Elementen sprechen, ist dies der äußere Einzug.


Innenraum und Weltraum

In CSS kann der Abstand zwischen Elementen und ihren Komponenten wie folgt angepasst werden:

.element {
    padding: 1rem;
    margin-bottom: 1rem;
}

Die Eigenschaft wird paddinghier verwendet, um den Einzug anzupassen, und die Eigenschaft marginwird verwendet, um den Einzug zu konfigurieren. Alles ist sehr einfach. Wahrheit? Das Anpassen von Abständen in CSS kann jedoch sehr kompliziert sein, wenn Sie mit Komponenten arbeiten, die viele kleine Teile und Kinder haben.

▍ Margin Property - Einzug


Mit der Eigenschaft wird marginder Abstand zwischen einzelnen Elementen festgelegt. Im vorherigen Beispiel wurde beispielsweise die CSS-Eigenschaft verwendet margin-bottom: 1rem, um den vertikalen Abstand zwischen zwei übereinander angeordneten Elementen hinzuzufügen.

Der externe Einzug kann für vier Seiten eines Elements festgelegt werden (oben, rechts, unten, links - oben, rechts, unten, links). Bevor wir zu Beispielen und Diskussionen über verschiedene Arten der Entfernungseinstellung übergehen, ist es daher wichtig, einige grundlegende Konzepte zu beleuchten.

▍ Außenpolsterung reduzieren


Wenn wir das Konzept des „Zusammenbruchs der äußeren Ränder“ in einfachen Worten beschreiben, können wir sagen, dass dies geschieht, wenn zwei übereinander angeordnete Elemente äußere Ränder haben und der Einzug eines von ihnen größer ist als der Einzug des anderen. In diesem Fall wird ein größerer Einzug verwendet und der kleinere wird ignoriert.


Der größere Einzug gewinnt.

Im obigen Diagramm wird die Eigenschaft für das obere Element und die Eigenschaftmargin-bottomfür das untereElement konfiguriertmargin-top. Der vertikale Abstand zwischen den Elementen entspricht dem größeren dieser Einschnitte.

Um dieses Problem zu vermeiden, wird empfohlen, in allen Elementen den gleichen Einzug zu konfigurieren (wie hier beschrieben). Und hier ist noch eine interessante Tatsache. Die CSS Tricks-Ressource stimmte über die Verwendung von Eigenschaftenmargin-bottomund abmargin-top. Wie sich herausstellte, gewann die Immobiliemargin-bottommit 61% der Stimmen.

So lösen Sie dieses Problem:

.element:not(:last-child) {
    margin-bottom: 1rem;
}

Die Verwendung eines CSS-Selektors :noterleichtert das Entfernen des äußeren Einzugs des letzten untergeordneten Elements, um unnötigen Abstand zwischen den Elementen zu vermeiden.

Hier ist eine Demo zum Arbeiten mit äußeren Rändern.

Ein weiteres Beispiel für das Reduzieren von äußeren Rändern bezieht sich auf untergeordnete und übergeordnete Elemente. Angenommen, Sie haben den folgenden HTML-Code:

<div class="parent">
  <div class="child">I'm the child element</div>
</div>

Hier sind seine Stile:

.parent {
  margin: 50px auto 0 auto;
  width: 400px;
  height: 120px;
}

.child {
  margin: 50px 0;
}

So sieht das Ergebnis der Visualisierung aus.


Kind und Eltern

Beachten Sie, dass das Kind an der Oberseite des Elternteils anliegt. Dies ist das Ergebnis des Zusammenbruchs ihrer äußeren Ränder. Laut W3C gibt es verschiedene Möglichkeiten, um dieses Problem zu lösen:

  • Hinzufügen einer Eigenschaft borderzum übergeordneten Element.
  • Festlegen der Eigenschaft eines displayuntergeordneten Elements auf einen Wert inline-block.

Eine verständlichere Lösung für dieses Problem wäre, die Eigenschaft des padding-topübergeordneten Elements festzulegen.


Festlegen des oberen Einzugs des übergeordneten Elements

▍ Negativer Einzug


Ein negativer Wert kann für jede äußere Einkerbung verwendet werden. In einigen Fällen ist diese Technik sehr nützlich. Schauen Sie sich die folgende Abbildung an.


Ergebnisse der Festlegung der Auffüllungseigenschaft des übergeordneten Elements

Das übergeordnete Element verfügt über eine Eigenschaftpadding: 1rem. Dies führt dazu, dass das Kind Versätze von oben, links und rechts hat. Das Kind muss jedoch an die Grenzen des Elternteils angrenzen. Negative Außenränder tragen dazu bei.

.parent {
    padding: 1rem
}

.child {
    margin-left: -1rem;
    margin-right: -1rem;
    margin-top: -1rem;
}

Das ist das Ergebnis einer solchen Stilisierung.


Negative Außenränder des Kindes helfen, den gewünschten Effekt zu erzielen

Hier eine Demonstration

Wenn Sie sich für das Thema negative Außenränder interessieren, empfehle ich diesen Artikel.

▍Padding-Eigenschaft - innere Polsterung


Wie bereits erwähnt, paddingkönnen Sie mit der Eigenschaft den Raum innerhalb des Elements steuern. Der Zweck der Anwendung dieser Eigenschaft hängt von der Situation ab, in der sie verwendet wird.

Beispielsweise kann es verwendet werden, um den Platz um Links herum zu vergrößern. Dies führt zu einer Vergrößerung des anklickbaren Linkraums .


Grün eingerückt

▍ Situationen, in denen die Polsterungseigenschaft nicht funktioniert


Es ist wichtig zu beachten, dass der vertikale Einzug nicht mit Elementen funktioniert, die eine Eigenschaft haben display: inline. Dies sind beispielsweise Elemente <span>und <a>. Wenn Sie die Eigenschaft eines paddingsolchen Elements konfigurieren , funktioniert eine solche Einstellung für dieses Element nicht. Dies ist nur eine freundliche Erinnerung daran, dass Inline-Elemente eine Eigenschaft ändern müssen display:

.element span {
    display: inline-block;
    padding-top: 1rem;
    padding-bottom: 1rem;
}

Abstand zwischen CSS-Rasterlayoutelementen


Im CSS-Raster können Sie den Abstand zwischen Spalten und Zeilen mithilfe der Eigenschaft einfach anpassen grid-gap. Dies ist eine Abkürzung für eine Eigenschaft, die den Abstand zwischen Spalten und Zeilen definiert.


Abstände zwischen Spalten und Zeilen

.element {
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-gap: 16px; /*    16px     */
}

Eine vollständige Aufzeichnung dieser Eigenschaften sieht folgendermaßen aus:

.element {
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-row-gap: 24px;
    grid-column-gap: 16px;
}

Der Abstand zwischen CSS-Elementen eines Flexbox-Layouts


Für Raster- und Flexbox-Layouts wird eine Eigenschaft vorgeschlagen. Dies ist eine Eigenschaft gap. Derzeit wird dies nur von Firefox unterstützt .

.element {
    display: flex;
    flex-wrap: wrap;
    gap: 16px;
}

Darüber hinaus kann diese Eigenschaft nicht mit CSS verwendet werden, @supportsum festzustellen, ob sie unterstützt wird, und um auf dieser Grundlage geeignete Entscheidungen zu treffen. Wenn Ihnen diese Eigenschaft gefällt, stimmen Sie für das Hinzufügen zu Chrome ab.

Positionierungselemente in CSS


Möglicherweise kann die Positionierung von Elementen nicht direkt auf Möglichkeiten zur Anpassung des Abstands zwischen ihnen zurückgeführt werden, aber in einigen Fällen spielt die Positionierung eine Rolle. Zum Beispiel, wenn es ein absolut positioniertes untergeordnetes Element gibt, das sich am 16pxlinken und oberen Rand des übergeordneten Elements befinden muss.

Betrachten Sie das folgende Beispiel. Es gibt eine Karte, auf der sich ein Symbol befindet, das in einiger Entfernung vom oberen und linken Rand des übergeordneten Elements platziert werden muss. Um diesen Effekt zu erzielen, können Sie den folgenden Stil verwenden:

.category {
    position: absolute;
    left: 16px;
    top: 16px;
}



Der Abstand zwischen den Grenzen der übergeordneten und untergeordneten Elemente wird grün hervorgehoben.

Verwenden Sie Szenarien und Fallstudien


In diesem Abschnitt werden Szenarien für die Verwendung von Mitteln zum Anpassen der Abstände zwischen Elementen betrachtet. Ähnliches kann in Ihrer täglichen Arbeit mit CSS durchaus vorkommen.

▍ Header-Komponente



Eine Komponente ist eine Kopfzeile mit den folgenden Einstellungen: linker und rechter Einzug, Abstand um das Logo, Abstand um das Navigationselement, Abstand zwischen Navigationselement und Benutzername

In diesem Fall verfügt die Kopfzeilenkomponente über ein Logo, einen Navigationsbereich und einen Bereich, in dem Informationen angezeigt werden über Benutzerprofil. Können Sie sich vorstellen, wie der Stilisierungscode eines solchen Elements aussehen sollte? Hier zur Vereinfachung ein schematisches Markup eines solchen Elements:

<header class="c-header">
  <h1 class="c-logo"><a href="#">Logo</a></h1>
  <div class="c-header__nav">
    <nav class="c-nav">
      <ul>
        <li><a href="#">...</a></li>
      </ul>
    </nav>
    <a href="#" class="c-user">
      <span>Ahmad</span>
      <img class="c-avatar" src="shadeed.jpg" alt="">
    </a>
  </div>
</header>



Innen- und Außenrand

Linker und rechter Rand werden verwendet. Sie sollen sicherstellen, dass der Inhalt des Headers nicht an seinen Kanten haftet.

.c-header {
    padding-left: 16px;
    padding-right: 16px;
}

Beim Einrichten von Navigationslinks muss berücksichtigt werden, dass jeder von ihnen sowohl vertikal als auch horizontal genügend Innenraum haben sollte. Aus diesem Grund ist der anklickbare Bereich groß genug, wodurch die Zugänglichkeit des Projekts verbessert wird .

.c-nav a {
    display: block;
    padding: 16px 8px;
}

Wenn wir über den Abstand zwischen den Elementen sprechen, können Sie die Eigenschaft verwenden marginoder - Sie können die Eigenschaft der displayElemente <li>in ändern inline-block. Aus diesem Grund wird ein kleiner Abstand zwischen den auf derselben Ebene liegenden Elementen hinzugefügt, da solche Elemente als Symbole betrachtet werden.

.c-nav li {
    /*     ,     */
    display: inline-block;
}

Schließlich haben der Benutzername und der Avatar einen linken äußeren Einzug.

.c-user img,
.c-user span {
    margin-left: 10px;
}

Beachten Sie, dass beim Erstellen einer mehrsprachigen Website in dieser Situation empfohlen wird, logische CSS-Eigenschaften zu verwenden :

.c-user img,
.c-user span {
    margin-inline-start: 1rem;
}



Die Abstände vor und nach dem Trennzeichen sind nicht gleich.

Beachten Sie, dass die Abstände vor und nach dem Trennzeichen nicht gleich sind. Der Grund dafür ist, dass die Breite des Navigationsblocks nicht eingestellt ist. Stattdessen werden hier nur interne Einzüge konfiguriert. Infolgedessen hängt die Breite der Navigationselemente von ihrem Inhalt ab. Hier sind Lösungen für dieses Problem:

  • Festlegen der Mindestbreite für Navigationselemente.
  • Erhöhen Sie die horizontale Einkerbung.
  • Fügt einen zusätzlichen Einzug auf der linken Seite des Trennzeichens hinzu.

Der beste und einfachste Weg ist die Verwendung der dritten Methode, nämlich der Konfiguration der Eigenschaft margin-left:

.c-user {
    margin-left: 8px;
}

Hier ist eine Demo

▍ Abstände in Rasterlayouts - CSS Flexbox


Rasterlayouts sind der Ort, an dem häufig Technologien zum Anpassen des Abstands zwischen Elementen verwendet werden. Betrachten Sie das folgende Beispiel.


Rasterlayout

Wir müssen den Abstand zwischen den Zeilen und Spalten der Tabelle anpassen. Hier ist das Markup:

<div class="wrapper">
    <div class="grid grid--4">
        <div class="grid__item">
              <article class="card"><!--   --></article>
        </div>
        <div class="grid__item">
              <article class="card"><!--   --></article>
        </div>
        <!--   .. -->
    </div>
</div>

Normalerweise ziehe ich es vor, die Komponenten in einem gekapselten Zustand zu halten und zu vermeiden, dass ihre äußeren Einschnitte entstehen. Aus diesem Grund habe ich ein Element, grid_itemin dem sich das Kartenelement befindet.

.grid--4 {
    display: flex;
    flex-wrap: wrap;
}

.grid__item {
    flex-basis: 25%;
    margin-bottom: 16px;
}

Dank dieses CSS-Codes befinden sich in jeder Zeile vier Karten. Hier ist eine Möglichkeit, den Abstand zwischen ihnen anzupassen:

.grid__item {
    flex-basis: calc(25% - 10px);
    margin-left: 10px;
    margin-bottom: 16px;
}

Mit der CSS-Funktion wird die calc()Einrückung von abgezogen flex-basis. Wie Sie sehen, ist dies keine so einfache Lösung. Ich bevorzuge eigentlich Folgendes:

  • Legen Sie die Eigenschaft des Rasterelements fest padding-left.
  • Stellen Sie das übergeordnete Element so ein, dass es einen negativen äußeren Rand margin-leftmit demselben Wert wie y hat padding-left.

Ich habe vor vielen Jahren von dieser Methode erfahren, nachdem ich hier einen Artikel gelesen hatte , dessen Name bereits vergessen wurde (wenn Sie wissen, welche Art von Artikel - lassen Sie es mich bitte wissen).

.grid--4 {
    display: flex;
    flex-wrap: wrap;
    margin-left: -10px;
}

.grid__item {
    flex-basis: 25%;
    padding-left: 10px;
    margin-bottom: 16px;
}

Der Grund, warum ich hier einen negativen Wert verwendet habe, margin-leftist, dass die erste Karte eine Eigenschaft hat padding-left, die in Wirklichkeit nicht benötigt wird. Infolgedessen verschiebe ich das Wrapper-Element nach links und entferne unnötigen Platz.

→  Hier ist ein Arbeitsbeispiel.

Eine andere ähnliche Idee ist die Verwendung von Einrückungen und negativen Einrückungen. Hier ist ein Beispiel von der Facebook-Seite.


Innen- und Außenränder

Hier ist der CSS-Code, der diese Idee veranschaulicht:

.wrapper {
    margin-left: -4px;
    margin-right: -4px;
}

.story {
    padding-left: 4px;
    padding-right: 4px;
}

▍Entfernung in Rasterlayouts - CSS-Raster


Und jetzt - das Beste! In CSS-Grid-basierten Layouts lässt sich der Abstand zwischen Elementen mithilfe der Eigenschaft sehr bequem anpassen grid-gap. Außerdem können Sie sich keine Gedanken über die Breite der Elemente und die unteren Außenränder machen. Dafür sorgt das CSS-Grid-Layout.

.grid--4 {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    grid-gap: 1rem;
}

Das ist alles. Ich glaube, niemand wird argumentieren, dass das Einrichten von Grid-Layouts einfacher und verständlicher ist als das Einrichten von Flexbox-Layouts.

▍Stellen Sie den Abstand zwischen den Elementen nur bei Bedarf ein


In Rasterlayouts gefällt mir die Tatsache sehr gut, dass die Eigenschaft grid-gapnur angewendet wird, wenn zwischen den Elementen ein gewisser Abstand bestehen muss. Schauen Sie sich das folgende Layout an.


Das Layout des Rasters, in dem die Elemente in der mobilen Umgebung vertikal und auf dem Desktop angeordnet sind - horizontal.

Es gibt einen Abschnitt der Site mit zwei Karten. Sie müssen sowohl in einer mobilen Umgebung mit vertikaler Anordnung der Karten als auch in einem Desktop mit horizontaler Anordnung getrennt werden. Ohne CSS Grid ist eine solche Layoutflexibilität nicht zu erreichen. Schauen Sie sich den folgenden Code an:

.card:not(:last-child) {
    margin-bottom: 16px;
}

@media (min-width: 700px) {
    .card:not(:last-child) {
        margin-bottom: 0;
        margin-left: 1rem;
    }
}

Nicht sehr praktisch. Wahrheit? Was ist mit dem nächsten Stil?

.card-wrapper {
    display: grid;
    grid-template-columns: 1fr;
    grid-gap: 1rem;
}

@media (min-width: 700px) {
    .card-wrapper {
        grid-template-columns: 1fr 1fr;
    }
}

Es ist vollbracht! Und alles ist viel einfacher.

▍Arbeit mit unterer äußerer Einkerbung


Angenommen, die folgenden Komponenten befinden sich übereinander. Jeder von ihnen hat einen unteren äußeren Einzug.


Eine Reihe horizontal angeordneter Komponenten

Beachten Sie, dass für das letzte Element ein unterer Außenrand vorhanden ist. Und das ist falsch, da Einrückungen nur zwischen Elementen vorhanden sein sollten.

Sie können dieses Problem beheben, indem Sie auf eine der Lösungen zurückgreifen, die wir jetzt analysieren werden.

Lösung 1: CSS-Auswahl: nicht


.element:not(:last-child) {
    margin-bottom: 16px;
}

Lösung Nr. 2: eine Kombination benachbarter Elemente derselben Ebene


.element + .element {
    margin-top: 16px;
}

Entscheidungsanalyse


Obwohl Lösung Nr. 1 attraktiver erscheint, weist sie die folgenden Nachteile auf:

  • Dies führt zu CSS-spezifischen Problemen. Sie kann erst neu definiert werden, wenn ein Selektor verwendet wird :not.
  • Sie gilt nicht, wenn mehr als eine Spalte mit Elementen vorhanden ist. Dies ist unten dargestellt.


Zwei Spalten von Elementen und das Problem der Lösung Nr. 1

Wenn wir über die Lösung Nr. 2 sprechen, führt ihre Anwendung nicht zu Problemen mit der Spezifität. Diese Lösung eignet sich zwar auch nur in den Fällen, in denen es sich um eine einzelne Elementspalte handelt.

In dieser Situation ist es am besten, auf die Entscheidung zurückzugreifen, unnötigen Speicherplatz zu entfernen, indem dem übergeordneten Element ein negativer externer Einzug hinzugefügt wird:

.wrapper {
    margin-bottom: -16px;
}

Hier passiert folgendes. Dank dieser Einstellung wird das Element um einen Abstand nach unten verschoben, der der angegebenen externen Einrückung entspricht. Hier sollten Sie jedoch darauf achten, keinen solchen externen Einzug festzulegen, wenn Sie die Elemente verwenden, die sich überlappen würden.

▍ Komponentenkarte


Jetzt möchte ich die Einstellungen der Komponentenkarten ausführlich besprechen. Vielleicht bekomme ich am Ende ein ganzes Buch darüber. Hier werde ich ein universelles Muster für die Konfiguration von Karten betrachten und darüber sprechen, wie man sie verwaltet.


Komponentenkarte (wenn Sie Lust auf Essen haben - es tut mir leid)

Überlegen Sie, wo genau in dieser Karte der Abstand zwischen Elementen und ihren Teilen verwendet wird. Hier ist meine Antwort auf diese Frage.


Innen- und Außenrand

Hier ist das Markup:

<article class="card">
    <a href="#">
      <div class="card__thumb"><img src="food.jpg" alt=""></div>
      <div class="card__content">
        <h3 class="card__title">Cinnamon Rolls</font></h3>
        <p class="card__author">Chef Ahmad</p>
        <div class="card__rating"><span>4.9</span></div>
        <div class="card__meta"><!-- --></div>
      </div>
    </a>
</article>

Hier ist der Klassenstil card__content:

.card__content {
    padding: 10px;
}

Dank der hier eingestellten Einrückung wird der Versatz für alle Kinder festgelegt. Stellen Sie dann die äußeren Ränder auf:

.card__title,
.card__author,
.card__rating {
  margin-bottom: 10px;
}

Beim Einrichten der Trennung von Bewertung und Information habe ich den Rand verwendet:

.card__meta {
    padding-top: 10px;
    border-top: 1px solid #e9e9e9;
}

Aber hier stehen wir vor einem Problem! Der Rand ist nicht an die Kanten gebunden, was auf die card__contentEinrückung des übergeordneten Elements mit der Klasse zurückzuführen ist .


Das Trennzeichen ist nicht an die Kante gebunden.

Vielleicht haben Sie bereits vermutet, dass negative Einrückungen uns hier helfen werden:

.card__meta {
    padding-top: 10px;
    border-top: 1px solid #e9e9e9;
    margin: 0 -10px;
}

Aber auch hier ist etwas schief gelaufen. Jetzt ist der Text am Rand der Karte hängen geblieben.


Das Trennzeichen ist normal, aber der Inhalt der Karte befindet sich nicht richtig.

Um dieses Problem zu lösen, müssen Sie den linken und rechten Einzug für den Inhalt der Karte konfigurieren.

.card__meta {
    padding: 10px 10px 0 10px;
    border-top: 1px solid #e9e9e9;
    margin: 0 -10px;
}



Die Karte ist wie konfiguriert konfiguriert

Hier ein Beispiel

▍ Inhalt der Artikel


Ich bin sicher, dass das, worüber wir hier sprechen werden, eine sehr, sehr häufige Situation ist. Der Punkt hier ist, dass der Inhalt von Artikeln normalerweise auf Seiten von CMS (Content Management System - Inhaltsverwaltungssystem) geht oder automatisch basierend auf Markdown-Dateien generiert wird. Sie können hier keine Elementklassen angeben.

Betrachten Sie das folgende Beispiel, das ein Markup zeigt, das eine Mischung aus Überschriften, Absätzen und Bildern enthält.

<div class="wrapper">
  <h1>Spacing Elements in CSS</h1>
  <p><!-- content --></p>
  <h2><font color="#3AC1EF">Types of Spacing</font></h2>
  <img src="spacing-1.png" alt="">
  <p><!-- content --></p> 
  <p><!-- content --></p> 
  <h2><font color="#3AC1EF">Use Cases</font></h2>
  <p><!-- content --></p> 
  <h3><font color="#3AC1EF">▍Card Component</font></h3> 
  <img src="use-case-card-2.png" alt="">
</div>

Um alles zu einem anständigen Erscheinungsbild zu bringen, sollten die Abstände zwischen den Elementen gleichmäßig sein und verantwortungsbewusst verwendet werden. Während ich an diesem Beispiel arbeitete, habe ich einige Stile von type-scale.com ausgeliehen .

h1, h2, h3, h4, h5 {
  margin: 2.75rem 0 1.05rem;
}

h1 {
  margin-top: 0;
}

img {
  margin-bottom: 0.5rem;
}

Hier ist ein Diagramm der Seite mit dem Text des Artikels.


Seitenlayout und Anwendung der Eigenschaften "Rand oben" und "Rand unten"

Wenn auf ein Element<p>eine Überschrift folgt, z. B. eine ÜberschriftTypes of Spacing, wird die Eigenschaft desmargin-bottomElements<p>ignoriert. Dies ist, wie Sie sich vorstellen können, eine Folge des Zusammenbruchs der äußeren Ränder.

Hier ist ein Beispiel

▍ Externe Einrückung, falls zutreffend


Schauen Sie sich das folgende Layout an.


Elemente in normalem Zustand und in einer Situation, in der der Platz knapp wird

Elemente sehen nicht sehr gut aus, wenn sie zu nahe beieinander liegen. Ich habe dieses Layout mit Flexbox erstellt. Diese Technik wird als "Alignment Shifting Wrapping" bezeichnet. Von hier habe ich von ihrem Namen erfahren .

.element {
    display: flex;
    flex-wrap: wrap;
}

Infolge dieser Technik wird ein Zeilenumbruch durchgeführt, wenn der Anzeigebereich unter einem bestimmten Grenzwert liegt. So sieht es aus.


Untergeordnete Elemente befinden sich in neuen Zeilen.

Hier müssen Sie sich mit einer Zwischensituation befassen, in der zwei Elemente noch nebeneinander liegen, der Abstand zwischen ihnen jedoch Null ist. In diesem Fall greife ich lieber auf die Eigenschaft zurückmargin-right, die verhindert, dass sich die Elemente berühren, und die Reaktion beschleunigtflex-wrap.


Elemente berühren sich nicht

▍CSS-Eigenschaftsschreibmodus


Zuerst zitieren wir MDN : "Die Eigenschaft writing-modelegt die horizontale oder vertikale Position des Textes sowie die Blockrichtung fest."

Haben Sie jemals darüber nachgedacht, wie sich externe Einrückungen verhalten sollen, wenn sie mit einem Element verwendet werden, dessen Eigenschaft writing-modevom Standard abweicht? Betrachten Sie das folgende Beispiel.


Karte mit vertikalem Header.

Hier sind die Stile:

.wrapper {
    /*              */
    display: flex;
}

.title {
    writing-mode: vertical-lr;
    margin-right: 16px;
}

Der Header wird um 90 Grad gedreht. Zwischen ihm und dem Bild sollte ein leerer Raum sein. Wie sich herausstellte, margin-rightzeigt sich die Immobilie perfekt mit unterschiedlichen Werten der Immobilie writing-mode.

Hier ist ein Beispiel.

Ich glaube, wir haben genügend Einrückungsszenarien behandelt. Betrachten Sie nun einige interessante Konzepte.

Komponentenverkapselung


Große Designsysteme enthalten viele Komponenten. Wird es logisch sein, ihre äußeren Ränder anzupassen?

Betrachten Sie das folgende Beispiel.


Tasten

<button class="button">Save Changes</button>
<button class="button button-outline">Discard</button>

Wo muss ich den Abstand zwischen den Tasten einstellen? Muss ich einige Eigenschaften der linken oder rechten Schaltfläche konfigurieren? Vielleicht können Sie eine Kombination benachbarter Elemente derselben Ebene verwenden?

.button + .button {
    margin-left: 1rem;
}

Daran ist nichts Gutes. Was ist, wenn es nur einen Knopf gibt? Und wie funktioniert es auf einem mobilen Gerät, wenn sich die Tasten vertikal und nicht horizontal befinden? Generell stehen wir hier vor vielen schwierigen Fragen.

▍Verwenden von abstrahierten Komponenten


Die Lösung für die oben genannten Probleme ist die Verwendung abstrahierter Komponenten, mit denen andere Komponenten darin platziert werden. Wie hier gesagt , ist dies eine Verschiebung der Verantwortung für die Verwaltung des Auffüllens auf das übergeordnete Element. Wir überdenken das vorherige Beispiel im Lichte dieser Idee.


Übergeordnete und untergeordnete Komponenten

<div class="list">
    <div class="list__item">
        <button class="button">Save Changes</button>
    </div>
    <div class="list__item">
        <button class="button button-outline">Discard</button>
    </div>
</div>

Bitte beachten Sie, dass es Wrapper-Elemente gibt. Jede Schaltfläche hat einen eigenen Wrapper.

.list {
    display: flex;
    align-items: center;
    margin-left: -1rem; /*       */
}

.list__item {
    margin-left: 1rem;
}

Das ist alles! Darüber hinaus lässt sich dieses Konzept problemlos auf jedes JavaScript-Framework anwenden. Zum Beispiel:

<List>
  <Button>Save Changes</Button>
  <Button outline>Discard</Button>
</List>

Das verwendete JS-Tool sollte jedes Element in einen eigenen Wrapper einfügen.

Als Trennzeichen verwendete Komponenten


Wenn Sie Zweifel haben, dass Sie die Überschrift richtig gelesen haben, zögern Sie nicht. Wir sprechen über Komponenten, die als Trennzeichen verwendet werden. Insbesondere beziehe ich mich hier auf diesen Artikel, in dem das Konzept erläutert wird, bei dem die Verwendung von Einrückungen vermieden und stattdessen Trennkomponenten verwendet werden.

Stellen Sie sich vor, Sie benötigen in einem bestimmten Abschnitt der Site einen linken äußeren Einzug der Größe 24px. Gleichzeitig werden folgende Anforderungen an die Einrückung gestellt:

  • Externe Einrückungen sollten nicht direkt an der Komponente konfiguriert werden, da sie Teil eines bereits erstellten Entwurfssystems sind.
  • Die Einrückung muss flexibel sein. Auf einer Seite kann es eine Größe haben X, auf der anderen eine Größe Y.

Ich habe diesen Trick zum ersten Mal bemerkt, als ich das neue Facebook-Design erkundet habe .


Facebook Design Separator Element

Hier wird es als Separatorelement<div>mit Inline-Stil verwendetwidth: 16px. Der einzige Zweck besteht darin, einen leeren Raum zwischen dem linken Element und dem Containerelement hinzuzufügen.

Hier ein Zitat aus diesem React-Schulungshandbuch: „In der realen Welt benötigen wir jedoch Räume, die außerhalb von Komponenten definiert sind, um Komponenten in Seiten und Szenen anzuordnen. Hier gelangen die Einstellungen der äußeren Einkerbung in den Komponentencode, um die Abstände zwischen den Komponenten beim Zusammenbau anzupassen. “

Ich stimme dem zu. In einem großen Entwurfssystem ist das Hinzufügen von Einrückungen zu Komponenten irrational. Dies führt zu einem nicht so gut aussehenden Code.

▍ Probleme mit der Separator-Komponente


Nachdem Sie sich mit der Idee der Trennkomponenten vertraut gemacht haben, sprechen wir über einige der Probleme, die bei der Arbeit mit ihnen zu erwarten sind. Hier sind die Fragen, über die ich nachgedacht habe:

  • Wie nimmt eine Trennkomponente Platz in einer übergeordneten Komponente ein? Wie verhält er sich in horizontalen und vertikalen Layouts? Wie würde eine solche Komponente beispielsweise Komponenten vertikal und horizontal trennen?
  • Muss ich diese Komponenten basierend auf der Eigenschaft displayder übergeordneten Komponente (Flexbox, Grid) formatieren?

Lassen Sie uns diese Fragen untersuchen.

▍Größen der Abscheiderkomponenten


Sie können eine Trennkomponente erstellen, die verschiedene Parameter akzeptiert. Ich bin kein JavaScript-Entwickler, aber ich denke, das nennt man "Requisiten". Betrachten Sie das folgende Beispiel von hier .

Zwischen Headerund befindet sich eine Trennkomponente Section.

<Header />
<Spacer mb={4} />
<Section />

Und hier ist eine etwas andere Situation. Hier wird mit dem Trennzeichen ein automatisch einstellbarer Abstand zwischen dem Logo (Komponente Logo) und dem durch die Komponenten dargestellten Navigationsbereich erstellt Link.

<Flex>
  <Logo />
  <Spacer m="auto" />
  <Link>Beep</Link>
  <Link>Boop</Link>
</Flex>

Es scheint, dass die Implementierung eines solchen Trennzeichens mithilfe von CSS sehr einfach ist und ausreicht, um das Design zu verwenden justify-content: space-between. Aber was ist, wenn Sie das Design ändern müssen? In diesem Fall müssen Sie die Stilisierung ändern.

Schauen Sie sich das folgende Beispiel an. Sieht dieser Code flexibel aus?

<Flex>
  <Logo />
  <Link>Beep</Link>
  <Link>Boop</Link>
  <Spacer m="auto" />
  <Link>Boop</Link>
</Flex>

In diesem Fall muss die Stilisierung geändert werden.

In Bezug auf die Größe können wir sagen, dass die Größe des Trennzeichens basierend auf der Größe des übergeordneten Elements angepasst werden kann. Im obigen Fall kann es sinnvoll sein, eine Eigenschaft zu erstellen grow, die in CSS auf einen Wert festgelegt ist flex-grow: 1.

<Flex>
  <Spacer grow="1" />
</Flex>

▍Verwendung von Pseudoelementen


Eine andere Idee, die mir in den Sinn kam, war die Verwendung von Pseudoelementen, um Trennzeichen zu erstellen.

.element:after {
    content: "";
    display: block;
    height: 32px;
}

Vielleicht haben wir die Möglichkeit, ein Pseudoelement zum Trennzeichen zu machen und dafür kein separates Element zu verwenden? Zum Beispiel:

<Header spacer="below" type="pseudo" length="32">
  <Logo />
  <Link>Home</Link>
  <Link>About</Link>
  <Link>Contact</Link>
</Header>

Bisher habe ich in meinen Projekten keine Trennkomponenten verwendet. Aber ich suche nach Szenarien, in denen sie für mich nützlich sein könnten.

CSS-Mathematikfunktionen min (), max (), clamp ()


Kann Einrückung dynamisch sein? Ist es beispielsweise möglich, eine solche Einkerbung zu verwenden, deren minimale und maximale Größe von der Breite des Betrachtungsbereichs abhängt? Ich kann diese Frage positiv beantworten. CSS-Funktionen werden laut CanIUse- Daten von allen führenden Browsern unterstützt.

Erinnern Sie sich an Rasterlayouts und sprechen Sie darüber, wie dynamische Einrückungen in ihnen verwendet werden können.

.wrapper {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-gap: min(2vmax, 32px);
}

Konstruktion min(2vmax, 32px)bedeutet Folgendes: Verwenden Sie einen Abstand, der gleich 2vmax, aber nicht größer ist 32px.

→  Hier ist eine Videodemonstration eines solchen Layouts

→  Hier ist ein Beispiel.

Diese Flexibilität ist wirklich erstaunlich. Es gibt uns viele Möglichkeiten, dynamische und flexible Layouts von Webseiten zu erstellen.

Zusammenfassung


In diesem Artikel haben wir die Funktionen zum Anpassen der Abstände zwischen Elementen von Webseiten mithilfe von CSS untersucht und über die Verwaltung des internen Bereichs von Elementen gesprochen. Wir hoffen, Sie finden es nützlich, was Sie heute gelernt haben.

Liebe Leser! Welche Tools verwenden Sie am häufigsten, um den Abstand zwischen Webseitenelementen anzupassen?


All Articles