Suppression des espaces entre les éléments HTML lors de l'utilisation de sauts de ligne


110

J'ai une page avec une ligne d'environ 10 imgs. Pour la lisibilité du HTML, je veux mettre un saut de ligne entre chaque imgbalise, mais cela rend les espaces entre les images, ce que je ne veux pas. Puis-je faire autre chose que casser au milieu des balises plutôt qu'entre elles?

Edit: Voici une capture d'écran de ce que j'ai jusqu'à présent. Je voudrais que les images du dos du livre s'affichent dans des combinaisons aléatoires, en utilisant PHP. C'est pourquoi j'ai besoin de imgbalises séparées .

Capture d'écran


Si vous utilisez Smarty , vous pouvez utiliser {strip}. Les autres moteurs de modèles doivent avoir des balises similaires.
utilisateur

Réponses:


68

Vous pouvez utiliser CSS. Le réglage display: block, ou float: left sur les images vous permettra de définir votre propre espacement et de formater le HTML comme vous le souhaitez, mais affectera la mise en page de manière appropriée ou non.

Sinon, vous avez affaire à du contenu en ligne, le formatage HTML est donc important - car les images agiront effectivement comme des mots.


C'est mon approche préférée. Cependant, cela peut conduire à se demander parfois pourquoi le texte n'apparaît pas si j'oublie par la suite de définir une taille de police pour les éléments enfants.
Astrotim

159

Désolé si c'est vieux mais je viens de trouver une solution.

Essayez de régler le font-sizesur 0. Ainsi, les espaces blancs entre les images auront une largeur de 0 et les images ne seront pas affectées.

Je ne sais pas si cela fonctionne dans tous les navigateurs, mais je l'ai essayé avec Chromium et certains <li>éléments avec display: inline-block;.


9
Je peux confirmer que cela fonctionne dans Firefox et Safari sur Mac OSX, ainsi que Chrome. Je ne peux pas croire que ce ne soit pas la meilleure réponse. Quelle bonne idée, la seule que je pense répond vraiment à la question / donne au demandeur ce qu'il recherche.
Doug

16
Sauf que cela cassera les dispositions utilisant des emunités.
devius

6
La valeur font-size0 signifie que vous ne pouvez pas utiliser l' emunité pour une conception évolutive après ce point. Pour certaines personnes, cette réponse est inutile.
LB--

3
Je consulterais également l'analyse de Chris Coyier sur sa page, dans la section "Définir la taille de la police à zéro", pour quelques détails sur d'autres instances où cela pourrait ne pas fonctionner: css-tricks.com/fighting-the-space-between -inline-block-elements
Chris Kempen

Et maintenant que nous avons flexbox, tout cela n'est plus nécessaire :) Enfin une bonne mise en page: css-tricks.com/snippets/css/a-guide-to-flexbox
opatut

70

Vous pouvez utiliser des commentaires.

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

Je m'inquiéterais cependant de la sémantique d'avoir une série d'images côte à côte.


1
Bonne idée. Les images sont pour la décoration - est-ce important sur le plan sémantique?
Skilldrick

13
Les images décoratives appartiennent au CSS, pas au HTML!
Konrad Rudolph

11
Cela dépend de la décoration des images. Une jolie frontière? Cela devrait être en CSS. Une série de petites photos d'avions sur un site sur le vol? Peut-être contenu sans équilivent de texte nécessaire.
Quentin

1
@ MihaiAlexandruBîrsan - font-size:0est horrible dans de nombreux cas parce que vous perdez l'héritage. oui, vous pouvez utiliser des remunités, mais vos requêtes multimédias cesseront de fonctionner pour cet élément et vous devrez toutes les modifier
vsync

1
Je viens de découvrir cette petite astuce puis j'ai vu ta réponse. Un peu de cruauté mais va un long chemin pour garder le HTML pas tout groupé dans une longue ligne.
Nick Bedford

26

Vous avez deux options sans faire de choses approximatives avec CSS. La première option consiste à utiliser javascript pour supprimer les enfants des balises qui ne contiennent que des espaces. Une option plus intéressante consiste cependant à utiliser le fait que les espaces peuvent exister à l'intérieur des balises sans que cela ait une signification. Ainsi:

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

2
Je préfère en fait ce style. Oui, c'est moche, mais cela ne nécessite aucun hacks CSS qui peuvent avoir toutes sortes d'effets secondaires.
Stijn de Witt

24

