Aggiungi spazio tra gli elementi HTML solo utilizzando CSS


105

Ho diversi stessi elementi HTML che vanno uno dopo l'altro:

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

Sto cercando il modo migliore per aggiungere spazio TRA gli elementi utilizzando solo CSS

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

Inoltre:

  • Si prega di annotare la compatibilità del browser delle ricevute

AGGIORNARE

Sembra che non fossi chiaro. Non voglio usare ALCUN MARKUP HTML AGGIUNTIVO come

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

Non voglio usare le tabelle

Desidero che il primo e l'ultimo intervallo vengano scelti come target automaticamente dai CSS

Non voglio usare javascript

Requisito facoltativo: l'ultimo intervallo può essere NON LAST CHILD del tag genitore, ma sarà l'ULTIMO SPAN del tag genitore. Gli intervalli non hanno altri tag tra di loro.


Forse dovresti considerare l'utilizzo di un tavolo. Dipende da quali dati vengono inseriti neltext
Madara's Ghost

Il numero di spans è variabile?
30 punti il

@ La verità l'ultima risorsa dovrebbero essere i tavoli.
Tim Joyce

Gli spanelementi sono generati dal servizio web a cui non ho accesso. Quindi non posso cambiare il markup. Tuttavia, posso utilizzare completamente CSS
Dan

Con domande come questa, dovresti sempre specificare il supporto del browser che richiedi. "Ho bisogno del supporto di IE7" riceverà risposte completamente diverse a "Utilizzo solo Chrome".
30 punti il

Risposte:


244

Un buon modo per farlo è questo:

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

Ogni spanpreceduto da un span(quindi, tutti spantranne il primo) avrà margin-left: 10px.

Ecco una risposta più dettagliata a una domanda simile: separatori tra elementi senza hack


10
Questa è una buona soluzione, anche se se il tuo contenitore si estende su più righe non funziona.
Savas Vedova

Funziona anche con le classi, come questa:.sidebar-img + .sidebar-text { margin-left: 40px; }
parsecer

2
Come gestisci quando gli articoli vanno a capo alla riga successiva?
giovedì

@thdoan: Dipende dal layout, ecc Si può provare qualcosa di simile questo .
30 punti

1
Preferisco la soluzione di reddtoric usando grid e grid-gap.
Alex Salomon

29

Usa solo margine o imbottitura.

Nel tuo caso specifico, potresti usare margin:0 10pxsolo il 2 ° <span>.

AGGIORNARE

Ecco una bella soluzione CSS3 ( jsFiddle ):

span {
    margin: 0 10px;
}

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

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

Selezione Elemento avanzato utilizzando i selettori piace :nth-child(), :last-child, :first-of-type, ecc è supportato dal Internet Explorer 9.


Hai un'ottima risposta, Simone, ma potresti risolvere la domanda senza specificare l'ultima spanmanualmente? Questo dovrebbe essere il lavoro del CSS
Dan

questo è un trucco non registrato, questa è la proprietà "spaziatura delle parole" per: w3schools.com/cssref/pr_text_word-spacing.asp controlla la risposta di Ben
arieljuod

l'OP voleva spazio tra le campate, quindi va bene dare una soluzione per gli elementi in linea, le proprietà margin / padding / first / last non sono necessarie qui e aggiunge solo complessità
arieljuod

In realtà, il PO detto starà utilizzando spans e divs (che sono elementi di blocco). La tua soluzione è comunque valida se definisci divs come elementi inline ...
Simone

16

aggiungi queste regole al contenitore principale:

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

Buon riferimento: https://cssreference.io/

Compatibilità del browser: https://gridbyexample.com/browsers/


2
grid-auto-columns="max-content"può anche essere utile. Farà corrispondere le dimensioni dell'elemento della griglia al contenuto. Inoltre, la compatibilità del browser non dovrebbe più essere un problema: caniuse.com/#feat=css-grid
Alex Salomon

Questa dovrebbe essere la risposta accettata. So che i commenti non sono per ringraziamento, stavo solo utilizzando il display "flessibile" fino ad ora, e questa cosa della "griglia" rende tutto così facile dal contenitore genitore stesso! Per non lasciarlo del tutto inutile, aggiungerei il seguente riferimento che aiuta molto chi cerca di saperne di più: css-tricks.com/snippets/css/complete-guide-grid
Rohan Kumar

11

È così facile.

Puoi applicare uno stile agli elementi escludendo il primo, solo in una riga di codice:

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

e fatto, senza manipolare la classe.


1
Questo funziona perfettamente. span + span non ha funzionato ma span ~ span funziona come un incantesimo! Grazie
juliusmh

Nel mio caso, ho diversi intervalli, alcuni dei quali potrebbero non contenere la classe "Visualizzazione", quindi quello che mi serve è span.Showing ~ span.Showinginvece di span.Showing + span.Showing. ~è il selettore di fratelli generali, in cui non è necessario seguirne direttamente un altro.
Eric,

10

Puoi trarre vantaggio dal fatto che spanè un elemento in linea

span{
     word-spacing:10px;
}

Tuttavia, questa soluzione non funzionerà se hai più di una parola di testo nel tuo intervallo



3

Puoi scrivere in questo modo:

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

2

<span>è un elemento in linea, quindi non puoi creare spaziatura su di essi senza renderlo a livello di blocco. Prova questo

Orizzontale

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

Verticale

span{
    margin-bottom: 10px;
}

Compatibile con tutti i browser.


2

Dovresti avvolgere i tuoi elementi all'interno di un contenitore, quindi utilizzare le nuove funzionalità CSS3 come la griglia CSS , il corso gratuito e quindi utilizzare grid-gap:valuequello creato per il tuo problema specifico

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>


Stavo cercando di aggiungere spazio tra gli elementi di una classe div utilizzando lo stile CSS. Ho usato il tuo esempio per creare il mio codice per questo. Ha funzionato come un fascino. Grazie!
Elias EstatisticsEU

1

Oppure, invece di impostare il margine e di sovrascriverlo, puoi semplicemente impostarlo correttamente subito con la seguente combinazione:

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

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

Buona risposta, la restrizione è il supporto del browser :first-of-typee :last-of-typeselettori CSS.
Dan

... controlla anche il notsupporto del browser delle espressioni
Dan

1
@ Dan è davvero fantastico, tutti i browser degli ultimi anni sono coperti. Ma devo ammettere che la soluzione di yzoja è ancora più intelligente :)
jalooc

Questa soluzione è migliore nel caso specifico in cui includerai anche i bordi tra gli elementi come separatori (quindi come un UL in un nav, per esempio), poiché posizionerà correttamente il bordo al centro della spaziatura.
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

Se desideri allineare vari elementi e desideri avere lo stesso margine su tutti i lati, puoi utilizzare quanto segue. Ogni elemento all'interno container, indipendentemente dal tipo, riceverà lo stesso margine circostante.

inserisci qui la descrizione dell'immagine

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

Se desideri allineare gli elementi in una riga, ma fai in modo che il primo elemento tocchi il bordo più a sinistra di container e tutti gli altri elementi siano equidistanti, puoi utilizzare questo:

inserisci qui la descrizione dell'immagine

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

2
Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo sul perché e / o come questo codice risponde alla domanda ne migliora il valore a lungo termine.
β.εηοιτ.βε
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.