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.

Dan
quelle
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

dreißig Punkte
quelle
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.

Simone
quelle
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/

reddtoric
quelle
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.

Angie
quelle
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

Ben
quelle
6
span:not(:last-child) {
    margin-right: 10px;
}
Vladyslav Savchenko
quelle
3

Sie können so schreiben:

span{
 margin-left:10px;
}
span:first-child{
 margin-left:0;
}
Sandeep
quelle
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.

Moe Süß
quelle
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>

John Balvin Arien
quelle
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;
}
jalooc
quelle
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>
Tim Joyce
quelle
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;
}
Stefan Zhelyazkov
quelle
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.
β.εηοιτ.βε