Fügen Sie Platz zwischen HTML-Elementen nur mit CSS hinzu


105

Ich habe mehrere gleiche HTML-Elemente nacheinander:

<span>1</span>
<span>2</span>
<span>3</span>

Ich suche nach der besten Möglichkeit, Platz zwischen den Elementen nur mit CSS hinzuzufügen

[no space]  [1]  [space 10px]  [2]  [space 10px]  [3]  [no space]

Zusätzlich:

  • Bitte notieren Sie sich die Browserkompatibilität Ihrer Belege

AKTUALISIEREN

Es sieht so aus, als wäre ich unklar. Ich möchte KEIN ZUSÄTZLICHES HTML-MARKUP wie verwenden

<span></span>  <span></span>  <span class="last_span"></span>

Ich möchte keine Tabellen verwenden

Ich möchte, dass die erste und letzte Spanne automatisch von CSS erfasst werden

Ich möchte kein Javascript verwenden

Optionale Anforderung: Die letzte Spanne kann NICHT LETZTES KIND des übergeordneten Tags sein, aber es ist die LETZTE SPAN des übergeordneten Tags. Zwischen Spans befinden sich keine weiteren Tags.


Vielleicht sollten Sie eine Tabelle verwenden. Kommt darauf an, welche Daten in dentext
Madara's Ghost

Ist die Anzahl von spans variabel?
dreißig Punkte

@ Wahrheit letzter Ausweg sollten Tabellen sein.
Tim Joyce

Die spanElemente werden von dem Webdienst generiert, auf den ich keinen Zugriff habe. Ich kann das Markup also nicht ändern. Ich kann jedoch CSS vollständig nutzen
Dan

Bei Fragen wie diesen sollten Sie immer die gewünschte Browserunterstützung angeben. "Ich brauche IE7-Unterstützung" erhält völlig andere Antworten als "Ich verwende nur Chrome".
dreißig Punkte

Antworten:


244

Ein guter Weg, dies zu tun, ist folgender:

span + span {
    margin-left: 10px;
}

Jeder, spandem ein vorangestellt ist span(also jeder spanaußer dem ersten), wird haben margin-left: 10px.

Hier ist eine detailliertere Antwort auf eine ähnliche Frage: Trennzeichen zwischen Elementen ohne Hacks


10
Dies ist eine gute Lösung. Wenn sich Ihr Container jedoch über mehrere Zeilen erstreckt, schlägt dies fehl.
Savas Vedova

Es funktioniert auch mit Klassen wie diesen:.sidebar-img + .sidebar-text { margin-left: 40px; }
Parsecer

2
Wie gehen Sie vor, wenn die Elemente in die nächste Zeile übergehen?
Donnerstag,

@thdoan: Es hängt von Ihrem Layout, etc. Sie können so etwas wie versuchen dies .
dreißig Punkte

1
Ich bevorzuge die Lösung von reddtoric mit Gitter und Gitterlücke.
Alex Salomon

28

Verwenden Sie einfach Rand oder Polsterung.

In Ihrem speziellen Fall könnten Sie margin:0 10pxnur am 2. verwenden <span>.

AKTUALISIEREN

Hier ist eine schöne CSS3-Lösung ( jsFiddle ):

span {
    margin: 0 10px;
}

span:first-of-type {
    margin-left: 0;
}

span:last-of-type {
    margin-right: 0;
}

Erweiterte Elementauswahl unter Verwendung von Selektoren wie :nth-child(), :last-child, :first-of-typeusw. unterstützt , da Internet Explorer 9.


Sie haben eine gute Antwort, Simone, aber könnten Sie bitte die Frage lösen, ohne die letzte spanmanuell anzugeben ? Dies sollte die Aufgabe des CSS sein
Dan

Eine kleine Klarstellung für Downvoter: Die Antwort von @ dreißigdot ist großartig und ich mag sie sehr, aber sie liefert eine zusätzliche Antwortmargin-left auf die letzte span, was nicht genau das ist, was OP wollte.
Simone

Dies ist ein nicht genannter Hack, das ist die Eigenschaft "Wortabstand" für: w3schools.com/cssref/pr_text_word-spacing.asp Überprüfen Sie Bens Antwort
Arieljuod

Das OP wollte Platz zwischen den Bereichen, daher ist es in Ordnung, eine Lösung für Inline-Elemente
anzugeben. Die

Tatsächlich sagte das OP, dass er spans und divs (die Blockelemente sind) verwenden wird. Ihre Lösung ist trotzdem gültig, wenn Sie divs als Inline-Elemente definieren ...
Simone

15

Fügen Sie diese Regeln zum übergeordneten Container hinzu:

display: grid
grid-auto-flow: column
grid-column-gap: 10px

Gute Referenz: https://cssreference.io/

Browserkompatibilität: https://gridbyexample.com/browsers/


2
grid-auto-columns="max-content"kann auch nützlich sein. Dadurch wird die Größe des Rasterelements an den Inhalt angepasst. Auch die Browserkompatibilität sollte kein Problem mehr sein: caniuse.com/#feat=css-grid
Alex Salomon

