Ich habe das in letzter Zeit ein paar Mal auf Twitter gesehen und dann ein interessantes Dabblet, also dachte ich, es wäre wichtig, das zu dokumentieren.
Hier ist das Ding: Eine Reihe von inline-block Elementen, die so formatiert sind, wie Sie normalerweise HTML formatieren, haben Leerzeichen zwischen sich.
Mit anderen Worten
<nav>
<a href="#">One</a>
<a href="#">Two</a>
<a href="#">Three</a>
</nav>
nav a {
display: inline-block;
padding: 5px;
background: red;
}
Wird resultieren in

Wir wollen oft, dass die Elemente aneinander stoßen. Im Falle von Navigation bedeutet das, dass es die unangenehmen kleinen, nicht klickbaren Lücken vermeidet.
Das ist kein „Bug“ (glaube ich nicht). Es ist einfach die Art und Weise, wie Elemente auf einer Zeile gesetzt werden. Sie wollen Leerzeichen zwischen Wörtern, die Sie tippen, richtig? Die Leerzeichen zwischen diesen Blöcken sind genau wie Leerzeichen zwischen Wörtern. Das soll nicht heißen, dass die Spezifikation nicht aktualisiert werden könnte, um zu besagen, dass Leerzeichen zwischen Inline-Block-Elementen nichts sein sollten, aber ich bin mir ziemlich sicher, dass dies eine riesige Büchse der Pandora ist, die wahrscheinlich nie geöffnet wird.
Hier sind einige Möglichkeiten, den Spalt zu bekämpfen und Inline-Block-Elemente direkt nebeneinander zu platzieren.
Entfernen Sie die Leerzeichen
Der Grund, warum Sie die Leerzeichen bekommen, ist, dass Sie Leerzeichen zwischen den Elementen haben (ein Zeilenumbruch und ein paar Tabs zählen als Leerzeichen, nur um das klarzustellen). Minimierter HTML löst dieses Problem, oder einer dieser Tricks
<ul>
<li>
one</li><li>
two</li><li>
three</li>
</ul>
oder
<ul>
<li>one</li
><li>two</li
><li>three</li>
</ul>
oder mit Kommentaren…
<ul>
<li>one</li><!--
--><li>two</li><!--
--><li>three</li>
</ul>
Sie sind alle ziemlich seltsam, aber es tut seinen Zweck.
Negativer Rand
Sie können die Elemente mit einem negativen Rand von 4 Pixeln zurückschieben (muss möglicherweise je nach Schriftgröße des Elternelements angepasst werden). Anscheinend ist dies in älteren IE-Versionen (6 & 7) problematisch, aber wenn Sie sich nicht um diese Browser kümmern, können Sie zumindest die Codeformatierung sauber halten.
nav a {
display: inline-block;
margin-right: -4px;
}
Lassen Sie den schließenden Tag weg
HTML5 kümmert sich sowieso nicht darum. Obwohl Sie zugeben müssen, es fühlt sich seltsam an.
<ul>
<li>one
<li>two
<li>three
</ul>
Setzen Sie die Schriftgröße auf Null
Ein Leerzeichen mit font-size: 0 ist... null Pixel breit.
nav {
font-size: 0;
}
nav a {
font-size: 16px;
}
Pre-Jellybean entfernt den Leerraum überhaupt nicht, und Jellybean hat einen Fehler, bei dem das letzte Element zufällig ein winziges bisschen Leerraum hat.Siehe Forschung.
font-size, um sie wieder nach oben zu bringen.Schweben Sie sie stattdessen einfach
Vielleicht müssen sie gar nicht inline-block sein, vielleicht können sie einfach auf die eine oder andere Weise geschwebt werden. Das erlaubt Ihnen, ihre Breite und Höhe und Polsterung und Zeug zu setzen. Sie können sie nur nicht zentrieren, wie Sie es können, indem Sie text-align: center; den Elternteil von inline-block Elementen. Nun... Sie können es irgendwie, aber es ist seltsam.
Verwenden Sie stattdessen einfach Flexbox
Wenn die Browserunterstützung für Sie akzeptabel ist und Sie Inline-Block für die Zentrierung benötigen, könnten Sie Flexbox verwenden. Sie sind nicht gerade austauschbare Layoutmodelle oder so etwas, aber Sie können das bekommen, was Sie davon brauchen.
Siehe
Beispiel auf CodePen
Ich benutze immer die Methode mit dem negativen Rand, aber die schwebende Methode, so einfach sie auch ist, wird mir sehr helfen.
Ich auch, negative Ränder... cool, danke.
@Landis und @Julian: Sie sollten vielleicht die Methode mit dem negativen Rand überdenken. Hier ist ein Beispiel dafür. Es ist am besten, Designs zu verwenden, die nicht von Null-Leerzeichen abhängig sind. Wenn Sie müssen, verwenden Sie die Kommentar-Methode oder lassen Sie keine Wagenrückläufe zwischen den Elementen.
Benutze auch den negativen Rand, denke, das ist am besten, weil man die Position der Elemente tatsächlich anpasst. Eine linke Position von -5px; könnte eine gute Idee sein, aber natürlich birgt das allerlei beängstigende Risiken.
Alle li's in einer Zeile verwenden, dann erscheint der magische Rand nicht, tatsächlich kommt der Rand, wenn Sie den HTML-Code schreiben und nach jedem li Enter drücken, die neue Zeile erzeugt den magischen Rand
Danke
Shaban Khan
UI/UX Ingenieur
Hier dasselbe... immer negativer Rand.
Dieser 0px Font-Size-Trick sieht ziemlich cool aus...
Das Weglassen von schließenden Tags ist wie nackt über den Strand zu rennen. Das Grausen! Ich benutze auch den negativen Rand
Ich weiß nicht, nackt über den Strand zu rennen könnte interessant sein
Auch ich habe immer die Methode mit dem negativen Rand verwendet, vielleicht beginne ich aber mit der Font-Size-Technik – sie scheint einfach zu einfach, um sie zu ignorieren.
Der negative Rand war schon immer mein Weg – er erhält die Semantik, die Code-Struktur und hält die „Korrektur“ direkt mit dem Objekt verbunden.
Alle anderen Techniken verändern entweder den zugrunde liegenden Code oder schaffen eine Assoziation, die ich (oder ein anderer Entwickler, der meinen Code verwendet) berücksichtigen muss.
Die YUI 3 CSS Grids verwenden
letter-spacingundword-spacingauf ihrem Grid-Container, um Leerzeichen zwischen den Grid-Einheiten zu komprimieren.http://yui.yahooapis.com/3.5.0/build/cssgrids/grids.css
Ich benutze diesen Trick auch, und ich habe ihn als den mit Abstand besten empfunden.
font-size: 0ist eine völlig unbrauchbare Lösung, wenn Sieemsoder%in einem Ihrer Kindelemente verwenden möchten. Außerdem funktioniert es nicht in Safari 5.0.Floats sind auch nicht ideal, da sie die vertikale Grundlinie beeinträchtigen, wenn Sie versuchen, Inline-Block-Elemente mit unterschiedlichen Zeilenhöhen auszurichten. Außerdem müssen Sie sie clearen.
Bootstrap hat möglicherweise die gleichen Dinge. Und es funktioniert großartig...
Nein, Bootstrap benutzt Floats
Das verhält sich in Firefox bei Floats fehlerhaft, daher ist es besser, letter-spacing nur für Webkit-Browser zu trennen.
PS: Ich habe im September 2011 einen Bugreport an Webkit Bugzilla geschickt. Ich hoffe, sie werden ihn irgendwann beheben.
Diese Lösung ist nicht narrensicher, da sie von drei Annahmen ausgeht: der Breite des Leerzeichens entspricht 0,31em (fast wahr für Arial/Helvetica, aber falsch für Times New Roman usw.), der Grenzwert für die negative Wortabstände, der das Überlappen von Wörtern verhindert (wahr für FF und IE8+, fast wahr für Opera, aber falsch für WebKit und IE7-) und dem WebKit-Fehler, dass word-spacing bei Inline-Blöcken völlig ignoriert wird. Wenn dieser Fehler behoben ist, werden die Inline-Blöcke etwas „zusammengedrückt“, da der Wortabstand zu groß ist und die zweite Annahme in WebKit fehlschlägt.
Ich sage nur... Ich benutze das YUI Grid-System seit über einem Jahr und hatte keine Probleme. Ich habe fast jedes Grid-System da draußen getestet, und das YUI-System ist sowohl leichtgewichtig, narrensicher als auch responsiv (mit Anpassungen). Hier ist meine Version... für responsive Layouts... mit Kurzschrift... in einen gemeinsamen Nenner umgewandelt. Im Grunde können Sie den Teil „yui-3-“ der Klassennamen weglassen, und die Grid-Einheiten sind „Basis 24“ als solche: .u-4-24, .u-6-24, .u-18-24, usw... oder Sie können immer noch die ursprünglichen Namen von Yahoo verwenden, wenn Sie gerne Taschenrechner benutzen.
Wir können auch „word-spacing : -4px ;“ auf dem Elternelement verwenden; funktioniert genauso wie das Anbringen des negativen Randes an den li-Elementen.
Sreejesh KV, eine solche Lösung ist definitiv besser als ein negativer Rand :) Besonders wenn die Elemente links ausgerichtet sein müssen, wo die Methode mit dem negativen Rand das erste Listenelement verschieben würde.
Die Art und Weise, wie ich es früher gehandhabt habe, ist, die Verschiebung für das erste Element nicht über den
:first-childSelektor anzuwenden.Floating, wie von vielen hier vorgeschlagen, macht die Elemente zu Blockelementen, sie sind dann keine Inline-Blöcke mehr. Das ist schummeln))
Ja, du hast Recht. Deshalb bevorzuge ich die 'word-spacing'-Methode.
Ja, das ist der Trick. Tolle Arbeit.
Wenn es sich um eine Navigation handelt, schweben Sie die verdammten Dinger einfach. Zumindest funktioniert das in allen Browsern und greift nicht auf verrückte Font-Size-Hacks oder unheilige offene Tags zurück. Vielleicht bin ich nur altmodisch...
Genau das wollte ich sagen.
Der einzige Weg, den ich kenne, um zentrierte Navigation zu machen (ohne die endgültige Breite zu kennen), ist die Verwendung von
ul { text-align: center; }undli { display: inline-block; }Daher sind solche Tricks sehr notwendig.
Toller Tipp, ich benutze auch die Methode mit dem negativen Rand
Ich benutze immer die schwebende Methode. Auf diese Weise haben Sie die absolute Kontrolle über Ihr HTML.
Ich benutze Float, weil alle Tutorials, die ich jemals zu Navigationsleisten gefunden habe, Float verwendet haben und es einfach ist und Sinn macht. Ich wusste nicht einmal, dass es andere Wege gibt, und dachte, Float sei der richtige Weg, um es zu tun.
Es ist interessant, andere Optionen zu sehen, wenn ich mit dem Code von jemand anderem arbeite und er es auf eine andere Weise getan hat.
Ich mag die Idee, schließende Tags wegzulassen nicht und freue mich nicht darauf, mit Code zu arbeiten, bei dem sie weggelassen werden, nur weil sie es können. Ich füge diese schließenden Tags nicht für den Browser hinzu, sie sind für mich da, wenn ich den Code lese :-)
Das Problem heißt also „Bike Shedding“ und in CSS3 wird es eine Eigenschaft geben, um dies zu beheben, wie die Spezifikation es nennt. Es läuft also darauf hinaus, wie Chris sagte, der Abstand zwischen den Elementen. Sie könnten also tun
<ul><li>eins</li><li>zwei</li><li>drei</li></ul>
aber das macht den Code wirklich unüberschaubar. Meine Erkenntnisse führten mich zu dem, was Geert De Deckere als beste Lösung für das Problem gepostet hat.
Soweit ich weiß, wurde diese Eigenschaft in „white-space-collapse“ umbenannt
Negativer Rand bricht hier (Firefox 13 unter Linux)
Immer noch ein Pixel Leerraum zwischen den Elementen.
(Warum haben Sie entschieden, dass ein Leerzeichen genau 4 Pixel in meiner Schriftart ist?)
Ich sehe dasselbe bei Firefox 11 unter Linux.
Die Methode mit dem negativen Rand ist *unglaublich* unzuverlässig: die -4px sind nur für eine bestimmte Schriftgröße auf einem bestimmten System geeignet. Die Verwendung eines em-Wertes scheint systemübergreifend zu funktionieren, obwohl ich mich nicht mehr an den genauen Wert erinnere...
Fantastischer Artikel... ich bin auf diese Art von Liste gestoßen, aber ich kannte den Grund nicht... jetzt weiß ich es :) Ich hoffe, es macht Ihnen nichts aus, wenn ich diesen Trick in meinem Blog aufschreibe... Nicht zu vergessen, ich werde einen Backlink zu diesem Beitrag haben ;) Fantastische Arbeit
Danke für Ihre Erklärung. Ich bin diesem Problem schon oft begegnet, habe aber bis jetzt keinen Artikel dazu gefunden. Ich schwebe die Elemente, es funktioniert, aber andere in diesem Artikel erwähnte Lösungen klingen auch großartig.
Danke.
Ich benutze statt inline-block lieber Float, und zwar aus genau denselben Gründen wie Daniel und Ian. Warum Dinge komplizierter machen, als sie sein müssen?
Aber trotzdem großartige Workarounds für diejenigen, die sie brauchen!
Wenn ich mehrere Dinge auf derselben Zeile platziere, platziere ich den Code oft auch auf derselben Zeile. Technisch gesehen ist es vielleicht nicht semantisch, aber es passt zu meiner Denkweise.
Solange meine Links nicht zu lang sind, bleibt es relativ einfach zu lesen, aber es löst auch das Leerzeichenproblem, und da es sowieso horizontal angezeigt wird, bevorzuge ich es sogar, es horizontal zu schreiben. Vielleicht bin ich einfach seltsam.
Schöner Beitrag, Chris.
Ich hatte in der Vergangenheit große Erfolge mit
font-size: 0;auf der übergeordnetenulund der richtigen Schriftgröße auf derli. Ich benutze das nur, wenn die Listenelemente zentriert werden müssen. Für alles andere verwende ich schwebende Blöcke.Für diejenigen unter Ihnen, die sagen, sie verwenden einfach Floats, wie gehen Sie mit der Zentrierung einer variablen Anzahl von Blöcken variabler Breite um? Inline-Blöcke sind dafür einfach so praktisch, aber wenn es einen Weg gibt, dies mit Floats zu tun, würde ich es gerne wissen.
Wie wäre es, wenn die UL auf inline-block gesetzt wird und text-align center auf ihrem Elternteil, und dann LIs innerhalb der UL geschwebt werden?
nav {
width: 100%;
text-align: center;
}
ul {
display: inline-block;
}
li { float: left; }
foo
bar
Hier ist es in einem JSFiddle
http://jsfiddle.net/kpadx/
das ist viel besser als meine Lösung
http://jsfiddle.net/kpadx/27/
Diese Methode sieht großartig aus, Tom!
Ich denke, das Setzen der Schriftgröße auf Null ist die optimale Lösung hier, und auch die sauberste.
Leider gibt es ein Problem mit Safari für Windows, bei dem font-size:0 für Leerzeichen nicht respektiert wird, wodurch die ansonsten einfachste Lösung, die Schriftgröße auf dem Elternelement zu setzen,.
CSS wäre
Dies funktioniert, solange Sie keine Unterstützung für Windows Safari benötigen und in allen anderen Versionen von Browsern unterstützt werden, die Inline-Block derzeit unterstützen.
Die richtige Methode ist die Entfernung von Leerzeichen im HTML-Markup, mit welcher Methode auch immer Ihnen am besten gefällt.
Ich bevorzuge
Ich kann nicht sagen, dass ich gute Standards zur Entfernung von Leerzeichen im Code kenne, daher würde ich nicht sagen, dass dies richtig oder falsch ist.
Da dies kein Fehler ist, sondern die Browser Blockelemente so rendern, als wären sie inline, interpretieren sie die Leerzeichen im Code korrekt.
Wow und lol, dieser Beitrag erhält viel Aufmerksamkeit. 100 E-Mail-Benachrichtigungen in meinem Posteingang. Sie erhalten ein Smiley. :-)
Danke für den tollen Beitrag!
Die Idee, das Tag wegzulassen, gibt es schon seit 2008...
http://meiert.com/en/blog/20080601/optional-tags-in-html-4/
Paul Irish erwähnt es hier neuerdings...
http://paulirish.com/2011/primitives-html5-video/
Nach 15 Jahren des zwanghaften Schließens von allem, was mir in die Quere kam, hat mich die Idee, den schließenden Tag wegzulassen, etwas übel gemacht :) das legt sich schnell.
Für mich ist weniger Code besser. UND es funktioniert auch bis IE6.
Das gesagt, tun Sie, was Sie und Ihr Team am glücklichsten macht.
Meiner Erfahrung nach funktioniert das ziemlich gut browserübergreifend, ohne dass eine absolute Pixel-Schriftgröße eingestellt werden muss
Ich habe diese Technik in einer Inline-Block-Layout-Demo auf jsfiddle verwendet
Ich habe den negativen Rand verwendet, aber da er in IE 6 & 7 fehlerhaft ist und Probleme mit Dingen rechts davon verursachen kann.
Die Schriftgröße sieht cool aus und ist wahrscheinlich nicht fehlerhaft.
Das ist wunderschön, vielen Dank
Ich habe die Elemente persönlich immer geschwebt, um den Leerraum zu entfernen, aber wenn dies aus irgendeinem Grund nicht möglich war... irritiert es meinen Pedantismus und ich platziere einfach alle LI-Tags in einer langen Zeile, HTML-Kommentare scheinen eine bessere Methode zu sein.
Ich habe mich immer gefragt, wie andere mit diesem „Bug“ umgehen.
Ich habe früher zu viel Stilunterstützung für IE6 gemacht, so dass ich mich nie mit inline-block vertraut gemacht habe. Float all the way und statische Master-Blöcke (Header/Nav/Footer) immer einzeilig/minifiziert.
Auch: bei HTML-Kommentaren Vorsicht vor dem doppelten Zeichenfehler http://www.positioniseverything.net/explorer/dup-characters.html
Das waren noch Zeiten!
Danke für die Dokumentation, Chris.
Ich habe ein wenig mit
display: tableherumgespielt und eine Lösung gefunden, um dies zu beheben, wie Sie hier sehen können.Grundsätzlich definieren Sie
display: tablefür das Elternelement (in Ihrem ersten Beispiel ist dasnav). Wenn Sie die Kinder zentrieren möchten, müssen Sie eine Breite für das Elternelement definieren, was nicht immer möglich ist.Vielleicht ist das nützlich.
Pete B, deine Idee ist auf jeden Fall einen Versuch wert!
Es ist lustig, ich benutze die Inline-Block-Methode seit vielen Jahren ausschließlich und mache mir selten Sorgen um den Leerraum. Ich entwerfe einfach keine Layouts, die auf Null-Abstand zwischen Elementen angewiesen sind.
Wenn ich mich darum kümmern muss, verwende ich entweder die Kommentar-Methode oder habe einfach keinen Wagenrücklauf zwischen den Elementen. In beiden Fällen ist die Lösung so viel einfacher, als alle es darstellen.
Ich vermeide alle CSS-Methoden wegen Browserinkonsistenzen. Ich bin mir auch nicht sicher, ob Chrome eine Null-Schriftgröße zulässt, zumindest früher nicht. Der negative Rand sollte auch Probleme bereiten, da nicht alle Browser den Leerraum exakt gleich berechnen.
Meiner Meinung nach, nach so langer Benutzung von Inline-Block, ist es einfacher als man denkt, Designs zu vermeiden, die von Null-Leerzeichen abhängig sind, oder einfach die Kommentar-Methode oder keinen Wagenrücklauf zu verwenden.
Ich denke auch, dass es besser ist, den HTML-Weg zu nehmen (kein Wagenrücklauf oder HTML-Kommentare), da jede CSS-Methode auf Browserinkonsistenzen beruht, was, wie wir wissen, nicht sehr zuverlässig ist.
Ich bin zwar noch nie auf ein solches Problem gestoßen, aber ich schätze, ich würde den Weg ohne Wagenrücklauf wählen. Scheint der am wenigsten knifflige zu sein.
Die Methode mit dem negativen Rand ist von Natur aus nicht pixelgenau.
Floats sind begrenzt (können nicht wie Inline-Elemente umbrochen und einfach zentriert werden).
Kommentare sind unordentlich und verursachen Probleme in IE7 bei der Pseudoklasse :first-child und dem Adjacent-Sibling-Kombinator (es gibt jedoch eine JS-Workaround).
Das Weglassen von schließenden Tags ist etwas nicht-semantisch und daher für einige Perfektionisten (wie mich ;-) ungeeignet.
Der Zero-Font-Size-Trick ist derzeit wahrscheinlich am praktischsten. Übrigens, wenn Sie ihn verwenden, ist es sinnvoll, die `rem`-Einheit für Kindelemente zu verwenden, um das Layout em-bewusst zu halten. `rem` bedeutet die Schriftgröße des Stammelements des Dokuments (`html`-Element im Falle eines HTML-Dokuments), und die Einheit wird von aktuellen Versionen aller Browser (einschließlich IE9) unterstützt. Ein Pixelwert für die Schriftgröße kann gleichzeitig (vor dem `rem`-Einheitswert) als Fallback für ältere Browser verwendet werden.
Es ist 100% semantisch äquivalent zum direkten Platzieren der schließenden Tags vor dem öffnenden Tag des nächsten Geschwisters oder dem schließenden Tag des Elternteils. Es ergibt denselben DOM-Baum (ohne Textknoten zwischen den Elementen). Natürlich ist die erste Option XML-inkompatibel, aber es geht nur um die Syntax, nicht um die Semantik :)
PS: Vielen Dank für die Idee, rem-Einheiten zu verwenden, um die Möglichkeit zu erhalten, die Schriftgröße von Inline-Blöcken nach dem Zero-Font-Trick zu ändern!
Eine weitere interessante Option ist die Verwendung einer benutzerdefinierten Schriftart, in der die regulären Leerzeichen Nullbreite haben (wie in den Kommentaren zu einem guten russischen Artikel zu diesem Thema vorgeschlagen).
@SelenIT: Ja, das Weglassen von schließenden Tags ist in HTML5 formal gültig, aber für mich inakzeptabel, da ich diesen Teil der HTML-Syntax als großen Fehler im Design betrachte, also werde ich dieses „Feature“ sowieso nicht nutzen. Ich bevorzuge ein HTML-Dokument, das syntaktisch eigenständig ist, im Allgemeinen ohne die Notwendigkeit von Tag-Namen-Wörterbüchern zur Analyse. Es ist in Ordnung, wenn Sie kein Perfektionist sind wie ich ;-)
Wenn Sie HAML oder eine andere Art von HTML-Präprozessor verwenden, können Sie es einfach beim Kompilieren minimieren. Und dann ist Ihr HTML minimiert, was immer gut ist.
Ich wollte dasselbe sagen! Ist es nicht eine bewährte Methode, HTML sowieso zu komprimieren / minimieren?
Ich habe sie einfach geschwebt, sie in ein div gelegt und die Position des div auf relativ gesetzt, seine Breite gesetzt und den Rand auf auto gesetzt (damit sie zentriert werden können).
Es ist ratsam, margin-right: -.25em; anstelle von 4px zu verwenden.
Woher wissen Sie, dass die Größe eines einzelnen Leerzeichens 0,25em beträgt?
Wo kann ich eine Referenz dazu finden?
@Taurif Ich bin mir ziemlich sicher, dass die Abstände von der verwendeten Schriftart und der Art und Weise, wie diese Schriftart vom Browser angezeigt wird, abhängen. Die Methode mit dem negativen Rand ist wegen dieser Unsicherheit nicht sehr zuverlässig.
Ich würde die Kommentar-Methode empfehlen, Wagenrückläufe zwischen Elementen vermeiden oder einfach Designs vermeiden, die von Null-Abständen abhängig sind - das ist einfacher als man denkt.
Ach so, wenn ich die Schriftgröße als
1emsetze, dann (zum Beispiel) ist die Größe eines einzelnen Leerzeichens0,25em, also wenn ich die Schriftgröße auf2emändere, dann kann die Größe eines einzelnen Leerzeichens als0,5emangenähert werden.Natürlich bevorzuge ich die Kommentar- oder Tag-Splitting-Methode. Ich möchte nur mehr wissen :)
@Taufix Ich glaube nicht, dass das ganz richtig ist. Wenn eine Schriftart einen Abstand zwischen Elementen erzeugt, der 0,25em misst, dann sollte er 0,25em bleiben, auch wenn die Schriftgröße erhöht wird. Em's sind ein relatives Maß, sie skalieren mit der Schriftgröße.
Das Problem ist, dass es nicht wirklich so funktioniert. Verschiedene Schriften können unterschiedliche Abstandsangaben haben, so dass es für eine Schriftart 0,25em und für eine andere 0,2em sein kann. Es ist noch schlimmer, wenn Sie die Schrift vergrößern. Dann kann das, was perfekt war, jetzt kaputt sein.
Ich habe eine Demo für Sie erstellt, die Sie hier sehen können: jsFiddle Negative Margin Trick. Sie können auch sehen, wie sich Firefox von Chrome unterscheidet: Chrome v Firefox für die Leerraumdarstellung.
Ja. Monospace hat alles erklärt!!!
Vielen Dank!
Ich würde mich von PX-Messungen fernhalten, da der Abstand auf einem einzelnen Leerzeichen basiert. Ich benutze Folgendes, um das gesamte Problem ohne viel Aufhebens zu bändigen.
Es ist ziemlich süß und fast narrensicher.
Ich verstehe es einfach nicht. Warum mit all den CSS-Schikanen umgehen? Wissen Sie, was 100 % narrensicher ist? Verwenden Sie die Kommentar-Methode oder lassen Sie keinen Wagenrücklauf zwischen den Listenelementen. Alles andere ist ein vergeblicher Kampf gegen Browserinkonsistenzen und eine Reihe von Variablen. Oder vielleicht bin ich verrückt :P
Die Lösung mit dem negativen Rand ist eigentlich nicht präzise, die genaue Zahl hängt von der Schriftgröße und der Schriftart ab. Einige Schriftarten haben einen exakten Leerraum, wie Courier New. Ich habe vor einiger Zeit darüber geschrieben, obwohl ich die damals entwickelte Lösung nicht empfehlen würde, sie ist viel zu kompliziert. Im Moment benutze ich einen negativen Rand (aber ich benutze em statt px aus offensichtlichen Gründen) und kümmere mich nicht zu sehr um Pixelperfektion. Hier ist meine komplizierte Lösung: http://nerd.vasilis.nl/remove-whitespace-inline-block/
Es ist ein Problem, auf das ich immer wieder gestoßen bin, als ich Navigationsleisten gemacht habe, und ich habe mich geärgert, als ich erkannte, was das Problem war...
Der negative Rand-Hack stammt wahrscheinlich aus meinem CSS Box Framework https://github.com/vladocar/Box-CSS-Framework/blob/master/box.css zumindest glaube ich, dass ich der Erste war, der diesen Hack „erfunden“ hat.
Der negative Rand ist keine narrensichere Lösung, aber wahrscheinlich der einfachste und eleganteste Hack, wenn es um den Aufbau von CSS-Frameworks geht.
Bessere Ergebnisse können mit doppelter Größenänderung der Schrift erzielt werden, aber diese Lösung ist schwerer zu implementieren und codespezifisch.
Für mich scheint es, dass das Entfernen der schließenden
</li>Tags dieses Problem nicht lösen sollte (d.h. die Leerzeichen sollten nicht verschwinden). Da HTML5 erlaubt, dass schließende Listenelemente-Tags weggelassen werden, sollten die Leerzeichen weiterhin erhalten bleiben. Das Weglassen der schließenden Tags sollte genau dasselbe Ergebnis haben wie das Einbeziehen. Ich nehme an, es wird davon ausgegangen, dass die Elemente aneinander stoßen, aber das scheint nicht richtig zu sein, besonders wenn das neue Listenelement in der nächsten Zeile beginnt.Ich glaube, das ist ein Fehler in allen Browsern und sollte gemeldet werden. Vielleicht liege ich falsch, aber meine Reaktion ist, dass die Leerzeichen dieselben sein sollten wie beim Einbeziehen der schließenden Tags.
Die Leerzeichen werden BEIBEHALTEN, aber als ein einzelnes Leerzeichen IM Element.
Das Element wird beim Auftreten des nächsten (oder Element schließt.
Daher ist dies (besonders bei großen Polstern) nicht (leicht) sichtbar.
Entschuldigung für den verdammten Beitrag.
„Das Element wird beim Auftreten des nächsten <li> oder </ul> Elements geschlossen.“
Wow, ich hatte heute Morgen genau dieses Problem, ich habe es behoben, indem ich dem 102% der Breite des
gegeben habe, aber es war unangenehm mit der Lösung!
Ich werde jetzt Ihre Vorschläge ausprobieren.
Danke!
Das ist sehr nützlich, danke
Die Methode mit dem negativen Rand funktioniert in Firefox nicht ganz richtig. Es gibt eine Lücke von 1 Pixel zwischen zwei der li's.
Font-size: 0 scheint mir am besten. Zweitens wäre die seltsame HTML-Formatierung, denn obwohl sie seltsam aussehen mag, ist sie immer noch absolut korrekt und fügt keine zusätzliche Markup- oder Style-Hacks hinzu.
Sehr nützlicher Artikel, danke!
Wunderschön einfache Techniken, um es zu beheben! Ich liebe die Einfachheit der HTML5-Option,
Toller Artikel!
Float für mich.
Übrigens, ist inline-block nicht ratsam?
Ich benutze die Inline-Block-Methode seit vielen Jahren ausschließlich ohne ein einziges Problem. Was die meisten nicht erkennen, ist, dass die meiste Zeit, die für Browser-Debugging aufgewendet wird, *wegen* Floats ist.
Bei Inline-Block können zwei Probleme auftreten (dieser Artikel behandelt eines), sie sind vorhersehbar und ihre Lösungen sind einfach. Das sollte ein Kinderspiel sein.
Floats wurden nie für das Layout einer Seite entwickelt. Floats für diesen Zweck sind ein Hack. Inline-Block ist *der* Weg, um eine Seite zu layouten.
Eine hervorragende Erklärung. Danke, Justin.
Ich habe lange Zeit Inline-Block wegen IEs vermieden und hasse es, Zoom-Fixes zu verwenden.
Seltsamerweise verwenden Facebook, Youtube, Twitter Float für diesen Artikel und Twitter verwendet Float, um eine Seite zu layouten. Google verwendet Inline-Block für fast alles.
Sie haben Recht. Fast alle Entwickler verwenden Float anstelle von Inline-Block. Das hat mich schon lange geärgert. Ich denke, es ist nur Gewohnheit, und niemand ist gekommen, hat sie in den Hintern getreten und ihnen gesagt, sie sollen es kaputt machen.
Ich versuche seit Jahren, die Nachricht zu verbreiten. Ich habe mich sogar so sehr davon genervt, dass ich ein jsFiddle geschrieben habe, um einen Link bereitzustellen, den ich einfach in einen Kommentar wie diesen werfen könnte: http://jsfiddle.net/Cerebrl/ZkQnD/
Wenn Zoom die Hauptbeschwerde ist, dann verzweifeln Sie nicht! Werfen Sie es einfach in eine offizielle IE-Bedingung und fertig (sehen Sie mein Fiddle)! Diese sehr, sehr einfache Umgehungslösung lässt Inline-Block bis IE6 funktionieren und wird nur den sehr Browsern präsentiert, die es brauchen. Für jeden anderen Browser ist es nur ein Kommentar.
Als ich zu Inline-Block wechselte, hat sich meine Entwicklungszeit drastisch verkürzt. Meine Browserübergreifende Tests sind sehr einfach, und alles ist, wie es sein sollte, die Welt ist in Ordnung.
Das Problem mit dem Leerraum ist nicht so schlimm, wie man denken würde. Versuchen Sie einfach, Designs zu vermeiden, die Null-Abstände erfordern; es ist einfacher als Sie denken. Wenn Sie eine Situation haben, die dies erfordert, werfen Sie einfach die Kommentar-Methode ein oder lassen Sie keine Rückläufe zwischen den Elementen.
Im schlimmsten Fall verwenden Sie einfach Floats, aber ich sage Ihnen, ich benutze Floats so selten, dass ich fast vergessen habe, wie man sie cleart :)
Eine öffentliche Dienstleistungsmeldung! =D Nett! Aus diesem Grund werde ich bei meinem nächsten Projekt versuchen, Float komplett aufzugeben.
In anderen Fällen, HTML5 ohne schließenden Tag? Ein dummer Zug von W3C und WHATWG.
„Einen Fehler gemacht? Vergessen, einen Tag zu schließen? Keine Sorge! HTML5 schließt sie für Sie!“
Haben sie nicht mehr zu tun als das?
Optionale schließende Tags sind keine neue Erfindung. Sie waren lange Zeit eine unterstützte Funktion von HTML2-4, die in allen bestehenden Browser-Engines implementiert wurde. WHATWG und W3C mussten diese Realität einfach in den neuen Standard dokumentieren, wegen seiner Designprinzipien wie „den Kuhpfad pflastern“ und der Notwendigkeit der Abwärtskompatibilität mit bestehendem Inhalt und Browsern.
Tatsächlich sind optionale Tags ein großer Vorteil von HTML, da sie einfach *mehrere korrekte Möglichkeiten* bieten, dieselbe robuste und vorhersagbare DOM-Struktur zu markieren. Zum Beispiel können Sie immer sicher sein, dass jedes
TABLE-Element mindestens einTBODY-Kind hat, jede andere Option ist per Design unmöglich. Mit „striktem“ XML-Parsing ist das nicht der Fall, in XHTML kann man dietableohnetbodyhaben, genauso wie mit ihr. Was ist also wirklich „strikter“?Wegen dieses „Fehlers“ benutze ich fast immer Floats anstelle von Inline-Blöcken (und ein bisschen wegen IE7), aber ersteres fühlt sich einfach „falsch“ an. Floats sind nicht für Navigationen oder ähnliches konzipiert, Inline-Blöcke sind definitiv der richtige Weg. Was die Lücke angeht, werde ich mir in Zukunft definitiv den Font-Size-Trick ansehen. Er scheint ziemlich anständig.
Ich ziehe es vor, die Leerzeichen zwischen den Tags zu schließen. Es ist nicht immer schön, aber es kommt dem gewünschten Verhalten am nächsten – keine Leerzeichen. Negative Ränder fühlen sich für mich immer irgendwie falsch an, Ränder werden viel für die Positionierung von Layouts verwendet, ich sehe sie nie als sehr elegante Lösung an. Ich denke, Wort-/Buchstabenabstand wird die beste Option werden.
Ich liebe den Font-Size-Trick
Vielen Dank dafür, es klärt ein paar verwirrende Momente, die ich in der Vergangenheit hatte. Sie sollten wahrscheinlich em anstelle von px für den negativen Rand-Option verwenden.
Dieser französische Beitrag ist ziemlich gut zum Thema:unerwünschte Leerzeichen.
Spricht über rem, letter-spacing, white-space und die Zukunft: text-space-collapse.
Ich benutze immer den Font-Size-Trick, der kurz und effizient ist.
http://www.alsacreations.com/astuce/lire/1432-display-inline-block-espaces-indesirables.html
*den Link vergessen!
Es gibt auch die folgende CSS-Eigenschaft
white-space-collapse: discard;Ich glaube jedoch nicht, dass irgendein Browser ihn tatsächlich implementiert :(
Ich bevorzuge die jQuery-Methode, da sie schriftenunabhängig ist. Habe sie kürzlich irgendwo online gesehen. Weiß nicht, ob schon jemand das erwähnt hat.
Zum Beispiel, wenn es einen Container gibt, der Inline-Block-Elemente darin hat
$(‘#container’).contents().filter(function() { return this.nodeType === 3; }).remove();
Um Textknoten nur zu entfernen, wenn sie nur Leerzeichen enthalten
Fazit: Sie haben eine Reihe von Hacks, aber keine richtige Lösung. Der Font-Fix ist halbwegs gut, die anderen Fixes können Ihnen später im Leben nur Ärger bereiten.
Ich habe nichts gegen diese Art von Artikeln, aber es wäre schön, Leute vor den Problemen zu warnen, die sie bekommen, wenn sie bestimmte „Fixes“ verwenden.
Ich benutze immer Inline-Block, ziemlich nützlich, ich kann das Kind mit der Text-Align-Eigenschaft ausrichten, zentriert, links, rechts
dieser kleine Leerraum ist das einzige Problem, ich benutze die Ident-Methode, um das Problem zu korrigieren.
PS: ENTSCHULDIGEN SIE MEINE ENGLISCHE GRAMMATIK
Ich versuche immer, Inline-Block zu verwenden, da es in gewissem Sinne semantischer ist als Float und auch keinen Fluss unterbricht, noch muss ich Clearfix und so etwas hinzufügen.
Da ich normalerweise in Frameworks entwickle oder zumindest nicht in reinem HTML, schreibe ich meinen Code, um die Ausgabe inlined auszugeben, da er keine Leerzeichen oder Zeilenumbrüche zwischen den Tags ausgibt und auch ein wenig komprimiert =D
Und für diejenigen, die sagen, mein Code wird schwer lesbar, benutze ich normalerweise jedes verfügbare Dev-Tool (normalerweise in Chrome, aber könnte Firebug in Firefox sein, zum Beispiel), das den HTML automatisch konvertiert und bereinigt. Und mein Code, der den HTML ausgibt, ist ziemlich gut formatiert.
Also für mich ist es die beste Lösung und es ist mir egal, ob Browser Inline-Block nicht unterstützen. =P
Für die genannten Methoden
– Tags aufbrechen: Das hasse ich wirklich... es wirkt auf mich wie kaputtes HTML... Ich benutze nicht einmal Zeilenumbrüche deswegen
– Negativer Rand (oder Wortabstand): funktioniert ok, wenn man sich um seine Schrift und Schriftgröße kümmert
– Float: ziehe es vor, wenn möglich nicht zu verwenden (ich versuche sogar, das CSS-Framework auf Inline-Block zu ändern, wenn möglich)
– Kommentare: es funktioniert gut für reines HTML, jede andere Art, HTML zu generieren, wird schwer zu schreiben/pflegen
Toller Beitrag Chris
Ich mache selten etwas, das auf keinen Abstand angewiesen ist, aber wenn ich es tue, setze ich einfach keine Abstände zwischen den Listentags.
Es ist meiner Meinung nach die zuverlässigste Methode.
Anstatt den Tag auf mehrere Zeilen aufzuteilen, bevorzuge ich diese Syntax
Oder diese
Die erste ist genau das, was ich mache! Es funktioniert gut und ist leicht zu lesen.
Das ist es, was ich getan habe
... aber ich denke, deine erste gefällt mir besser! Sieht viel sauberer aus und ist viel leichter zu lesen.
Übrigens, Justin, ich stimme all Ihren Kommentaren voll und ganz zu! Ich habe vor ein paar Monaten den Wechsel vollzogen, und jetzt benutze ich kaum noch Floats. Es ist SO viel einfacher. Außerdem muss ich mit der obigen HTML-Syntax keine Browserinkonsistenzen und verrückten Hacks bearbeiten. Es funktioniert einfach! Es ist sogar noch einfacher, wenn es mit LESS verwendet wird. Ich mache einfach das
Um einen obigen Poster zu wiederholen,
Wenn es sich um eine Navigation handelt, schweben Sie die verdammten Dinger einfach... Ach, warum mehr Arbeit machen, wenn sie nicht benötigt wird?
Ich nenne das Phänomen „das scheint zu einfach, es fühlt sich an, als würde ich schummeln...“ unter den Web-Kreativen.
Stellen Sie sich vor, Sie könnten einfach border-box für alles setzen und müssten sich nicht mit pixelgenauen Berechnungen für Polster und Ränder herumschlagen...
Nein, das wäre zu einfach, könnte nicht richtig schlafen...
Lol, ich sage nur. Aber einige tolle alternative Lösungen. Den negativen Rand hatte ich vorher noch nicht kennengelernt.
Was ist mit dem Nicht-Schließen der LI-Tags?
Wenn Sie HTML (NICHT XHTML – wichtig) verwenden, werden die LI-Elemente (googeln Sie nach mehr davon) automatisch geschlossen und haben keine Abstände (kein leeres Textknoten).
Überprüfen Sie http://jsfiddle.net/stryju/6S5N8/ für Erklärungen
Hmmm.. Ich benutze die Float-Technik.. sie ist so einfach..
Vertrauen Sie mir, Inline-Block ist einfacher. Ich gehe davon aus, dass Sie fast ausschließlich Float verwenden und selten (oder nie) Inline-Block verwenden, und deshalb erscheint Float einfach, weil es Ihnen vertraut ist, es ist bequem.
Inline-Block ist Float überlegen und in fast jeder Layoutkonfiguration wesentlich einfacher. Floats benötigen ständig Clearfixes (wie viele brauchen wir wieder für die verschiedenen Browser?), und sie verursachen die Mehrheit der Browserinkonsistenzen. Das klingt nicht „so einfach“.
Wenn Sie richtig gestalten, sollten Sie sich die meiste Zeit keine Sorgen um den Leerraum machen müssen, und wenn doch, ist es eine sehr einfache Lösung. Das Beispiel für den Leerraum, das Chris oben verwendet hat, ist wirklich einfach zu beheben, ohne sich überhaupt um den Leerraum kümmern zu müssen – setzen Sie einfach den roten Hintergrund auf die ul und Sie sind fertig.
Wie gesagt, denken Sie einfach über das Design nach, und Sie können Inline-Block ohne Sorge verwenden. Sobald Sie sich „konvertiert“ haben, wird Ihre Entwicklungszeit merklich abnehmen.
@Justin, wir müssen Float nicht clearen, wenn wir das Elternelement mit overflow hidden versehen, also keine Clearfixes benötigen. Ich denke, es gibt ein Design, bei dem Pixel Perfektion wichtig ist, und dort finde ich Float besser. Es ist vielleicht auch einfacher für mich, da ich Float seit vielen Jahren benutze, also kenne ich mehr oder weniger das Verhalten der meisten Browser.
Das gesagt, Inline-Block ist eine sehr einfache Lösung für Designs, die keine Pixel Perfektion benötigen, und ich benutze es nur für diesen Fall. Ich designe normalerweise keine Seiten (es gibt Designer, ich bin Frontend-Entwickler), also wähle ich einfach das, was für ihr Design am besten funktioniert. :)
@Jeffri Ich verstehe das Argument immer noch nicht. Pixel Perfektion (ich nehme an, Sie meinen Null-Abstände) KANN mit Inline-Block erreicht werden. Ich mache das ständig. Entfernen Sie einfach den Abstand zwischen den Elementen (entweder buchstäblich oder mit einem Kommentar) und Sie sind fertig. Das ist alles.
Außerdem scheint die Overflow: hidden Methode für Floats ein Hack zu sein, da sie sicherlich kein logisches Verhalten für CSS ist. Die Gefahr dabei ist, dass Browser es leicht als Fehler erkennen und beheben könnten, und weg ist Ihr Layout. Es kann auch keine narrensichere Methode für alle/alten Browser sein.
Ich benutze
font-size: 0px;LESS macht dies zur effektivsten Methode meiner Meinung nach, da Sie sich mit LESS nicht um das relative Schriftgrößenproblem kümmern müssen, das sonst auftreten kann.
Wir verwenden unterschiedliche Dinge, bis wir mit der „HTML-Minimierung“ beginnen. Dies entfernt alle Leerzeichen und verkleinert HTML-Dateien, sodass wir uns keine Sorgen mehr um diese zusätzlichen Leerzeichen machen müssen.
verwenden
* {
margin: 0;
padding: 0;
}
Das Weglassen des schließenden Tags scheint für mich die eleganteste Lösung zu sein (obwohl ich gar nicht wusste, dass es erlaubt ist!). Seltsame Formatierungen und überflüssiges CSS fühlen sich nach einem Hack an.
Danke Justin. Ich war ein Float-Typ und ich schätze, ich muss wirklich umsteigen. Ich glaube, per Pad/Telefon erstellte Websites, die mit Media Queries dimensioniert wurden, werden erfolgreich per Inline-Block erstellt.
Gern geschehen. Ich freue mich, dass ich helfen konnte! Ja, angesichts der Menge an Variablen heute im Webdesign, nicht mehr nur Webkit, Mozilla und IE für Desktops, sondern auch eine Vielzahl von mobilen Browsern, brauchen wir kugelsichere Wege, um sicherzustellen, dass unsere Designs nicht kaputt gehen.
Da Floats von Natur aus fehlerhaft sind, da sie aus dem Dokumentenfluss genommen werden, müssen verschiedene Browser entscheiden, wie sie diese und ihre Interaktion mit anderen Elementen rendern. Es macht einfach mehr Sinn, etwas zu verwenden, das einem traditionellen Dokumentenfluss folgt, sodass es viel weniger Interpretation gibt. Ich hoffe, es hilft Ihnen bei Ihrer zukünftigen Entwicklung.
Gute Arbeit Justin :) Ich liebe diesen Teil „Schließen Sie das schließende Tag aus“
Ich verwende den folgenden Code.
ul {
word-spacing: -1em;
display: table;
display: block\9; /* Hover-Bug für IE8, 9 */
width: 600px;
}
li {word-spacing: normal;
display: inline-block;
vertical-align: top;
/display: inline;
/zoom: 1;
width: 100px;
}
Die einfachste Lösung ist, alles inline zu machen
Warum haben die Leute Angst vor der Technik „Leerzeichen entfernen“? Sollten wir nicht sowieso HTML komprimieren, um unnötige Leerzeichen zu entfernen?
Ich konnte nicht alle Antworten lesen (zu viele!), aber der Fix mit negativer Marge funktioniert auch in Chrome nicht!! (Chrome 18.0.1025, Mac OS X 10.7.3)
Ich kannte die Sache mit dem negativen Abstand und dem Floaten. Aber ich habe die Sache mit der Schriftgröße Null gelernt.
Durch die Verwendung eines negativen Abstands wird es in IE wie zuvor gesagt unterbrochen. Bei Floats müssen wir den Float möglicherweise mit zusätzlichem unnötigem HTML bereinigen, so etwas wie
<div class="clear"></div>.Aber mit Schriftgröße 0. ist es nur eine Sache, die wir tun müssen
Danke Chris
Es lohnt sich…
Nun, ich habe gerade das HTML-Markup geändert.
Wenn display: inline-block ist, gibt es einen Leerraum, aber ich habe keinen Leerraum im Code, also gibt es keinen auf dem Bildschirm.
Ich verwende in letzter Zeit viel Inline-Block, also verwende ich diese Code-Struktur überall, das hilft mehr als CSS-Hacks oder was auch immer
Wenn Sie keine Leerzeichen zwischen Wörtern wünschen, entfernen Sie diese einfach im HTML. Die Leerzeichen zwischen Inline-Blöcken sind nicht anders. Negative Margen sind nur ein Hack, der später zu Schwierigkeiten führen wird.
Das Entfernen der Leerzeichen im HTML ist ein Kinderspiel, wenn Ihre Ansicht nur HTML und keinen führenden oder nachgestellten Leerraum ausgibt. So mache ich das.
Tolles Thema. Inline-Block-Elemente sind etwas knifflig und es ist schön, verschiedene Ansätze zu sehen, um die Leerzeichen zu entfernen.
Aber Inline-Blöcke sind überhaupt nicht knifflig. Das finde ich so seltsam an der ganzen Debatte. Sie könnten nicht einfacher sein. Wenn Sie den Leerraum nicht möchten, entfernen Sie ihn im Markup. So einfach ist das.
http://jsfiddle.net/mJjCc/
Relevanter Code
Obwohl 0 = 0rem ist, schützt die Verwendung des Suffixes in diesem Fall Browser ohne Rem-Unterstützung. Während negativer Wortabstand nicht alle Browser behebt, scheint er auch keinen Schaden anzurichten. Durch die Kombination dieser Regeln sollten wir unerwünschte Abstände in vielen modernen Browsern und vielleicht auch in einigen älteren eliminieren können.
Wie Sie meinem vorherigen Kommentar entnehmen können, habe ich kürzlich damit begonnen, genau dieses Problem anzugehen. Ich hatte heute einen Moment Zeit, um meinen Code browserübergreifend zu testen. Meine Parameter für die Codierung eines Inline-Block-Whitespace-Fixes waren
– Keine Pixel-Zurücksetzung von Schriftarten.
– Keine negativen Margin-Berechnungen für unterschiedliche Schriftarten und/oder Browser.
– Inline-Block anwenden, aber Whitespace dazwischen universell, unaufdringlich und über Browser und Plattformen hinweg entfernen.
Ich glaube, ich habe diese Anforderungen in diesem jsFiddle erfolgreich erfüllt
http://jsfiddle.net/jTSnd/
Die folgenden Browser wurden getestet und funktionierten wie erwartet
– IE 6, 7, 8
– Opera 11.01 Windows
– Opera 11.64 Ubuntu
– Chrome 19 Windows
– Chrome 19 Ubuntu
– Safari 5.1.7 Windows
– Firefox 12 Ubuntu
– Firefox 10 Windows
Hier ist das relevante CSS
Ich verwende immer die Methode mit negativer Marge, aber die Floating-Methode ist auch einfach. Danke für das Teilen.
Wenn Sie ein Element links und ein Element rechts haben möchten, ist ein Float besser – es sei denn, Sie kennen die Breite dazwischen, um Margen hinzuzufügen.
Inline ist großartig, ABER manchmal braucht man Inline-Block und IE6&7 können damit kämpfen, selbst wenn man Zoom verwendet, was zu diesem Zeitpunkt vielleicht nicht angebracht ist.
Die Verwendung jeder Art von negativer Marge wird immer zu Problemen führen, wenn sich die Schriftgröße ändert und Sie Pixelgenauigkeit benötigen. Auch die zusätzlichen Abstände sind meiner Erfahrung nach oben und unten.
Die Sache mit der Schriftgröße sieht nach einer guten Lösung aus, aber ich frage mich, was Google tut, wenn es font-size:0 sieht?
Ich würde gerne fließen können, aber trotzdem zentriert ausgerichtet sein. Es sei denn, ich habe das falsch verstanden, verwendet das Beispiel http://jsfiddle.net/kpadx/ nur Padding, um den Effekt zu erzielen, der von der Kenntnis der Breite abhängt?
Bei der Verwendung von Inline-Block ist die Ausrichtung der Elemente links, rechts oder in der Mitte extrem einfach. Verwenden Sie einfach text-align! Die Inline-Blöcke verhalten sich wie Textzeichen, sodass text-align ihre Position fehlerfrei manipuliert.
Ich habe sogar gezeigt, wie es mit einem links und einem rechts geht. Sehen Sie hier: jsFiddle
IE6 und IE7 funktionieren perfekt mit Inline-Block, aber Sie müssen sowohl display: inline; ALS AUCH zoom: 1; verwenden. Der einfachste, am wenigsten hackische Weg, dies zu tun, ist die Verwendung eines bedingten Kommentars für IE7 und darunter und das Kopieren aller Ihrer Inline-Elemente in ein Style-Tag und die Zuweisung der erforderlichen Eigenschaften.
Ich habe hier ein Beispiel dafür, schauen Sie sich einfach das HTML an: jsFiddle
Ich hoffe, das hilft. Inline-Block ist eine sehr schöne Sache, aber da wir von Floats so abhängig waren, sind viele mit der Eigenschaft nicht vertraut genug, um sie zu schätzen.
Ich wäre ziemlich verärgert, wenn ich nach Ihrem Code, Justin, gehen müsste, um Ihre Elemente zu reparieren oder zu ändern. Ich möchte nicht immer wieder suchen müssen, wo sich das nächste Anfangs-/End-Tag befindet – ganz zu schweigen davon, dass ich mit dynamisch generiertem Code umgehen muss, bei dem die Anpassung des Leerraums möglicherweise mehr ein Albtraum als alles andere ist.
Diejenigen, die „einfach Float verwenden!“ spammen, haben offensichtlich noch nie versucht, den Text zu zentrieren.
Nachdem ich alle Kommentare gelesen habe, kann ich wohl sicher sagen, dass es keine saubere Möglichkeit gibt, dies ohne eine Vielzahl inkonsistenter Hacks zu implementieren.
@ Nick
Lol, ich benutze Inline-Block seit Jahren in Teams mit anderen Entwicklern und hatte noch nie Beschwerden über meinen Codierungsstil (sie lieben ihn normalerweise).
Hier ist die große Enthüllung: Ich muss mich selten mit dem hier diskutierten Whitespace-Problem befassen, und das liegt daran, dass es einfach ist, Benutzeroberflächen zu entwerfen, die keinen Null-Whitespace zwischen Elementen erfordern. Dieses ganze Ding ist wirklich ein falsches Problem.
Wenn Sie beim Entwerfen wissen, dass Inline-Block verwendet wird, können Sie leicht anpassen, wie Sie nahtlose Benutzeroberflächen ohne Probleme mit unerwünschtem Leerraum entwerfen. Ich mache das täglich in den komplexesten Webanwendungen.
Wenn ich das Problem habe, benutze ich einfach die Kommentar-Methode. Und das ist fast immer innerhalb großer Abschnitte über Layouts, die niemals dynamisch manipuliert werden, sodass es nie wirklich ein Problem ist. Sobald ich die internen Elemente einer Webseite oder App entwerfe, möchte ich fast immer einen Abstand zwischen den Elementen haben.
Auf jeden Fall, danke für den Kommentar, aber ich glaube nicht, dass Ihr Argument stichhaltig ist. Passen Sie auf.
@ Justin,
Es gibt mehr schlechte Entwickler als gute, daher ist es nicht gerade „stichhaltig“, wenn sich niemand darum kümmert. Ich habe mir den bereitgestellten Code angesehen und er ärgert mich bereits, geschweige denn in einer größeren Webanwendungsumgebung.
Sie sprechen davon, zu wissen, dass Inline-Block verwendet wird, und Ihre Designs darauf zu basieren: Ich hoffe doch sehr, dass Sie Ihre Designs nicht auf der Verwendung von Inline-Block basieren, sondern darauf, was die UX / das Branding / das Design verlangt?
Ich würde gerne Beispiele Ihrer Websites sehen, auf denen Sie „im Wissen, dass Inline-Block verwendet wird“ entworfen haben.
Es gibt zu viele wankelmütige Entwickler mit unterdurchschnittlichen Entwicklungstechniken, daher entschuldigen Sie bitte, dass ich die Gültigkeit eines Hacks in Frage stelle, da diejenigen an vorderster Front dieser Spezifikationen sich nicht die Mühe machen, ihre Zeit damit zu verschwenden.
@ Nick
„Es gibt mehr schlechte Entwickler als gute …“
Ich bin mir dessen bewusst, und ich arbeite nicht mit ihnen zusammen.
„Ich hoffe doch sehr, dass Sie Ihre Designs nicht auf der Verwendung von Inline-Block basieren, sondern darauf, was die UX / das Branding / das Design verlangt?“
Das behaupte ich überhaupt nicht. Ich gebe ein Beispiel. Viele Designer platzieren beim Erstellen einer horizontalen Navigationsleiste Hintergründe auf den li’s, und sie benötigen Null Whitespace, um Lücken zu verhindern. Warum nicht stattdessen den Hintergrund auf die ul’s legen? Jetzt benötigt Ihre Nav keine Null Whitespace. Wenn ein li einen Hover-Zustand benötigt, geben Sie diesem li einfach einen anderen Hintergrund, während die anderen keinen haben.
Ich sehe auch so viele Designer, die Dinge einfach tun, weil Floats es ihnen ermöglichen, dies zu tun, nicht weil es der richtige oder der beste Weg ist, sondern einfach, weil sie es können. Es geht mehr darum, wie man Designprobleme löst. Ich spreche nicht davon, das Aussehen oder die Marke des Interfaces zu ändern, um Inline-Block zu ermöglichen, sondern davon, wie man Probleme löst, die Designs präsentieren.
„Ich würde gerne Beispiele Ihrer Websites sehen, auf denen Sie ‚im Wissen, dass Inline-Block verwendet wird‘ entworfen haben.“
Nun, die meiste Arbeit, die ich mache, unterliegt einer NDA und ist hinter Firewalls, aber Sie sind herzlich eingeladen, Ka-Prow Bistro zu besuchen, um einen meiner wenigen öffentlichen Kunden zu sehen.
Sie sind auch herzlich eingeladen, mein Dribbble-Konto zu besuchen, wo Sie Schnappschüsse einiger meiner Arbeiten sehen können; besuchen Sie mein Forrst-Konto, um einige meiner Design- und Entwicklungsbeiträge zu sehen; mich auf Quora anzuschauen, wo ich über Anwendungsentwicklung, UX, Neurowissenschaften und Psychologie spreche.
Ich hoffe, das hilft.
Ich benutze
Manchmal die Schriftgröße in Browsern, die nicht konform sind. Zum Beispiel in IE 7-9
Meine Freunde, welche Alternativen gibt es?
Das sollte den Trick machen
Ich verwende Inline-Block mit eng aneinander liegenden Öffnungs- und Schließungstags. Sie können Ihren HTML-Code immer noch schön formatieren und es werden keine Hacks verwendet. Alles, was ich tue, ist, alle Inline-Block-Regeln als Inline in eine ie6-7-Datei in einem If-Statement aufzunehmen.
Ich verabscheue Floats für das Layout. Sogar der Name „float“ suggeriert einen Mangel an echtem Platz und Kontrolle über die betreffenden Elemente.
„Wo sollen diese 2 Sofas hin, Kumpel?“
„Oh, wenn Sie sie nebeneinander ‚floaten‘ könnten, wäre das großartig. Keine Sorge. Ich werde etwas Bedeutungsloses und Unsichtbares darunter legen, damit der Boden weiß, dass sie existieren.“
„Eh? WTF?!“
Ja, eine weitere Stimme der Vernunft! Danke!
Es gibt eine einfache, wenig bekannte Möglichkeit, Leerzeichen zwischen Inline-Blöcken zu vermeiden, und zwar diese
Ja, ich weiß, es ist schrecklich, aber es ist die schnellste Lösung da draußen.
Ich weiß es, weil ich das Gegenteilsproblem hatte: Ich hatte einen HTML-Kompressor auf Serverseite, der meinen HTML-Code minimierte. Das Problem war, dass ich Abstand brauchte, sonst würde `text-align: justify` nicht funktionieren (habe es in den Spezifikationen gelesen)!
Also ja, das Entfernen von Leerzeichen zwischen den Tags löst die Probleme sofort.
Schriftgrößenlösung ohne Verlust der übergeordneten Schriftgröße
Negative Margen behalten einige Probleme mit der Browserübergreifung.
Danke für die „Kommentar-Lösung“ und „Null-Schriftgröße“, Sie haben mich gerettet.
Ich möchte nur eine schamlose Werbung für mein white-space Projekt machen. Damit können Sie
white-space: none;in Ihrem externen CSS schreiben. Es gibt viele Informationen in der README, daher werde ich hier nicht ins Detail gehen.TLDR; Es behebt Ihre White-Space-Probleme.
Danke für die Tipps. Ich habe meine Spans gefloatet
Danke für den guten Artikel.
Diese Formatierung sieht gut genug aus (besonders wenn Sie Links anstelle von reinem Text haben) und erfüllt seinen Zweck.
Es gibt tatsächlich eine wirklich einfache Möglichkeit, Whitespace zu entfernen, die sowohl einfach als auch semantisch ist. Es handelt sich um eine benutzerdefinierte Schriftart mit Nullbreiten-Leerzeichen. Dann ändern Sie einfach die Schriftart auf dem Container und voilà. Hier ist ein Download der Schriftart, die ich gerade in Fontforge erstellt habe, einschließlich der CSS @font-face-Deklaration. Passen Sie es nach Belieben an. gezippte Nullbreiten-Leerzeichen Schriftart (klicken Sie auf Datei > Herunterladen, um sie auf Ihrem Computer zu speichern)
Dies ist wahrscheinlich der einfachste Weg, den ich gesehen habe, um mit Whitespace umzugehen. Ich werde es in meinem aktuellen Projekt ausprobieren.
Nun, das war eine gute Antwort auf eine 2-stündige Wartezeit, in der ich versucht habe herauszufinden, woher der Leerraum kommt, und sich geweigert habe, Floats zu verwenden.
Danke!
Oh Gott! Danke für dieses Thema!!
Ich hätte nie gedacht, dass der Punkt daran lag, dass (\n) oder (Leerzeichen) zwischen den HTML-Tags sind.
Ich verwende ab jetzt die () Lösung =)
Mann, CSS ist ein deprimierendes Medium zum Arbeiten. Schlechte Implementierungen und Stolpersteine überall.
Hallo zusammen,
Könnte mir jemand den Link per E-Mail senden, wie man Leerzeichen zwischen Nachrichtenblöcken in Dreamweaver vermeidet? Ich weiß, dass ich es mit absolut positionierten AP-Divs falsch mache, indem ich sie jedes Mal nach unten verschiebe, wenn eine neue Story hereinkommt. Grundsätzlich wähle ich alle AP-Divs aus und verschiebe jedes einzelne Element, was ein Overkill ist, wenn über 10 Stories auf einer Seite sind.
Ich verwende ein Hintergrundbild, das in AP-Divs eingekapselt ist. Gibt es eine Möglichkeit (CSS oder etwas anderes), alle vorherigen Geschichten nach unten zu verschieben? Ich würde mich über die Lösung freuen, nicht über die Diskussion, wie veraltet AP-Divs sind. Ich habe noch keine perfekte CSS-Lösung gefunden.
Hier ist der Link – http://liep2vsk.edu.lv/Aktualitates.php
Ich empfehle Ihnen, Dreamweaver vollständig abzulegen (es ist nicht mehr nützlich, nur eine Verschwendung von PC-Ressourcen). Absolut positionierte Divs sind nicht schlecht, keine Probleme damit, auch wenn sie alt sind.
Ihr Code ist jedoch für einen Menschen unlesbar, da er mit Dreamweaver erstellt wurde, ist er mit „nicht-menschlichen“ Namen überladen, ich kann Ihnen dabei überhaupt nicht helfen.
Ich hätte nie gedacht, dass ein Zeilenumbruch im Code als Whitespace beim Rendern zählt. Da ich für das spezifische Markup, das ich habe, keine Floats verwenden kann, habe ich mich für DRaevs Lösung entschieden, weil sie sauber aussieht und sehr lesbar ist.
Danke für die Tipps. Ich habe meine Spans gefloatet
Ich denke, wir sollten zusammenarbeiten, um die bestmögliche Lösung zu finden, ohne den Codierungsstil zu ändern.
Soweit ich weiß, scheint es mindestens zwei Möglichkeiten zu geben
Eine ist die Verwendung einer benutzerdefinierten Schriftart mit einem Leerzeichen-Zeichen von Null Breite; sollte gut funktionieren und ich denke, wir können leicht einen benutzerdefinierten Whitespace hinzufügen, falls wir bereits eine Schriftart über @font-face verwenden. Auf diese Weise definiert die Schriftart einen Teil der Benutzeroberfläche…
Zwei ist ein White-Space: none; Polyfill. Nie ausprobiert, aber ein Polyfill ist eine übliche Lösung für knifflige Probleme.
Es wäre cool, einige ernsthafte, umfassende Tests dafür zu haben.
Das ist großartig, Mann! Das Entfernen des Leerzeichens ist genial und doch so dumm einfach (zumindest für mich).
Ich schulde dir mindestens ein Bier!
Danke, Freund! Du hast mir den Tag gerettet :)
Das ist einfach
Ich habe einen Kompressor für Jekyll erstellt. Es ist ein Layout mit viel Liquid darin, das während des Renderns alle unnötigen Leerzeichen entfernt. Es funktioniert *ohne externe Plugins*, sodass Sie es auf Github Pages verwenden können.
Du bist großartig! Danke.
Ich habe festgestellt, dass alle Lösungen unter „Leerzeichen entfernen“ dazu führen, dass HTML-Minifizierer die Korrektur brechen. Das sollten Sie also berücksichtigen, wenn Sie nach einer produktionsreifen Lösung suchen.
Wenn Sie einen HTML-Minifizierer verwenden, haben Sie keine Probleme mit Leerzeichen. Es ist nur ein Problem, wenn Sie Zeilenumbrüche im Quellcode haben.