Ajouter de l'espace entre les éléments HTML uniquement en utilisant CSS

105

J'ai plusieurs éléments HTML identiques les uns après les autres:

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

Je recherche la meilleure façon d'ajouter de l'espace ENTRE les éléments en utilisant uniquement CSS

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

Aditionellement:

  • Veuillez noter la compatibilité du navigateur de vos reçus

METTRE À JOUR

Il semble que je n'étais pas clair. Je ne souhaite pas utiliser de MARKUP HTML SUPPLÉMENTAIRE comme

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

Je ne veux pas utiliser de tableaux

Je veux que le premier et le dernier span soient ciblés automatiquement par CSS

Je ne veux pas utiliser javascript

Exigence facultative: la dernière étendue peut être NOT LAST CHILD de la balise parent, mais ce sera la LAST SPAN de la balise parent. Les travées n'ont pas d'autres balises entre elles.

Dan
la source
Vous devriez peut-être envisager d'utiliser une table. Dépend des données qui entrent dans letext
Madara's Ghost
Le nombre de spans est-il variable?
thirtydot
@Truth en dernier recours devrait être des tables.
Tim Joyce
Les spanéléments sont générés par le service Web auquel je n'ai pas accès. Je ne peux donc pas changer le balisage. Cependant, je peux utiliser pleinement CSS
Dan
Avec des questions comme celle-ci, vous devez toujours spécifier la prise en charge du navigateur dont vous avez besoin. "J'ai besoin du support IE7" recevra des réponses complètement différentes à "Je n'utilise que Chrome".
thirtydot

Réponses:

244

Une bonne façon de le faire est la suivante:

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

Chaque spanprécédé d'un span(donc, tous spansauf le premier) aura margin-left: 10px.

Voici une réponse plus détaillée à une question similaire: séparateurs entre éléments sans hacks

trentenaire
la source
10
C'est une bonne solution, mais si votre conteneur s'étend sur plusieurs lignes, il échoue.
Savas Vedova le
Cela fonctionne également avec des classes, comme ceci:.sidebar-img + .sidebar-text { margin-left: 40px; }
parsecer
2
Comment gérez-vous le retour des éléments à la ligne suivante?
thdoan
@thdoan: Cela dépend de votre mise en page, etc. Vous pouvez essayer quelque chose comme ça .
thirtydot
1
Je préfère la solution de reddtoric utilisant grid et grid-gap.
Alex Salomon
29

Utilisez simplement une marge ou un rembourrage.

Dans votre cas particulier, vous ne pouvez utiliser margin:0 10pxque le 2 <span>.

METTRE À JOUR

Voici une belle solution CSS3 ( jsFiddle ):

span {
    margin: 0 10px;
}

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

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

Sélection d'élément avancé à l' aide de sélecteurs aiment :nth-child(), :last-child, :first-of-type, etc. est pris en charge depuis Internet Explorer 9.

Simone
la source
Vous avez une bonne réponse, Simone, mais pourriez-vous s'il vous plaît résoudre la question sans spécifier la dernière spanmanuellement? Cela devrait être le travail du CSS
Dan
ceci est un hack non annoncé, c'est la propriété "word-spacing" pour: w3schools.com/cssref/pr_text_word-spacing.asp vérifier la réponse de Ben
arieljuod
l'OP voulait un espace entre les travées, il est donc normal de donner une solution pour les éléments en ligne, les propriétés margin / padding / first / last ne sont pas nécessaires ici et ne font qu'ajouter de la complexité
arieljuod
En fait, l'OP a dit qu'il utiliserait spans et divs (qui sont des éléments de bloc). Votre solution est valable de toute façon si vous définissez divs comme des éléments inline ...
Simone
16

ajoutez ces règles au conteneur parent:

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

Bonne référence: https://cssreference.io/

Compatibilité du navigateur: https://gridbyexample.com/browsers/

