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.


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


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.


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/


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.


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



3

Puedes escribir así:

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

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.


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>


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;
}

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>

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;
}

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.
β.εηοιτ.βε
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.