Eliminar espacios en blanco entre elementos HTML al usar saltos de línea

110

Tengo una página con una fila de aproximadamente 10 imgs. Para facilitar la lectura del HTML, quiero poner un salto de línea entre cada imgetiqueta, pero al hacerlo, se generan espacios en blanco entre las imágenes, lo cual no quiero. ¿Hay algo que pueda hacer además de romper en medio de las etiquetas en lugar de entre ellas?

Editar: Aquí hay una captura de pantalla de lo que tengo hasta ahora. Me gustaría que las imágenes del lomo del libro se mostraran en combinaciones aleatorias, usando PHP. Por eso necesito imgetiquetas separadas .

Captura de pantalla

Skilldrick
fuente
Si está usando Smarty , puede usar {strip}. Otros motores de plantilla deberían tener etiquetas similares.
usuario

Respuestas:

68

Podrías usar CSS. Configurar display: block, o float: left en las imágenes le permitirá definir su propio espaciado y formatear el HTML como desee, pero afectará el diseño de formas que podrían ser apropiadas o no.

De lo contrario, se trata de contenido en línea, por lo que el formato HTML es importante, ya que las imágenes actuarán efectivamente como palabras.

edeverett
fuente
Este es mi enfoque favorito. Aunque, a veces puede llevar a preguntarme por qué el texto no aparece si posteriormente me olvido de definir un tamaño de fuente para los elementos secundarios.
Astrotim
159

Lo siento si esto es viejo pero acabo de encontrar una solución.

Intente establecer el font-sizeen 0. Por lo tanto, los espacios en blanco entre las imágenes serán 0 de ancho y las imágenes no se verán afectadas.

No sé si esto funciona en todos los navegadores, pero lo probé con Chromium y algunos <li>elementos con display: inline-block;.

opatut
fuente
9
Puedo confirmar que esto funciona en Firefox y Safari en Mac OSX, así como en Chrome. No puedo creer que esta no sea la mejor respuesta. Qué gran idea, la única que creo que realmente responde a la pregunta / le da al solicitante lo que está buscando.
Doug
16
Excepto que esto romperá los diseños que utilizan emunidades.
devius
6
Establecer font-sizeen 0 significa que no puede usar la emunidad para un diseño escalable después de ese punto. Para algunas personas, esta respuesta es inútil.
LB--
3
También consultaría el análisis de Chris Coyier en su página, en la sección "Establecer el tamaño de fuente en cero", para obtener algunos detalles sobre otras instancias en las que esto podría no funcionar: css-tricks.com/fighting-the-space-between -inline-block-elements
Chris Kempen
Y ahora que tenemos flexbox, todo esto ya no es necesario :) Finalmente, buen diseño
opatut
70

Podrías usar comentarios.

 <img src="..." alt="..."><!--
 --><img src="..." alt="..."><!--
 --><img src="..." alt="..."><!--
 --><img src="..." alt="...">

Sin embargo, me preocuparía la semántica de tener una serie de imágenes una al lado de la otra.

Quentin
fuente
1
Buena idea. Las imágenes son para decoración, ¿importa semánticamente?
Skilldrick
13
Las imágenes decorativas pertenecen al CSS, no al HTML.
Konrad Rudolph
11
Depende de lo decorativas que sean las imágenes. ¿Una linda frontera? Eso debería estar en CSS. ¿Una serie de pequeñas fotos de aviones en un sitio sobre vuelos? Posiblemente contenido sin equivalente de texto necesario.
Quentin
1
@ MihaiAlexandruBîrsan - font-size:0es horrible en muchos casos porque pierdes la herencia. sí, puede usar remunidades, pero aún así, sus consultas de medios dejarán de funcionar para ese elemento y tendrá que modificarlas todas
vsync
1
Acabo de descubrir este pequeño truco y luego vi tu respuesta. Un poco de cruft, pero hace mucho para mantener el HTML no todo agrupado en una larga línea.
Nick Bedford
26

Tienes dos opciones sin hacer cosas aproximadas con CSS. La primera opción es usar javascript para eliminar los elementos secundarios de solo espacios en blanco de las etiquetas. Sin embargo, una mejor opción es utilizar el hecho de que los espacios en blanco pueden existir dentro de las etiquetas sin que tengan un significado. Al igual que:

<div id="[divContainer_Id]"
    ><img src="[image1_url]" alt="img1"
    /><img src="[image2_url]" alt="img2"
    /><img src="[image3_url]" alt="img3"
    /><img src="[image4_url]" alt="img4"
    /><img src="[image5_url]" alt="img5"
    /><img src="[image6_url]" alt="img6"
/></div>
Paul de Vrieze
fuente
2
De hecho, prefiero este estilo. Sí, es feo, pero no requiere hacks de CSS que puedan tener todo tipo de efectos secundarios.
Stijn de Witt
24

Flexbox puede solucionar fácilmente este viejo problema:

.image-wrapper {
  display: flex;
}

Más información sobre flexbox: https://css-tricks.com/snippets/css/a-guide-to-flexbox/