reddtoric
la source
2
grid-auto-columns="max-content"peut également être utile. Cela fera correspondre la taille de l'élément de la grille au contenu. De plus, la compatibilité du navigateur ne devrait plus être un problème: caniuse.com/#feat=css-grid
Alex Salomon
Cela devrait être la réponse acceptée. Je sais que les commentaires ne sont pas pour des remerciements, je n'utilisais que l'affichage «flex» jusqu'à présent, et cette chose «grille» rend tout si facile à partir du conteneur parent lui-même! Pour ne pas le laisser entièrement inutile, ajouterait la référence suivante qui aide beaucoup ceux qui cherchent à en savoir plus: css-tricks.com/snippets/css/complete-guide-grid
Rohan Kumar le
11

C'est si simple.

Vous pouvez styliser les éléments en excluant le premier, juste dans une ligne de code:

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

et c'est fait, sans aucune manipulation de classe.

Angie
la source
1
Celui-ci fonctionne parfaitement. span + span n'a pas fonctionné mais span ~ span fonctionne comme un charme! Merci
juliusmh
Dans mon cas, j'ai plusieurs travées, dont certaines peuvent ne pas contenir la classe "Affichage", donc ce dont j'ai besoin est à la span.Showing ~ span.Showingplace de span.Showing + span.Showing. ~est le sélecteur général des frères et sœurs, où l'on n'a pas besoin de suivre directement un autre.
Eric le
10

Vous pouvez profiter du fait qu'il spans'agit d'un élément en ligne

span{
     word-spacing:10px;
}

Cependant, cette solution échouera si vous avez plus d'un mot de texte dans votre étendue

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

Vous pouvez écrire comme ceci:

span{
 margin-left:10px;
}
span:first-child{
 margin-left:0;
}
sandeep
la source
2

<span>est un élément en ligne, vous ne pouvez donc pas les espacer sans le mettre à niveau. Essaye ça

Horizontal

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

Verticale

span{
    margin-bottom: 10px;
}

Compatible avec tous les navigateurs.

Moe Sweet
la source
2

Vous devez envelopper vos éléments dans un conteneur, puis utiliser de nouvelles fonctionnalités CSS3 telles que la grille css , un cours gratuit , puis utiliser grid-gap:valuecelui qui a été créé pour votre problème spécifique

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 Arias
la source
Je cherchais à ajouter de l'espace entre les éléments d'une classe div en utilisant le style css. J'ai utilisé votre exemple pour créer mon code pour cela. A fonctionné comme un charme. Je vous remercie!
Elias EstatisticsEU
1

Ou, au lieu de définir la marge et de la remplacer, vous pouvez simplement la définir correctement tout de suite avec le combo suivant:

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

span:not(:last-of-type) {
    margin-right: 5px;
}
jalooc
la source
Bonne réponse, la restriction est la prise en charge du navigateur :first-of-typeet des :last-of-typesélecteurs CSS.
Dan
... vérifiez également le notsupport du navigateur d'expression
Dan
1
@Dan c'est vraiment génial, tous les navigateurs des dernières années sont couverts. Mais je dois admettre que la solution de yzoja est encore plus intelligente :)
jalooc
Cette solution est supérieure dans le cas spécifique où vous allez également inclure des bordures entre éléments comme séparateurs (comme un UL dans un nav par exemple), car elle placera correctement la bordure au milieu de l'espacement.
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
la source
0

Si vous souhaitez aligner divers éléments et que vous souhaitez avoir la même marge sur tous les côtés, vous pouvez utiliser ce qui suit. Chaque élément avec container, quel que soit son type, recevra la même marge environnante.

entrez la description de l'image ici

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

Si vous souhaitez aligner des éléments dans une ligne, mais que le premier élément touche le bord le plus à gauche de containeret que tous les autres éléments soient espacés de manière égale, vous pouvez utiliser ceci:

entrez la description de l'image ici

.container {
  display: flex;
}
.container > :first-child {
  margin-right: 5px;
}
.container > *:not(:first-child) {
  margin: 5px;
}
Stefan Zhelyazkov
la source
2
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant la raison et / ou la manière dont ce code répond à la question améliore sa valeur à long terme.
β.εηοιτ.βε