Dies sollte die akzeptierte Antwort sein. Ich weiß, dass Kommentare nicht zum Dank sind, ich habe bisher nur das "Flex" -Display verwendet, und dieses "Grid" -Ding macht alles so einfach vom übergeordneten Container selbst! Um es nicht völlig nutzlos zu machen, würde die folgende Referenz hinzugefügt, die jedem, der mehr erfahren möchte, sehr hilft: css-tricks.com/snippets/css/complete-guide-grid
Rohan Kumar

11

Das ist so einfach.

Sie können Elemente so gestalten, dass Sie das erste ausschließen, nur in einer Codezeile:

span ~ span {
padding-left: 10px;
}

und fertig, ohne dass die Klasse manipuliert.


1
Dieser funktioniert perfekt. span + span hat nicht funktioniert, aber span ~ span funktioniert wie ein Zauber! Vielen Dank
Juliusmh

In meinem Fall habe ich mehrere Bereiche, von denen einige möglicherweise nicht die Klasse "Anzeigen" enthalten. Ich brauche also span.Showing ~ span.Showingstattdessen " span.Showing + span.Showing. ~ist der allgemeine Geschwister-Selektor, bei dem man nicht direkt einem anderen folgen muss.
Eric

10

Sie können die Tatsache nutzen, dass spanes sich um ein Inline-Element handelt

span{
     word-spacing:10px;
}

Diese Lösung wird jedoch unterbrochen, wenn Sie mehr als ein Textwort in Ihrer Spanne haben



3

Sie können so schreiben:

span{
 margin-left:10px;
}
span:first-child{
 margin-left:0;
}

2

<span>ist ein Inline-Element, sodass Sie keinen Abstand festlegen können, ohne die Blockebene festzulegen. Versuche dies

Horizontal

span{
    margin-right: 10px;
    float: left;
}

Vertikale

span{
    margin-bottom: 10px;
}

Kompatibel mit allen Browsern.


2

Sie sollten Ihre Elemente in einen Container einschließen , dann neue CSS3-Funktionen wie CSS- Raster und kostenlosen Kurs verwenden und dann grid-gap:valuedie für Ihr spezifisches Problem erstellten verwenden

span{
  border:1px solid red;
}
.inRow{
  display:grid;
  grid-template-columns:repeat(auto-fill,auto);
  grid-gap:10px /*This add space between elements, only works on grid items*/
}
.inColumn{
  display:grid;
  grid-template-rows:repeat(auto-fill,auto);
  grid-gap:15px;
}
<div class="inrow">
  <span>1</span>
  <span>2</span>
  <span>3</span>
</div>
<div class="inColumn">
  <span>4</span>
  <span>5</span>
  <span>6</span>
</div>


Ich wollte im CSS-Stil Platz zwischen Elementen einer div-Klasse schaffen. Ich habe Ihr Beispiel verwendet, um meinen Code dafür zu erstellen. Lief wie am Schnürchen. Danke dir!
Elias EstatisticsEU

1

Anstatt den Rand festzulegen und ihn nicht zu überschreiben, können Sie ihn auch sofort mit der folgenden Kombination richtig einstellen:

span:not(:first-of-type) {
    margin-left:  5px;
}

span:not(:last-of-type) {
    margin-right: 5px;
}

Gute Antwort, die Einschränkung ist die Browserunterstützung von :first-of-typeund :last-of-typeCSS-Selektoren.
Dan

... auch auf notUnterstützung für Ausdrucksbrowser prüfen
Dan

1
@Dan ist eigentlich toll, alle Browser der letzten Jahre sind abgedeckt. Aber ich muss zugeben, dass Yzojas Lösung noch schlauer ist :)
Jalooc

Diese Lösung ist in dem speziellen Fall überlegen, in dem Sie auch Ränder zwischen Elementen als Trennzeichen einfügen (z. B. wie ein UL in einem Navigationsgerät), da der Rand ordnungsgemäß in der Mitte des Abstands platziert wird.
Mir

0
span.middle {
    margin: 0 10px 0 10px; /*top right bottom left */
}

<span>text</span> <span class="middle">text</span> <span>text</span>

0

Wenn Sie verschiedene Elemente ausrichten möchten und an allen Seiten den gleichen Rand haben möchten, können Sie Folgendes verwenden. Jedes Element container, unabhängig vom Typ, erhält den gleichen umgebenden Rand.

Geben Sie hier die Bildbeschreibung ein

.container {
  display: flex;
}
.container > * {
  margin: 5px;
}

Wenn Sie Elemente in einer Reihe ausrichten möchten, das erste Element jedoch den äußersten linken Rand berührt containerund alle anderen Elemente gleich weit voneinander entfernt sind, können Sie Folgendes verwenden:

Geben Sie hier die Bildbeschreibung ein

.container {
  display: flex;
}
.container > :first-child {
  margin-right: 5px;
}
.container > *:not(:first-child) {
  margin: 5px;
}

2
Während dieser Code die Frage möglicherweise beantwortet, verbessert die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert.
β.εηοιτ.βε
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.