William Grasel
fuente
4
Hoy en día, Flexbox es la solución más limpia y sencilla. Creo que esta debería ser la mejor respuesta aquí. { flex-direction: row; flex-wrap: nowrap; }podría agregarse para mayor legibilidad.
Robert Kusznier
2
Esta es la mejor respuesta moderna
Nate
@RobertKusznier No estoy de acuerdo con especificar flex-direction: rowy flex-wrap: nowrap, de todos modos, son los predeterminados. ¡Mantenerlo simple es generalmente lo mejor! Además, la mayoría de las veces, el usuario querrá flex-wrap: wrap.
Marc.2377
13

Después de demasiada investigación, prueba y error, encontré una forma que parece funcionar bien y no requiere volver a configurar manualmente el tamaño de fuente en los elementos secundarios, lo que me permite tener un tamaño de fuente em estandarizado en todo el documento. .

En Firefox esto es bastante simple, simplemente configúrelo word-spacing: -1emen el elemento principal. Por alguna razón, Chrome ignora esto (y por lo que probé, ignora el espaciado de palabras independientemente del valor). Entonces, además de esto, agrego letter-spacing: -.31ema los padres y letter-spacing: normala los hijos. Esta fracción de em es el tamaño del espacio SOLO SI su tamaño de em está estandarizado . Firefox, a su vez, ignora los valores negativos para el espacio entre letras, por lo que no lo agregará al espacio entre palabras.

Probé esto en Firefox 13 (win / ubuntu, 14 en android), Google Chrome 20 (win / ubuntu), navegador Android en ICS 4.0.4 e IE 9. Y estoy tentado a decir que esto también puede funcionar en Safari, pero realmente no lo sé ...

Aquí hay una demostración http://jsbin.com/acucam

Flatline
fuente
1
Esta es, en mi opinión profesional, la mejor solución. Lo probé en Safari 5 y 6 en el escritorio, así como en Mobile Safari en un iPad de segunda generación. Sin embargo, funciona al restablecer el espaciado entre letras en un niño, también debe incluir el espaciado entre palabras: normal; como Safari lo honra. ¡Buen trabajo, Flatline!
hndcrftd
2
El word-spacing: -1emestilo parece hacer que las palabras se superpongan en la versión actual de Chrome.
Sam
@Sam perdón por la demora increíblemente larga: PI cambió el espaciado entre palabras a 0.05, parece que las nuevas versiones de Firefox no podrían preocuparse menos por ese atributo, con el espaciado entre letras es suficiente. Estoy en Ubuntu en este momento, así que no lo he probado en Windows. Aquí está la versión actualizada jsbin.com/acucam/14
Flatline
1
¿Intentaste esto con diferentes fuentes? Esto parece increíblemente poco convencional y es muy, muy probable que se rompa.
dudewad
12

Llego demasiado tarde (acabo de hacer una pregunta y me parece delgado en la sección relacionada) pero creo que display: table-cell; es una mejor solución

<style>
img {display:table-cell;}
</style>

<img src="img1.gif">
<img src="img2.gif">
<img src="img3.gif">

el único problema es que no funcionará en IE 7 y versiones anteriores, pero eso se puede arreglar con un truco

Vladimir
fuente
Esto es bueno, pero el único defecto es que los elementos pierden su capacidad de flotar en el centro si tienen text-align: center;
Mladen Janjetovic
Funciona, pero en caso de que desee alinear las imágenes al lado derecho simplemente con text-align: right (en el padre y sin flotante), la solución no encaja lamentablemente.
Herr_Hansen
2
Podría funcionar, pero algunos lectores de pantalla interpretan display: table-*semánticamente y leen como si el usuario estuviera navegando por una tabla.
Tarka
5

Utilice la hoja de estilo CSS para resolver este problema como el siguiente código.

[divContainer_Id] img
{
    display:block;
    float:left;
    border:0;
}

texto alternativo http://rabu4g.bay.livefilestore.com/y1pWoAOBMiLumd2iQTAreYjQCDIkHImh2g_b2g9k4AnxtDNrCjvzL6bK7skG8QKMRNWkMG7N8e5Xm7pgle3tdRJd2PLyPN08

Probando en Firefox 3.5 Final!

PD. su html debería gustarle esto.

<div id="[divContainer_Id]">
    <img src="[image1_url]" alt="img1" />
    <img src="[image2_url]" alt="img2" />
    <img src="[image3_url]" alt="img3" />
    <img src="[image4_url]" alt="img4" />
    <img src="[image5_url]" alt="img5" />
    <img src="[image6_url]" alt="img6" />
</div>
Soul_Master
fuente
Dijo "fila", no "columna" y su ejemplo HTML no es válido.
Quentin
3
Quiere una sola fila con varias imágenes en 'columnas'. Esta respuesta realmente resuelve el problema, aunque "display: block" es redundante.
Bobby Jack
3

¿Hay algo que pueda hacer además de romper en medio de las etiquetas en lugar de entre ellas?

