Compte tenu de ce HTML et CSS:
span {
display:inline-block;
width:100px;
background-color:palevioletred;
}
<p>
<span> Foo </span>
<span> Bar </span>
</p>
En conséquence, il y aura un espace de 4 pixels de large entre les éléments SPAN.
Démo: http://jsfiddle.net/dGHFV/
Je comprends pourquoi cela se produit et je sais également que je pourrais me débarrasser de cet espace en supprimant l'espace blanc entre les éléments SPAN dans le code source HTML, comme ceci:
<p>
<span> Foo </span><span> Bar </span>
</p>
Cependant, j'espérais une solution CSS qui ne nécessite pas de falsification du code source HTML.
Je sais comment résoudre ce problème avec JavaScript - en supprimant les nœuds de texte de l'élément conteneur (le paragraphe), comme ceci:
// jQuery
$('p').contents().filter(function() { return this.nodeType === 3; }).remove();
Démo: http://jsfiddle.net/dGHFV/1/
Mais ce problème peut-il être résolu avec CSS seul?
Réponses:
Puisque cette réponse est devenue plutôt populaire, je la réécris de manière significative.
N'oublions pas la vraie question qui a été posée:
Il est possible de résoudre ce problème avec CSS seul, mais il n'y a pas de correctifs CSS complètement robustes.
La solution que j'avais dans ma réponse initiale était d'ajouter
font-size: 0
à l'élément parent, puis de déclarer un bon sensfont-size
sur les enfants.http://jsfiddle.net/thirtydot/dGHFV/1361/
Cela fonctionne dans les versions récentes de tous les navigateurs modernes. Cela fonctionne dans IE8. Il ne fonctionne pas dans Safari 5, mais il fait le travail dans Safari 6. Safari 5 est près d' un navigateur mort ( 0,33%, Août ici à 2015 ).
La plupart des problèmes possibles avec les tailles de police relatives ne sont pas compliqués à résoudre.
Cependant, bien que ce soit une solution raisonnable si vous avez spécifiquement besoin d' un correctif CSS uniquement, ce n'est pas ce que je recommande si vous êtes libre de changer votre code HTML (comme la plupart d'entre nous le sont).
Voici ce que moi, en tant que développeur Web raisonnablement expérimenté, fais pour résoudre ce problème:
Oui c'est vrai. Je supprime les espaces dans le HTML entre les éléments de bloc en ligne.
C'est facile. C'est simple. Ça marche partout. C'est la solution pragmatique.
Vous devez parfois considérer attentivement d'où viendront les espaces blancs. L'ajout d'un autre élément avec JavaScript ajoutera-t-il des espaces? Non, pas si vous le faites correctement.
Allons sur un voyage magique de différentes façons de supprimer les espaces blancs, avec un nouveau HTML:
Vous pouvez le faire, comme je le fais habituellement:
http://jsfiddle.net/thirtydot/dGHFV/1362/
Ou ca:
Ou utilisez des commentaires:
Ou, si vous utilisez PHP ou similaire:
Ou, vous pouvez même ignorer complètement certaines balises de fermeture (tous les navigateurs conviennent):
Maintenant que je suis allé vous ennuyer à mort avec "mille façons différentes de supprimer les espaces blancs, par thirtydot", j'espère que vous avez tout oublié
font-size: 0
.Alternativement, vous pouvez désormais utiliser flexbox pour réaliser la plupart des mises en page que vous avez précédemment utilisées pour le bloc en ligne: https://css-tricks.com/snippets/css/a-guide-to-flexbox/
la source
:(
font-size:0
astuce ne soit pas une si bonne idée après tout ...Pour les navigateurs conformes CSS3, il existe
white-space-collapsing:discard
voir: http://www.w3.org/TR/2010/WD-css3-text-20101005/#white-space-collapsing
la source
trim-inner
plutôt quediscard
?text-space-collapse
:
discard
<p>A long text...</p>
, où les balises d'ouverture et de fermeture se trouvent sur des lignes distinctes du contenu du texte. C'est quelque chose que je fais tout le temps pour garder mes fichiers HTML bien rangés et lisibles.float
ÉDITER:
aujourd'hui, nous devrions simplement utiliser Flexbox .
ANCIENNE RÉPONSE:
D'accord, même si j'ai voté à la fois
font-size: 0;
pour lesnot implemented CSS3 feature
réponses et pour les réponses, après avoir essayé, j'ai découvert qu'aucune d'entre elles n'était une vraie solution .En fait, il n'y a même pas une solution de contournement sans effets secondaires puissants.
Ensuite, j'ai décidé de supprimer les espaces (cette réponse concerne cet argument) entre les
inline-block
divs de maHTML
source (JSP
), en tournant ceci:pour ça
c'est moche, mais ça marche.
Mais, attendez une minute ... Et si je générer mes divs intérieur
Taglibs loops
(Struts2
,JSTL
, etc ...)?Par exemple:
Il n'est absolument pas pensable d'inclure tout ça, cela signifierait
qui n'est pas lisible, difficile à maintenir et à comprendre, etc ...
La solution que j'ai trouvée:
De cette façon, vous aurez un code lisible et correctement en retrait.
Et, comme effet secondaire positif, le
HTML source
, bien qu'infesté par des commentaires vides, résultera correctement en retrait;prenons le premier exemple. À mon humble avis, ceci:
c'est mieux que ça:
la source
Ajoutez des commentaires entre les éléments pour NE PAS avoir d'espace blanc. Pour moi, c'est plus facile que de réinitialiser la taille de la police à zéro, puis de la rétablir.
la source
Toutes les techniques d'élimination de l'espace
display:inline-block
sont des hacks méchants ...Utilisez Flexbox
Il est génial, résout tous ces bs de mise en page de bloc en ligne, et à partir de 2017 a 98% de support du navigateur (plus si vous ne vous souciez pas des anciens IE).
la source
Ajoutez
display: flex;
à l'élément parent. Voici la solution avec un préfixe:Version simplifiée 👇
Correction avec le préfixe 👇
la source
C'est la même réponse que j'ai donnée sur le sujet: Affichage: bloc en ligne - Quel est cet espace?
Il existe en fait un moyen très simple de supprimer les espaces blancs du bloc en ligne qui est à la fois simple et sémantique. Cela s'appelle une police personnalisée avec des espaces de largeur nulle, ce qui vous permet de réduire l'espace blanc (ajouté par le navigateur pour les éléments en ligne lorsqu'ils sont sur des lignes distinctes) au niveau de la police à l'aide d'une très petite police. Une fois que vous déclarez la police, vous changez simplement le
font-family
sur le conteneur et inversement sur les enfants, et le tour est joué. Comme ça:Convient au goût. Voici un téléchargement de la police que je viens de préparer dans font-forge et convertie avec le générateur de polices Web FontSquirrel. Ça m'a pris 5 minutes. La
@font-face
déclaration CSS est incluse: police d'espace zippée de largeur nulle . Il se trouve dans Google Drive, vous devrez donc cliquer sur Fichier> Télécharger pour l'enregistrer sur votre ordinateur. Vous devrez probablement également modifier les chemins de police si vous copiez la déclaration dans votre fichier CSS principal.la source
flex-wrap
au moins la version 28 ( srsly? ), Mais c'est une solution de rechange parfaite jusque-là.Deux autres options basées sur le module de texte CSS niveau 3 (au lieu de celles
white-space-collapsing:discard
qui ont été supprimées du projet de spécification):word-spacing: -100%;
En théorie, il devrait faire exactement ce qui est nécessaire - raccourcir les espaces blancs entre les «mots» de 100% de la largeur des caractères de l'espace, c'est-à-dire à zéro. Mais semble ne fonctionner nulle part, malheureusement, et cette fonctionnalité est marquée «à risque» (elle peut également être supprimée de la spécification).
word-spacing: -1ch;
Il raccourcit les espaces entre les mots de la largeur du chiffre «0». Dans une police à espacement fixe, elle doit être exactement égale à la largeur du caractère espace (et à tout autre caractère également). Cela fonctionne dans Firefox 10+, Chrome 27+ et fonctionne presque dans Internet Explorer 9+.
Violon
la source
' '
et'0'
. Dans les polices non monospaces, il n'y a pas de proportion magique parfaitement adaptée entre les largeurs' '
et les'0'
caractères, donc cech
n'est pas très utile du tout.word-spacing
, nous pourrions utiliserletter-spacing
avec une grande valeur négative arbitraire comme indiqué dans ma réponseMalheureusement, nous sommes en 2019 et
white-space-collapse
n'est toujours pas mis en œuvre.En attendant, donnez l'élément parent
font-size: 0;
et définissez lefont-size
sur les enfants. Cela devrait faire l'affairela source
Utilisez flexbox et faites un repli (à partir des suggestions ci-dessus) pour les navigateurs plus anciens:
la source
Facile:
Il n'est pas nécessaire de toucher l'élément parent.
Seule condition ici: la taille de police de l'élément ne doit pas être définie (doit être égale à la taille de police du parent).
0.25em
est la valeur par défautword-spacing
W3Schools - propriété d'espacement des mots
la source
taille de police: 0; peut être un peu plus difficile à gérer ...
Je pense que les quelques lignes suivantes sont bien meilleures et plus réutilisables, et font gagner du temps que toutes les autres méthodes. J'utilise personnellement ceci:
Ensuite, vous pouvez l'utiliser comme suit ...
Pour autant que je sache (je peux me tromper), mais tous les navigateurs prennent en charge cette méthode.
EXPLICATION :
Cela fonctionne (peut-être que -3px peut être mieux) exactement comme vous vous attendez à ce qu'il fonctionne.
class="items"
le parent de chaque bloc en ligne.Vous n'aurez PAS besoin de revenir au css et d'ajouter une autre règle css pour vos nouveaux blocs en ligne.
Résoudre deux problèmes à la fois.
Notez également le
>
signe (supérieur à), cela signifie que * / tous les enfants doivent être en ligne.http://jsfiddle.net/fD5u3/
REMARQUE: j'ai modifié pour permettre d'hériter de l'espacement des lettres lorsqu'un wrapper a un wrapper enfant.
la source
-4px
pourletter-spacing
qui peut être pas assez pour les grandes tailles de police , par exemple: voir ce violon , nous pourrions utiliser une valeur plus grande que dans mon postCependant, techniquement pas une réponse à la question: "Comment puis-je supprimer l'espace entre les éléments de bloc en ligne?"
Vous pouvez essayer la solution flexbox et appliquer le code ci-dessous et l'espace sera supprimé.
Vous pouvez en savoir plus à ce sujet sur ce lien: https://css-tricks.com/snippets/css/a-guide-to-flexbox/
la source
Je ne suis pas sûr de savoir si vous voulez créer deux travées bleues sans espace ou si vous souhaitez gérer d'autres espaces blancs, mais si vous souhaitez supprimer l'écart:
Et.. Voila.
la source
En général, nous utilisons des éléments comme celui-ci dans différentes lignes, mais en cas de
display:inline-block
utilisation de balises sur la même ligne, l'espace sera supprimé, mais pas sur une ligne différente.Un exemple avec des balises dans une ligne différente:
Exemple avec des balises sur la même ligne
Une autre méthode efficace est un travail CSS qui utilise
font-size:0
l'élément parent et donnefont-size
autant que vous le souhaitez à un élément enfant.la source
J'ai eu ce problème en ce moment et
font-size:0;
j'ai découvert que dans Internet Explorer 7, le problème persiste car Internet Explorer pense "Taille de police 0?!?! WTF êtes-vous fou?" - Donc, dans mon cas, j'ai réinitialisé le CSS d'Eric Meyer et avecfont-size:0.01em;
une différence de 1 pixel entre Internet Explorer 7 et Firefox 9, je pense que cela peut être une solution.la source
la source
float
etdisplay:inline-block
pourspan
s étaient censés être des solutions de rechange pour le cas s'ilflex
n'est pas pris en charge, maisfloat
éliminerait effectivement l'effet deinline-block
, donc ce dernier semble redondant.Je me suis attaqué à cela récemment et au lieu de définir le parent
font-size:0
puis de redonner à l'enfant une valeur raisonnable, j'ai obtenu des résultats cohérents en redéfinissant le conteneur parentletter-spacing:-.25em
puis l'enfantletter-spacing:normal
.Dans un fil de discussion alternatif, j'ai vu une mention de commentateur qui
font-size:0
n'est pas toujours idéale parce que les gens peuvent contrôler les tailles de police minimales dans leurs navigateurs, annulant complètement la possibilité de définir la taille de police à zéro.L'utilisation d'ems semble fonctionner indépendamment du fait que la taille de police spécifiée soit 100%, 15pt ou 36px.
http://cdpn.io/dKIjo
la source
Je pense qu'il existe une méthode très simple / ancienne pour cela, qui est prise en charge par tous les navigateurs, même IE 6/7. Nous pourrions simplement définir
letter-spacing
une grande valeur négative dans parent, puis la redéfinirnormal
sur les éléments enfants:la source
letter-spacing:normal
tous les éléments enfants.letter-spacing
99,99% des foisnormal
. la taille de la police n'a pas une telle valeur fixe et dépend fortement de la conception. cela pourrait être une petite valeur ou une grande valeur basée sur la famille de polices et d'autres choses ... Je ne me souviens jamais dans ma vie de voir / utiliser une valeur spéciale (autre que 0 / normale) pourletter-spacing
, donc je pense que c'est plus sûr et meilleur choixLa réponse la plus simple à cette question est d'ajouter.
css
lien codepen: http://jsfiddle.net/dGHFV/3560/
la source
Avec des crochets PHP:
la source
Je vais développer un peu la réponse de user5609829 car je pense que les autres solutions ici sont trop compliquées / trop de travail. L'application de a
margin-right: -4px
aux éléments de bloc en ligne supprimera l'espacement et est prise en charge par tous les navigateurs. Voir le violon mis à jour ici . Pour ceux qui souhaitent utiliser des marges négatives, essayez de lire ceci .la source
La spécification CSS Text Module Level 4 définit une
text-space-collapse
propriété, qui permet de contrôler la façon dont l'espace blanc à l'intérieur et autour d'un élément est traité.Donc, concernant votre exemple, il vous suffira d'écrire ceci:
Malheureusement, aucun navigateur n'implémente encore cette propriété (en septembre 2016) comme mentionné dans les commentaires à la réponse de HBP .
la source
J'ai trouvé une solution CSS pure qui fonctionnait très bien pour moi dans tous les navigateurs:
la source
Ajoutez
white-space: nowrap
à l'élément conteneur:CSS:
HTML:
Voici le Plunker .
la source
Il y a beaucoup de solutions comme
font-size:0
,word-spacing
,margin-left
,letter-spacing
et ainsi de suite.Normalement, je préfère utiliser
letter-spacing
car-1em
).word-spacing
etmargin-left
lorsque nous définirons une valeur plus élevée comme-1em
.font-size
n'est pas pratique lorsque nous essayons de l'utiliserem
commefont-size
unité.Donc,
letter-spacing
semble être le meilleur choix.Cependant, je dois vous avertir
lorsque vous utilisez,
letter-spacing
il vaut mieux utiliser-0.3em
ou-0.31em
pas les autres.Si vous utilisez Chrome (version de test 66.0.3359.139) ou Opera (version de test 53.0.2907.99), ce que vous voyez peut être:
Si vous utilisez Firefox (60.0.2), IE10 ou Edge, ce que vous voyez peut être:
C'est intéressant. J'ai donc vérifié l' espacement des lettres mdn et j'ai trouvé ceci:
Il semble que ce soit la raison.
la source
Ajoutez
letter-spacing:-4px;
le parentp
css et ajoutezletter-spacing:0px;
à votrespan
css.la source
J'ai pensé ajouter quelque chose de nouveau à cette question car bien que la plupart des réponses actuellement fournies soient plus qu'adéquates et pertinentes, il existe de nouvelles propriétés CSS qui peuvent atteindre une sortie très propre, avec une prise en charge complète sur tous les navigateurs, et peu de pas de «hacks». Cela s'éloigne,
inline-block
mais cela vous donne les mêmes résultats que la question posée.Ces propriétés CSS sont
grid
CSS Grid est hautement pris en charge ( CanIUse ) en dehors d'IE qui n'a besoin que d'un
-ms-
préfixe pour lui permettre de fonctionner.CSS Grid est également très flexible, et prend toutes les bonnes parties de
table
,flex
etinline-block
les éléments et les amène en un seul endroit.Lors de la création d'un,
grid
vous pouvez spécifier les espaces entre les lignes et les colonnes. L'écart par défaut est déjà défini sur0px
mais vous pouvez changer cette valeur en ce que vous voulez.Pour le raccourcir un peu, voici un exemple de travail pertinent:
la source
display:grid
élément est bloqué, donc ce n'est pas tellement cet affichage: la grille vous aide à travailler avec des dispositions de bloc en ligne, mais plutôt vous permet de remplacer le travailinline-block
par quelque chose où vous pouvez contrôler les `` gouttières '' comme cette question veut. De plus, je suis vraiment surpris que personne n'ait encore répondu avec une solution CSS Grid Layout.inline-block
. Et oui, j'ai également été surpris, je suppose que personne avec de l'grid
expérience n'était vraiment venu à cela auparavant. J'ai joué un peu avec et je suis tombé sur cette question alors j'ai pensé pourquoi pas: PJ'ai trouvé une autre façon d'appliquer la marge gauche comme valeurs négatives, sauf le premier élément de la ligne.
la source
Chaque question, qui essaie de supprimer l'espace entre les
inline-block
s<table>
me semble un ...Essayez quelque chose comme ceci:
la source