Flexbox peut facilement résoudre ce vieux problème:

.image-wrapper {
  display: flex;
}

Plus d'informations sur flexbox: https://css-tricks.com/snippets/css/a-guide-to-flexbox/


4
De nos jours, Flexbox est la solution la plus propre et la plus simple. Je pense que cela devrait être la meilleure réponse ici. { flex-direction: row; flex-wrap: nowrap; }pourrait être ajouté pour plus de lisibilité.
Robert Kusznier

2
C'est la meilleure réponse moderne
Nate

@RobertKusznier Je ne suis pas d'accord avec la spécification flex-direction: rowet flex-wrap: nowrap, de toute façon, ils sont la valeur par défaut. Restez simple est généralement le meilleur! En outre, la plupart du temps, l'utilisateur voudra en fait flex-wrap: wrap.
Marc 2377

13

Après beaucoup trop de recherches, d'essais et d'erreurs, j'ai trouvé un moyen qui semble fonctionner correctement et qui ne nécessite pas de redéfinir manuellement la taille de la police manuellement sur les éléments enfants, ce qui me permet d'avoir une taille de police standardisée dans tout le document. .

Dans Firefox, c'est assez simple, il suffit de définir word-spacing: -1eml'élément parent. Pour une raison quelconque, Chrome ignore cela (et pour autant que je l'ai testé, il ignore l'espacement des mots quelle que soit la valeur). Donc, en plus de cela, j'ajoute letter-spacing: -.31emau parent et letter-spacing: normalaux enfants. Cette fraction d'un em est la taille de l'espace UNIQUEMENT SI votre taille em est normalisée . Firefox, à son tour, ignore les valeurs négatives pour l'espacement des lettres, il ne l'ajoutera donc pas à l'espacement des mots.

J'ai testé ceci sur Firefox 13 (win / ubuntu, 14 sur android), Google Chrome 20 (win / ubuntu), Android Browser sur ICS 4.0.4 et IE 9. Et je suis tenté de dire que cela peut aussi fonctionner sur Safari, mais je ne sais pas vraiment ...

Voici une démo http://jsbin.com/acucam


1
C'est, à mon avis professionnel, la meilleure solution. Je l'ai testé dans Safari 5 et 6 sur le bureau ainsi que dans Mobile Safari sur un iPad de deuxième génération. Cela fonctionne, cependant, lors de la réinitialisation de l'espacement des lettres chez un enfant, vous devez également inclure l'espacement des mots: normal; comme Safari l'honore. Excellent travail, Flatline!
hndcrftd

2
Le word-spacing: -1emstyle semble faire chevaucher les mots dans la version actuelle de Chrome.
Sam

@Sam désolé pour le délai incroyablement long: PI a changé l'espacement des mots à 0,05, il semble que les nouvelles versions de Firefox se moquent de cet attribut, l'espacement des lettres suffit. Je suis sur Ubuntu en ce moment, donc je ne l'ai pas testé sur Windows. Voici la version mise à jour jsbin.com/acucam/14
Flatline

1
Avez-vous essayé cela avec différentes polices? Cela semble incroyablement non conventionnel et très, très susceptible de casser.
dudewad

12

Je suis trop tard (je viens de poser une question et je trouve mince dans la section correspondante) mais je pense que display: table-cell; est une meilleure solution

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

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

le seul problème est que cela ne fonctionnera pas sur IE 7 et les versions antérieures, mais cela peut être réparé avec un hack


C'est bien, mais le seul défaut est que les éléments perdent leur capacité à flotter au centre s'ils parent ont text-align: center;
Mladen Janjetovic

Fonctionne, mais au cas où vous souhaiteriez aligner les images sur le côté droit simplement avec text-align: right (sur le parent et sans float) - La solution ne convient pas malheureusement.
Herr_Hansen

2
Cela pourrait fonctionner, mais certains lecteurs d'écran interprètent display: table-*sémantiquement et lisent comme si l'utilisateur naviguait dans une table.
Tarka

5

Utilisez la feuille de style CSS pour résoudre ce problème comme le code suivant.

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

texte alternatif http://rabu4g.bay.livefilestore.com/y1pWoAOBMiLumd2iQTAreYjQCDIkHImh2g_b2g9k4AnxtDNrCjvzL6bK7skG8QKMRNWkMG7N8e5Xm7pgley3tdRNGd2N8e5Xm7pgleyPurePNGP

Test sur Firefox 3.5 Final!

PS. votre html devrait aimer ça.

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