Realmente no. Dado que los <img>s son elementos en línea, el renderizador HTML considera los espacios entre estos elementos como espacios verdaderos en el texto; los espacios redundantes (y saltos de línea) se truncarán, pero los espacios simples se insertarán en los datos de caracteres del elemento de texto.

La colocación de las <img>etiquetas puede prevenir esto absolutamente, pero desaconsejaría esto, ya que esto significaría colocar cada una de las imágenes manualmente en alguna medida de píxeles, lo que puede suponer mucho trabajo.

Konrad Rudolph
fuente
1

Otra solución sería utilizar saltos de línea no convencionales en lugares de espacios. Esto es similar a las respuestas del primer par y es una forma alternativa de alinear elementos. También es una técnica de optimización de super-borde porque reemplaza espacios en su marcado con retornos de carro.

<img
src="image1.jpg"><img
src="image2.jpg"><img
src="image3.jpg"><img
src="image4.jpg">

Tenga en cuenta que no hay espacios en ninguno de esos códigos. Los lugares donde los espacios se utilizan normalmente en HTML se reemplazan con retornos de carro. Es menos detallado que usar comentarios y usar espacios en blanco como recomendaba Paul de Vrieze.

Crédito a tech.co por este enfoque.

usuario1214836
fuente
1

espacio en blanco: inicial; Funciona para mi.

Artur
fuente
0

El espacio en blanco entre los elementos solo lo coloca el editor HTML con fines de formato visual. Puede usar jQuery para eliminar el espacio en blanco:

$("div#MyImages").each(function () {

    var div = $(this);
    var children= div.children();
    children.detach();
    div.empty();
    div.append(children);

});

Esto separa los elementos secundarios, borra cualquier espacio en blanco que quede antes de volver a agregar los elementos secundarios.

A diferencia de las otras respuestas a esta pregunta, el uso de este método garantiza que se mantengan los valores displayy los css heredados font-size. Tampoco hay necesidad de usar floaty lo engorroso clearque se requiere. Por supuesto, necesitará usar jQuery.

Oundless
fuente
10
Aunque esta solución funciona. Creo que es excesivo eliminar los espacios en blanco con javascript.
Lashae
1
Lo siento, pero uggghhhh ... Uno debería apuntar a codificar HTML correctamente en primer lugar, no estropearlo con JS después del hecho. Este último simplemente fomenta prácticas descuidadas con la idea de que el milagro [de la tos] de JS puede solucionarlo más tarde.
underscore_d
0

Personalmente, me gusta la respuesta aceptada que dice que no hay una forma exacta de hacer esto, no sin usar un truco de alguna forma.

Para mí, es un problema molesto que a veces puede hacer que pierda una hora preguntándose por qué una fila de casillas de verificación, por ejemplo, no están todas alineadas correctamente. que no me he acordado ... pero parece que no :(

En cuanto a la siguiente mejor respuesta, de usar el tamaño de fuente ... para mí, este es un truco desagradable que lo morderá más tarde al preguntarse por qué no se muestra su texto.

Por lo general, desarrollo mucho con PHP y, en el caso de que esté generando una cuadrícula de casillas de verificación, el contenido generado por PHP elimina este problema, ya que no inserta ningún espacio / ruptura.

Simplemente, sugeriría tener que lidiar con todas las imágenes en una sola línea juntas o usar un script del lado del servidor para generar el contenido / las imágenes.

Enojado 84
fuente
0

En lugar de usar para eliminar un CR / LF entre elementos, utilizo la instrucción de procesamiento SGML porque los minificadores a menudo eliminan los comentarios, pero no el PI XML. Cuando PHP procesa el PI de PHP, tiene el beneficio adicional de eliminar el PI por completo junto con el CR / LF intermedio, ahorrando así al menos 8 bytes. Puede utilizar cualquier nombre de instrucción válido arbitrario, como y guardar dos bytes en X (HT) ML.

John Freeman
fuente
0

Inspirado por la respuesta de Quentin , también puede colocar el cierre> junto al inicio de la siguiente etiqueta.

 <img src="..." alt="..."
 /><img src="..." alt="..."
 /><img src="..." alt="..."
 /><img src="..." alt="..."/>
Tiago Martins Peres 李大仁
fuente
-1

Hablando semánticamente, ¿no sería mejor usar una lista ordenada o desordenada y luego darle un estilo apropiado usando CSS?

<ul id="[UL_ID]">
    <li><img src="[image1_url]" alt="img1" /></li>
    <li><img src="[image2_url]" alt="img2" /></li>
    <li><img src="[image3_url]" alt="img3" /></li>
    <li><img src="[image4_url]" alt="img4" /></li>
    <li><img src="[image5_url]" alt="img5" /></li>
    <li><img src="[image6_url]" alt="img6" /></li>
</ul>

Usando CSS, podrá diseñar esto de la manera que desee y eliminar el espacio en blanco entre los libros.

Cyfer13
fuente
4
Poner las imágenes en los elementos de la lista no tiene ningún efecto sobre el espacio en blanco, incluso si es más semántico.
dangerousdave