Dado este HTML y CSS:
span {
display:inline-block;
width:100px;
background-color:palevioletred;
}
<p>
<span> Foo </span>
<span> Bar </span>
</p>
Como resultado, habrá un espacio de 4 píxeles de ancho entre los elementos SPAN.
Demostración: http://jsfiddle.net/dGHFV/
Entiendo por qué sucede esto, y también sé que podría deshacerme de ese espacio eliminando el espacio en blanco entre los elementos SPAN en el código fuente HTML, de esta manera:
<p>
<span> Foo </span><span> Bar </span>
</p>
Sin embargo, esperaba una solución CSS que no requiera la manipulación del código fuente HTML.
Sé cómo resolver esto con JavaScript: eliminando los nodos de texto del elemento contenedor (el párrafo), así:
// jQuery
$('p').contents().filter(function() { return this.nodeType === 3; }).remove();
Demostración: http://jsfiddle.net/dGHFV/1/
Pero, ¿se puede resolver este problema solo con CSS?
Respuestas:
Como esta respuesta se ha vuelto bastante popular, la estoy reescribiendo significativamente.
No olvidemos la pregunta real que se hizo:
Que es posible resolver este problema con CSS solo, pero no hay completamente robustos correcciones de estilo CSS.
La solución que tuve en mi respuesta inicial fue agregar
font-size: 0
al elemento padre, y luego declarar un sentidofont-size
sobre los hijos.http://jsfiddle.net/thirtydot/dGHFV/1361/
Esto funciona en versiones recientes de todos los navegadores modernos. Funciona en IE8. No funciona en Safari 5, pero sí funciona en Safari 6. Safari 5 es casi un navegador muerto ( 0.33%, agosto de 2015 ).
La mayoría de los posibles problemas con los tamaños de fuente relativos no son complicados de solucionar.
Sin embargo, si bien esta es una solución razonable si necesita específicamente una solución solo de CSS, no es lo que recomiendo si es libre de cambiar su HTML (como la mayoría de nosotros).
Esto es lo que yo, como desarrollador web razonablemente experimentado, hago para resolver este problema:
Si, eso es correcto. Elimino el espacio en blanco en el HTML entre los elementos de bloque en línea.
Es fácil. Es simple. Funciona en todas partes. Es la solución pragmática.
A veces tiene que considerar cuidadosamente de dónde vendrá el espacio en blanco. ¿Agregar otro elemento con JavaScript agregará espacios en blanco?No, no si lo haces correctamente.
Vamos a un viaje mágico de diferentes maneras de eliminar el espacio en blanco, con un nuevo HTML:
Puedes hacer esto, como hago habitualmente:
http://jsfiddle.net/thirtydot/dGHFV/1362/
O esto:
O use los comentarios:
O, si está utilizando PHP o similar:
O incluso puede omitir ciertas etiquetas de cierre por completo (todos los navegadores están bien con esto):
Ahora que me fui y te aburrí hasta la muerte con "mil maneras diferentes de eliminar los espacios en blanco, por tres veces", espero que te hayas olvidado por completo
font-size: 0
.Alternativamente, ahora puede usar flexbox para lograr muchos de los diseños para los que anteriormente haya utilizado inline-block: https://css-tricks.com/snippets/css/a-guide-to-flexbox/
fuente
:(
font-size:0
truco no sea una buena idea después de todo ...Para los navegadores conformes CSS3 hay
white-space-collapsing:discard
ver: http://www.w3.org/TR/2010/WD-css3-text-20101005/#white-space-collapsing
fuente
trim-inner
lugar dediscard
?text-space-collapse
:
discard
<p>A long text...</p>
, donde las etiquetas de apertura y cierre están en líneas separadas que el contenido del texto. Eso es algo que hago todo el tiempo para mantener mis archivos HTML ordenados y legibles.float
EDITAR:
hoy, deberíamos usar Flexbox .
ANTIGUA RESPUESTA:
Bien, aunque he votado tanto las respuestas
font-size: 0;
como lasnot implemented CSS3 feature
respuestas, después de intentarlo descubrí que ninguna de ellas es una solución real .En realidad, no hay una sola solución sin fuertes efectos secundarios.
Luego decidí eliminar los espacios (esta respuesta es sobre este argumento) entre los
inline-block
divs de miHTML
fuente (JSP
), convirtiendo esto:a esto
eso es feo, pero funciona.
Pero, espera un minuto ... ¿y si yo estoy generando mis divs dentro
Taglibs loops
(Struts2
,JSTL
, etc ...)?Por ejemplo:
Es absolutamente imposible pensar en todo eso, significaría
eso no es legible, difícil de mantener y comprender, etc.
La solución que encontré:
De esta forma, tendrá un código legible y correctamente sangrado.
Y, como un efecto secundario positivo, el
HTML source
, aunque infestado por comentarios vacíos, resultará correctamente sangrado;Tomemos el primer ejemplo. En mi humilde opinión, esto:
es mejor que esto:
fuente
Agregue comentarios entre elementos para NO tener un espacio en blanco. Para mí es más fácil que restablecer el tamaño de fuente a cero y luego volver a configurarlo.
fuente
Todas las técnicas de eliminación de espacio para
display:inline-block
son trucos desagradables ...Use Flexbox
Es increíble, resuelve todo este diseño de bloques en línea bs y, a partir de 2017, tiene un 98% de compatibilidad con el navegador (más si no te importan los viejos IE).
fuente
Añadir
display: flex;
al elemento padre. Aquí está la solución con un prefijo:Versión simplificada 👇
Arreglar con prefijo 👇
fuente
Esta es la misma respuesta que di sobre lo relacionado: Pantalla: Bloque en línea: ¿Qué es ese espacio?
En realidad, hay una manera muy simple de eliminar espacios en blanco del bloque en línea que es fácil y semántica. Se llama una fuente personalizada con espacios de ancho cero, lo que le permite contraer el espacio en blanco (agregado por el navegador para elementos en línea cuando están en líneas separadas) en el nivel de fuente usando una fuente muy pequeña. Una vez que declara la fuente, simplemente cambia la
font-family
en el contenedor y de nuevo en los niños, y listo. Me gusta esto:Traje al gusto. Aquí hay una descarga de la fuente que acabo de preparar en font-forge y convertí con el generador de fuentes web FontSquirrel. Me llevó todo 5 minutos. La
@font-face
declaración css está incluida: fuente de espacio de ancho cero comprimido . Está en Google Drive, por lo que deberá hacer clic en Archivo> Descargar para guardarlo en su computadora. Probablemente también necesitará cambiar las rutas de fuente si copia la declaración en su archivo css principal.fuente
flex-wrap
hasta al menos v28 ( ¿srsly? ), Pero este es un recurso perfecto hasta entonces.Dos opciones más basadas en el Módulo de texto CSS Nivel 3 (en lugar de
white-space-collapsing:discard
que se hayan eliminado del borrador de especificaciones):word-spacing: -100%;
En teoría, debe hacer exactamente lo que se necesita: acortar los espacios en blanco entre 'palabras' en el 100% del ancho del carácter del espacio, es decir, a cero. Pero parece que no funciona en ningún lado, desafortunadamente, y esta característica está marcada como 'en riesgo' (también se puede eliminar de la especificación).
word-spacing: -1ch;
Acorta los espacios entre palabras por el ancho del dígito '0'. En una fuente monoespacio debe ser exactamente igual al ancho del carácter de espacio (y cualquier otro carácter también). Esto funciona en Firefox 10+, Chrome 27+, y casi funciona en Internet Explorer 9+.
Violín
fuente
' '
y'0'
. En las fuentes no monoespaciales no hay una proporción mágica adecuada entre anchos' '
y'0'
caracteres, porch
lo que no es de mucha ayuda.word-spacing
, podríamos usarletter-spacing
un valor negativo grande arbitrario como se muestra en mi respuestaDesafortunadamente, es 2019 y
white-space-collapse
aún no está implementado.Mientras tanto, dele el elemento padre
font-size: 0;
y establezca elfont-size
en los hijos. Esto debería funcionarfuente
Use flexbox y realice una reserva (de las sugerencias anteriores) para navegadores antiguos:
fuente
Simple:
No es necesario tocar el elemento padre.
Solo condición aquí: el tamaño de fuente del elemento no debe definirse (debe ser igual al tamaño de fuente del elemento primario).
0.25em
es el predeterminadoword-spacing
W3Schools - propiedad de espacio entre palabras
fuente
tamaño de fuente: 0; puede ser un poco más complicado de administrar ...
Creo que las siguientes dos líneas son mucho mejores y más reutilizables, y ahorran tiempo que cualquier otro método. Yo personalmente uso esto:
Entonces puedes usarlo de la siguiente manera ...
Hasta donde yo sé (puedo estar equivocado) pero todos los navegadores admiten este método.
EXPLICACIÓN :
Esto funciona (tal vez -3px puede ser mejor) exactamente como lo anticiparía.
class="items"
en el padre de cada bloque en línea.NO tendrá la necesidad de volver a css y agregar otra regla css para sus nuevos bloques en línea.
Resolviendo dos problemas a la vez.
También tenga en cuenta que
>
(mayor que el signo) esto significa que * / todos los niños deben estar en línea bloqueada.http://jsfiddle.net/fD5u3/
NOTA: He modificado para acomodar para heredar el espacio entre letras cuando un contenedor tiene un contenedor secundario.
fuente
-4px
porletter-spacing
lo que puede no ser suficiente para grandes tamaños de fuente , por ejemplo: ver este violín , podríamos usar un valor mayor, como en mi postSin embargo, técnicamente no es una respuesta a la pregunta: "¿Cómo elimino el espacio entre los elementos de bloque en línea?"
Puede probar la solución flexbox y aplicar el código a continuación y se eliminará el espacio.
Puede obtener más información al respecto en este enlace: https://css-tricks.com/snippets/css/a-guide-to-flexbox/
fuente
No estoy muy seguro si desea hacer dos tramos azules sin un espacio o si desea manejar otros espacios en blanco, pero si desea eliminar el espacio:
Y hecho.
fuente
Generalmente usamos elementos como este en diferentes líneas, pero en caso de
display:inline-block
usar etiquetas en la misma línea, se eliminará el espacio, pero en una línea diferente no.Un ejemplo con etiquetas en una línea diferente:
Ejemplo con etiquetas en la misma línea
Otro método eficiente es un trabajo CSS que está utilizando
font-size:0
el elemento primario y le dafont-size
a un elemento secundario todo lo que desee.fuente
Tuve este problema ahora y desde
font-size:0;
que descubrí que en Internet Explorer 7 el problema persiste porque Internet Explorer piensa "¿Tamaño de fuente 0?!?! WTF ¿estás loco?" - Entonces, en mi caso tengo el restablecimiento de CSS de Eric Meyer y confont-size:0.01em;
una diferencia de 1 píxel de Internet Explorer 7 a Firefox 9, entonces, creo que esto puede ser una solución.fuente
fuente
float
ydisplay:inline-block
paraspan
s estaban destinados a ser retrocesos para el caso siflex
no es compatible, perofloat
descartarían efectivamente el efecto deinline-block
, por lo que este último parece redundante.He estado abordando esto recientemente y en lugar de configurar el padre y
font-size:0
luego volver a configurar el hijo a un valor razonable, he estado obteniendo resultados consistentes al configurar el contenedor principal yletter-spacing:-.25em
luego el hijo nuevamenteletter-spacing:normal
.En un hilo alternativo, vi a un comentarista mencionar que
font-size:0
no siempre es ideal porque las personas pueden controlar los tamaños mínimos de fuente en sus navegadores, negando por completo la posibilidad de establecer el tamaño de fuente en cero.El uso de ems parece funcionar independientemente de si el tamaño de fuente especificado es 100%, 15pt o 36px.
http://cdpn.io/dKIjo
fuente
Creo que hay un método muy simple / antiguo para esto que es compatible con todos los navegadores, incluso IE 6/7. Podríamos simplemente establecer
letter-spacing
un valor negativo grande en padre y luego volver a establecerlonormal
en elementos secundarios:fuente
letter-spacing:normal
todos los elementos secundarios.letter-spacing
es 99.99% de las veces comonormal
. el tamaño de fuente no tiene un valor tan fijo y depende en gran medida del diseño. podría ser un valor pequeño o un valor grande basado en la familia de fuentes y otras cosas ... Nunca recuerdo en mi vida ver / usar un valor especial (que no sea 0 / normal) paraletter-spacing
, así que creo que es más seguro y mejor elecciónLa respuesta más simple a esta pregunta es agregar.
css
enlace codepen: http://jsfiddle.net/dGHFV/3560/
fuente
Con corchetes PHP:
fuente
Voy a ampliar un poco la respuesta de user5609829, ya que creo que las otras soluciones aquí son demasiado complicadas / demasiado trabajo. La aplicación de a
margin-right: -4px
a los elementos de bloque en línea eliminará el espacio y es compatible con todos los navegadores. Vea el violín actualizado aquí . Para los interesados en el uso de los márgenes negativos, tratar de darle a este una lectura.fuente
La especificación Nivel 4 del Módulo de texto CSS define un
text-space-collapse
propiedad, que permite controlar cómo se procesa el espacio en blanco dentro y alrededor de un elemento.Entonces, con respecto a su ejemplo, solo tendría que escribir esto:
Desafortunadamente, ningún navegador está implementando esta propiedad todavía (a partir de septiembre de 2016) como se menciona en los comentarios a la respuesta de HBP .
fuente
Encontré una solución CSS pura que me funcionó muy bien en todos los navegadores:
fuente
Añadir
white-space: nowrap
al elemento contenedor:CSS:
HTML:
Aquí está el Plunker .
fuente
Hay un montón de soluciones como
font-size:0
,word-spacing
,margin-left
,letter-spacing
y así sucesivamente.Normalmente prefiero usar
letter-spacing
porque-1em
).word-spacing
ymargin-left
cuando establecemos un valor mayor como-1em
.font-size
no es conveniente cuando intentamos usarloem
comofont-size
unidad.Entonces,
letter-spacing
parece ser la mejor opción.Sin embargo, tengo que advertirte
cuando usas
letter-spacing
es mejor que uses otros-0.3em
o-0.31em
no.Si está utilizando Chrome (versión de prueba 66.0.3359.139) u Opera (versión de prueba 53.0.2907.99), lo que verá podría ser:
Si está utilizando Firefox (60.0.2), IE10 o Edge, lo que verá podría ser:
Eso es interesante. Entonces, verifiqué el espaciado entre letras y mdn y encontré esto:
Parece que esta es la razón.
fuente
Agregue
letter-spacing:-4px;
elp
CSS principal y agregueletter-spacing:0px;
a suspan
CSS.fuente
Pensé que agregaría algo nuevo a esta pregunta, ya que aunque muchas de las respuestas proporcionadas actualmente son más que adecuadas y relevantes, hay algunas nuevas propiedades CSS que pueden lograr una salida muy limpia, con soporte completo en todos los navegadores, y poco sin 'hacks'. Esto se aleja,
inline-block
pero le da los mismos resultados que la pregunta solicitada.Estas propiedades CSS son
grid
CSS Grid es altamente compatible ( CanIUse ) aparte de IE, que solo necesita un
-ms-
prefijo para que funcione.CSS Grid también es muy flexible, y toma todas las partes buenas de
table
,flex
yinline-block
elementos y los pone en un solo lugar.Al crear un
grid
puede especificar los espacios entre las filas y columnas. El espacio predeterminado ya está configurado,0px
pero puede cambiar este valor a lo que desee.Para acortarlo un poco, aquí hay un ejemplo de trabajo relevante:
fuente
display:grid
elemento está bloqueado, por lo que no es tanto lo que se muestra: la cuadrícula lo ayuda a trabajar con diseños de bloque en línea, sino que le permite reemplazar el trabajoinline-block
con algo donde puede controlar las 'canaletas' como Esta pregunta quiere. Además, estoy realmente sorprendido de que nadie haya respondido con una solución de diseño de cuadrícula CSS hasta ahora.inline-block
. Y sí, también me sorprendió, supongo que nadie congrid
experiencia realmente había llegado a esto antes. He estado jugando un poco y me encontré con esta pregunta, así que pensé por qué no: POtra forma que encontré es aplicar el margen izquierdo como valores negativos, excepto el primer elemento de la fila.
fuente
Cada pregunta que intenta eliminar el espacio entre
inline-block
s parece una<table>
...Intenta algo como esto:
fuente