Agregue espacio entre elementos HTML solo usando CSS

105

Tengo varios elementos HTML iguales uno tras otro:

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

Estoy buscando la mejor manera de agregar espacio ENTRE los elementos usando solo CSS

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

Adicionalmente:

  • Anote la compatibilidad del navegador de sus recibos

ACTUALIZAR

Parece que no estaba claro. No quiero usar NINGÚN MARCADO HTML ADICIONAL como

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

No quiero usar tablas

Quiero que el primer y el último tramo sean segmentados automáticamente por CSS

No quiero usar javascript

Requisito opcional: el último intervalo no puede ser el ÚLTIMO HIJO de la etiqueta principal, pero será el ÚLTIMO VARÓN de la etiqueta principal. Los intervalos no tienen otras etiquetas entre ellos.

Dan
fuente
Quizás deberías considerar usar una mesa. Depende de los datos que entren en eltext
Madara's Ghost
¿Es el número de spans variable?
thirtydot
@La verdad, el último recurso deben ser las tablas.
Tim Joyce
Los spanelementos los genera el servicio web al que no tengo acceso. Entonces no puedo cambiar el marcado. Sin embargo, puedo usar CSS por completo
Dan
Con preguntas como esta, siempre debe especificar la compatibilidad del navegador que necesita. "Necesito compatibilidad con IE7" recibirá respuestas completamente diferentes a "Solo estoy usando Chrome".
thirtydot

Respuestas:

244

Una buena forma de hacerlo es esta:

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

Cada spanprecedido por un span(por lo tanto, todos spanexcepto el primero) tendrán margin-left: 10px.

Aquí hay una respuesta más detallada a una pregunta similar: separadores entre elementos sin hacks

treinta y dos
fuente
10
Esta es una buena solución, aunque si su contenedor se extiende a varias líneas, falla.
Savas Vedova
También funciona con clases, así:.sidebar-img + .sidebar-text { margin-left: 40px; }
parsecer
2
¿Cómo maneja cuando los artículos pasan a la siguiente línea?
jueves
@thdoan: Depende de tu diseño, etc. Puedes probar algo como esto .
thirtydot
1
Prefiero la solución de reddtoric usando grid y grid-gap.
Alex Salomon
28

Solo use margen o relleno.

En su caso específico, margin:0 10pxsolo podría usar el 2do <span>.

ACTUALIZAR

Aquí hay una buena solución CSS3 ( jsFiddle ):

span {
    margin: 0 10px;
}

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

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

De selección de elementos avanzada utilizando selectores como :nth-child(), :last-child, :first-of-type, etc. está soportado desde Internet Explorer 9.

Simone
fuente
Tienes una gran respuesta, Simone, pero ¿podrías resolver la pregunta sin especificar la última spanmanualmente? Este debería ser el trabajo del CSS
Dan
Una pequeña aclaración para los votantes negativos: la respuesta de @ thirtydot es asombrosa y me gusta mucho, pero produce un adicional margin-leftsobre el último span, que no es exactamente lo que OP quería.
Simone
este es un truco innecesario, esa es la propiedad "word-spacing" para: w3schools.com/cssref/pr_text_word-spacing.asp verifique la respuesta de Ben
arieljuod
el OP quería espacio entre tramos, por lo que está bien dar una solución para elementos en línea, las propiedades de margen / relleno / primera / última no son necesarias aquí y solo agregan complejidad
arieljuod
En realidad, el OP dijo que usará spans y divs (que son elementos de bloque). Su solución es válida de todos modos si define divs como elementos en línea ...
Simone
16

agregue estas reglas al contenedor principal:

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

Buena referencia: https://cssreference.io/

Compatibilidad del navegador: https://gridbyexample.com/browsers/

reddtoric
fuente
2
grid-auto-columns="max-content"también puede ser útil. Hará que el tamaño del elemento de la cuadrícula coincida con el contenido. Además, la compatibilidad del navegador ya no debería ser un problema: caniuse.com/#feat=css-grid
Alex Salomon
Esta debería ser la respuesta aceptada. Sé que los comentarios no son para agradecer, solo estaba haciendo uso de la pantalla 'flexible' hasta ahora, ¡y esto de la 'cuadrícula' lo hace todo tan fácil desde el contenedor principal! Para no dejarlo completamente inútil, agregaría la siguiente referencia que ayuda mucho a cualquiera que busque aprender más: css-tricks.com/snippets/css/complete-guide-grid
Rohan Kumar
11

Eso es tan fácil.

Puede diseñar elementos excluyendo el primero, solo en una línea de código:

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

y listo, sin manipulación de clases.

Angie
fuente
1
Este funciona a la perfección. span + span no funcionó, ¡pero span ~ span funciona como un encanto! Gracias
juliusmh
En mi caso, tengo varios intervalos, algunos de los cuales pueden no contener la clase "Mostrando", así que lo que necesito es en span.Showing ~ span.Showinglugar de span.Showing + span.Showing. ~es el selector general de hermanos, donde uno no necesita seguir directamente a otro.
Eric
10

Puede aprovechar el hecho de que spanes un elemento en línea

span{
     word-spacing:10px;
}

Sin embargo, esta solución se romperá si tiene más de una palabra de texto en su espacio

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

Puedes escribir así:

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

<span>es un elemento en línea, por lo que no puede espaciarlos sin que esté a nivel de bloque. Prueba esto

Horizontal

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

Vertical

span{
    margin-bottom: 10px;
}

Compatible con todos los navegadores.

Moe dulce
fuente
2

Debe envolver sus elementos dentro de un contenedor, luego usar las nuevas funciones de CSS3 como la cuadrícula css , curso gratuito y luego usar las grid-gap:valueque se crearon para su problema específico

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
fuente
Estaba buscando agregar espacio entre los elementos de una clase div usando el estilo css. Usé tu ejemplo para construir mi código para eso. Trabajado como un encanto. ¡Gracias!
Elias EstatisticsEU
1

O, en lugar de establecer el margen y anularlo, puede configurarlo correctamente de inmediato con el siguiente combo:

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

span:not(:last-of-type) {
    margin-right: 5px;
}
jalooc
fuente
Buena respuesta, la restricción es la compatibilidad con el navegador :first-of-typey los :last-of-typeselectores de CSS.
Dan
... también verifique la notcompatibilidad con el navegador de expresiones
Dan
1
@Dan es realmente genial, todos los navegadores de los últimos años están cubiertos. Pero debo admitir que la solución de yzoja es aún más inteligente :)
jalooc
Esta solución es superior en el caso específico de que también va a incluir bordes entre elementos como separadores (como un UL en un navegador, por ejemplo), ya que colocará correctamente el borde en el medio del espaciado.
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
fuente
0

Si desea alinear varios elementos y desea tener el mismo margen alrededor de todos los lados, puede usar lo siguiente. Cada elemento dentro container, independientemente del tipo, recibirá el mismo margen circundante.

ingrese la descripción de la imagen aquí

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

Si desea alinear elementos en una fila, pero el primer elemento toca el borde más a la izquierda containery todos los demás elementos están igualmente espaciados, puede usar esto:

ingrese la descripción de la imagen aquí

.container {
  display: flex;
}
.container > :first-child {
  margin-right: 5px;
}
.container > *:not(:first-child) {
  margin: 5px;
}
Stefan Zhelyazkov
fuente
2
Si bien este código puede responder a la pregunta, proporcionar un contexto adicional sobre por qué y / o cómo este código responde a la pregunta mejora su valor a largo plazo.
β.εηοιτ.βε