Il a dit "ligne", pas "colonne" et votre exemple HTML n'est pas valide.
Quentin

3
Il veut une seule ligne avec plusieurs images en «colonnes». Cette réponse résout en fait le problème, bien que "display: block" soit redondant.
Bobby Jack

3

Puis-je faire autre chose que casser au milieu des balises plutôt qu'entre elles?

Pas vraiment. Puisque les <img>s sont des éléments en ligne, les espaces entre ces éléments sont considérés par le moteur de rendu HTML comme de vrais espaces dans le texte - les espaces redondants (et les sauts de ligne) seront tronqués mais les espaces simples le seront insérés dans les données de caractère de l'élément de texte.

Le positionnement des <img>balises peut absolument empêcher cela, mais je vous le déconseille car cela signifierait positionner manuellement chacune des images sur une mesure de pixel, ce qui peut demander beaucoup de travail.


1

Une autre solution serait d'utiliser des sauts de ligne non conventionnels dans les endroits des espaces. Ceci est similaire aux deux premières réponses et constitue une autre façon d'aligner les éléments. Il s'agit également d'une technique d'optimisation de super-bords car elle remplace les espaces dans votre balisage par des retours chariot.

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

Notez qu'il n'y a aucun espace dans aucun de ce code. Les endroits où les espaces sont normalement utilisés en HTML sont remplacés par des retours chariot. C'est moins verbeux que d'utiliser des commentaires et des espaces comme Paul de Vrieze l'a recommandé.

Merci à tech.co pour cette approche.



0

L'espace entre les éléments n'est mis là que par l'éditeur HTML à des fins de formatage visuel. Vous pouvez utiliser jQuery pour supprimer les espaces:

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

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

});

Cela détache les éléments enfants, efface tout espace blanc qui reste avant de rajouter les éléments enfants.

Contrairement aux autres réponses à cette question, l'utilisation de cette méthode garantit que le css hérité displayet les font-sizevaleurs sont conservés. Il n'y a pas non plus besoin d'utiliser floatet la lourdeur clearqui est alors nécessaire. Bien sûr, vous devrez utiliser jQuery.


10
Bien que cette solution fonctionne. Je pense qu'il est excessif de supprimer les espaces avec javascript.
Lashae

1
Désolé mais uggghhhh ... On devrait viser à coder le HTML correctement en premier lieu, et non à le modifier avec JS après coup. Ce dernier encourage juste les pratiques bâclées avec l'idée que le miracle [de la toux] de JS peut y remédier plus tard.
underscore_d

0

Personnellement, j'aime la réponse acceptée indiquant qu'il n'y a pas de moyen exact de le faire, pas sans utiliser une astuce d'une certaine forme.

Pour moi, c'est un problème ennuyeux qui peut parfois vous faire perdre une heure à vous demander pourquoi une rangée de cases à cocher, par exemple, ne sont pas toutes alignées correctement. dont je ne me suis pas souvenu ... mais semble non :(

Quant à la meilleure réponse suivante, l'utilisation de la taille de la police ... pour moi, c'est un méchant hack qui vous mordra plus tard en vous demandant pourquoi votre texte ne s'affiche pas.

Je développe généralement beaucoup avec PHP et dans le cas où je génère une grille de cases à cocher, le contenu généré par PHP supprime ce problème car il n'insère aucun espacement / rupture.

Simplement, je suggérerais de devoir traiter les images toutes sur une seule ligne ou d'utiliser un script côté serveur pour générer le contenu / les images.


0

Au lieu d'utiliser pour supprimer un CR / LF entre les éléments, j'utilise l'instruction de traitement SGML car les minificateurs suppriment souvent les commentaires, mais pas le PI XML. Lorsque le PI PHP est traité par PHP, il a l'avantage supplémentaire de supprimer complètement le PI avec le CR / LF entre les deux, économisant ainsi au moins 8 octets. Vous pouvez utiliser n'importe quel nom d'instruction valide arbitraire tel que et enregistrer deux octets dans X (HT) ML.



-1

Sémantiquement parlant, ne serait-il pas préférable d'utiliser une liste ordonnée ou non et de la styliser de manière appropriée en utilisant 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>

En utilisant CSS, vous pourrez le styliser comme vous le souhaitez et supprimer les espaces entre les livres.


4
Mettre les images dans des éléments de liste n'a aucun effet sur l'espace blanc, même s'il est plus sémantique.
dangerousdave
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.