Ich habe ein horizontales Navigationsmenü, das im Grunde nur ein Menü ist, <ul>
bei dem die Elemente nebeneinander eingestellt sind. Ich definiere keine Breite, sondern verwende einfach Auffüllen, da ich möchte, dass die Breiten durch die Breite des Menüelements definiert werden. Ich habe das aktuell ausgewählte Element fett gedruckt.
Das Problem ist, dass das Wort beim Fettdruck etwas breiter wird, wodurch sich der Rest der Elemente leicht nach links oder rechts verschiebt. Gibt es eine clevere Möglichkeit, dies zu verhindern? Etwas in der Art, wie die Polsterung angewiesen wird, die zusätzliche Breite, die durch die Fettschrift verursacht wird, zu ignorieren? Mein erster Gedanke war, einfach ein paar Pixel vom Abstand des "aktiven" Elements zu subtrahieren, aber dieser Betrag variiert.
Wenn möglich, möchte ich vermeiden, für jeden Eintrag eine statische Breite festzulegen und dann im Gegensatz zu meiner aktuellen Auffülllösung zu zentrieren, um zukünftige Änderungen an den Einträgen zu vereinfachen.
Antworten:
Ich hatte das gleiche Problem, bekam aber mit einem kleinen Kompromiss einen ähnlichen Effekt. Stattdessen verwendete ich Textschatten.
Hier ist ein Arbeitsbeispiel:
jsfiddle Beispiel
quelle
li:hover {text-shadow: 1px 0 0 black;}
führte zu Text mit zu geringem Abstand zwischen den Buchstaben. Um das noch einmal zu verbessern, setzen wir auchli {letter-spacing: 1px;}
-0.5px 0 #fff, 0.5px 0 #fff
, weil wir die kleine Lücke zwischen dem Text selbst und dem Schatten sehen konnten. Und auch wenn der Text fett ist, werden beide Seiten gewichtet.Die beste Arbeitslösung mit :: after
HTML
CSS
Es wird ein unsichtbares Pseudoelement mit einer Breite von fettem Text hinzugefügt, das nach
title
Attributen sortiert ist .Die
text-shadow
Lösung sieht auf dem Mac unnatürlich aus und nutzt nicht die Schönheit, die das Rendern von Text auf dem Mac bietet. :)http://jsfiddle.net/85LbG/
Bildnachweis: https://stackoverflow.com/a/20249560/5061744
quelle
margin-top
zum::after
Block löste das Problem.Die tragbarste und optisch ansprechendste Lösung wäre die Verwendung
text-shadow
. Dies überarbeitet und zeigt Beispiele von Thorgeirs Antwort unter Verwendung von Alexxalis und meinen eigenen Optimierungen:Dadurch werden winzige "Schatten" in Schwarz (verwenden Sie
black
gegebenenfalls den Farbnamen / -code Ihrer Schrift anstelle von ) auf beiden Seiten jedes Buchstabens verwendet, wobei Einheiten verwendet werden, die beim Rendern der Schrift richtig skaliert werden.Überzeugen Sie sich selbst:
Bewegen Sie den Mauszeiger über die gerenderten Linien, um zu sehen, wie sie sich vom Standardtext unterscheiden.
Ändern Sie die Zoomstufe Ihres Browsers ( Ctrl+ +und Ctrl+ -), um zu sehen, wie sie variieren.
Zum Vergleich habe ich hier zwei weitere Lösungen hinzugefügt: den Buchstabenabstandstrick von @ cgTag , der nicht so gut funktioniert, da die Schriftbreitenbereiche erraten werden müssen, und den Trick :: nach dem Zeichnen von @ workaholic_gangster911 , der unangenehmen zusätzlichen Platz lässt, damit sich der fette Text erweitern kann ohne benachbarte Textelemente zu stupsen (ich setze die Zuordnung nach dem fett gedruckten Text, damit Sie sehen können, wie er sich nicht bewegt).
In Zukunft werden wir mehr haben variable Schriftarten von Dingen fähig wie das Ändern Schriftgrad über
font-variation-settings
. Die Browserunterstützung nimmt zu (Chrome 63+, Firefox 62+), erfordert jedoch immer noch mehr als nur Standardschriftarten, und nur wenige vorhandene Schriftarten unterstützen dies.Wenn Sie eine variable Schriftart einbetten, können Sie CSS wie folgt verwenden:
Im Mozilla Variable Fonts Guide finden Sie eine Live-Demo mit einem Schieberegler, mit dem Sie mit verschiedenen Noten spielen können. Googles Einführung in variable Schriftarten im Web enthält ein animiertes GIF, das das Umschalten zwischen einer hohen und einer nicht bewerteten Note demonstriert:
quelle
Ich habe festgestellt, dass die meisten Schriftarten dieselbe Größe haben, wenn Sie den Buchstabenabstand um 1 Pixel anpassen.
Dies ändert zwar die reguläre Schriftart, sodass jeder Buchstabe einen zusätzlichen Pixelabstand hat. Bei Menüs sind die Titel so kurz, dass sie kein Problem darstellen.
quelle
0.98px
oder kleineren Brüchen fein einstellen .1px
in relative Werte wie0.025ex
oder konvertieren0.0125ex
. Siehe meine Antwort für eine Live-Demonstration.Für eine aktuellere Antwort können Sie Folgendes verwenden
-webkit-text-stroke-width
:Dies vermeidet Pseudoelemente (was für Bildschirmleser von Vorteil ist) und Textschatten (die unordentlich aussehen und dennoch einen leichten Sprungeffekt erzeugen können) oder das Festlegen fester Breiten (was unpraktisch sein kann).
Außerdem können Sie ein Element so einstellen, dass es mutiger als 1 Pixel ist (theoretisch können Sie eine Schrift so fett machen, wie Sie möchten, und es kann auch ein schlechtes Training sein, um eine fette Version einer Schrift zu erstellen, die nicht fett ist Variante, wie benutzerdefinierte Schriftarten ( Bearbeiten: Variable Schriftarten lehnen diesen Vorschlag ab ). Dies sollte jedoch vermieden werden, da dadurch einige Schriftarten wahrscheinlich kratzig und gezackt erscheinen.)
Ich dies funktioniert definitiv in Edge, Firefox, Chrome und Opera (zum Zeitpunkt der Veröffentlichung) und in Safari ( bearbeiten: @Lars Blumberg danke für die Bestätigung ). Es funktioniert NICHT in IE11 oder niedriger.
Beachten Sie auch, dass das
-webkit
Präfix verwendet wird, sodass dies kein Standard ist und die Unterstützung möglicherweise in Zukunft eingestellt wird. Verlassen Sie sich also nicht darauf, dass dies wirklich wichtig ist. Vermeiden Sie diese Technik am besten, es sei denn, sie ist lediglich ästhetisch.quelle
Leider besteht die einzige Möglichkeit, eine Änderung der Breite zu vermeiden, wenn der Text fett gedruckt ist, darin, die Breite des Listenelements zu definieren. Wie Sie jedoch angegeben haben, ist dies manuell zeitaufwändig und nicht skalierbar.
Das einzige, was ich mir vorstellen kann, ist die Verwendung von Javascript, das die Breite der Registerkarte berechnet, bevor sie fett gedruckt wird, und dann die Breite anwendet, während die Fettschrift erforderlich ist (entweder wenn Sie den Mauszeiger bewegen oder klicken).
quelle
Verwenden Sie JavaScript, um eine feste Breite des Li basierend auf dem nicht fettgedruckten Inhalt festzulegen, und fetten Sie den Inhalt dann durch Anwenden eines Stils auf das
<a>
Tag (oder fügen Sie einen Bereich hinzu, wenn der<li>
keine untergeordneten Elemente hat ).quelle
Dies ist eine sehr alte Frage, aber ich besuche sie erneut, weil ich dieses Problem in einer App hatte, die ich entwickle, und alle Antworten hier als fehlend empfunden habe.
(Überspringen Sie diesen Absatz für die TL; DR ...)Ich verwende den Gotham-Webfont von cloud.typography.com und habe Schaltflächen, die hohl beginnen (mit einem weißen Rand / Text und einem transparenten Hintergrund) und beim Schweben eine Hintergrundfarbe erhalten. Ich stellte fest, dass einige der von mir verwendeten Hintergrundfarben keinen guten Kontrast zum weißen Text bildeten. Daher wollte ich den Text für diese Schaltflächen in Schwarz ändern, aber - ob aufgrund eines visuellen Tricks oder gängiger Anti-Aliasing-Methoden - dunkel Text auf hellem Hintergrund scheint immer leichter zu sein als weißer Text auf dunklem Hintergrund. Ich fand heraus, dass das Erhöhen des Gewichts von 400 auf 500 für den dunklen Text fast genau das gleiche "visuelle" Gewicht beibehielt. Es vergrößerte jedoch die Tastenbreite um einen winzigen Betrag - einen Bruchteil eines Pixels -, aber es reichte aus, um die Tasten leicht "zittern" zu lassen, was ich loswerden wollte.
Lösung:
Offensichtlich ist dies ein wirklich heikles Problem, daher war eine heikle Lösung erforderlich. Letztendlich habe ich ein Negativ
letter-spacing
für den kühneren Text verwendet, wie oben empfohlen, aber 1px wäre viel übertrieben gewesen, also habe ich genau die Breite berechnet, die ich benötigen würde.Bei der Überprüfung der Schaltfläche in Chrome devtools stellte ich fest, dass die Standardbreite meiner Schaltfläche 165,47 Pixel und 165,69 Pixel beim Schweben betrug, was einer Differenz von 0,22 Pixel entspricht. Die Schaltfläche hatte 9 Zeichen, also:
0,22 / 9 = 0,024444px
Durch die Umrechnung in em-Einheiten konnte ich die Anpassung der Schriftgröße unabhängig machen. Meine Schaltfläche hatte eine Schriftgröße von 16px, also:
0,024444 / 16 = 0,001527em
Also für meine bestimmte Schriftart, hält die folgende CSS die Tasten genau die gleiche Breite auf schweben:
Mit ein wenig Testen und Verwenden der obigen Formel können Sie genau den richtigen
letter-spacing
Wert für Ihre Situation finden, und es sollte unabhängig von der Schriftgröße funktionieren.Die einzige Einschränkung besteht darin, dass verschiedene Browser leicht unterschiedliche Subpixel-Berechnungen verwenden. Wenn Sie also diese OCD-Stufe mit subpixelgenauer Präzision anstreben, müssen Sie den Test wiederholen und für jeden Browser einen anderen Wert festlegen. Browser-bezogene CSS-Stile werden aus gutem Grund im Allgemeinen verpönt , aber ich denke, dies ist ein Anwendungsfall, bei dem dies die einzige Option ist, die Sinn macht.
quelle
Interessante Frage. Ich nehme an, Sie verwenden float, oder?
Nun, ich kenne keine Technik, mit der Sie diese Schriftvergrößerung entfernen können, daher werden sie versuchen, in die erforderliche Mindestbreite zu passen - und eine Variation der Schriftstärke ändert diesen Wert.
Die einzigartige Lösung, die ich kenne, um diese Änderung zu vermeiden, ist eine, von der Sie sagten, dass Sie sie nicht wollen: Festlegen fester Größen auf li.
quelle
Sie können dies wie das Hover-Menü "Shop by Department" von amazon.com implementieren. Es verwendet breite div. Sie können ein breites Div erstellen und den rechten Teil ausblenden
quelle
UPDATE: Musste das B-Tag für den Titel verwenden, da in IE11 die Pseudoklasse i: after nicht angezeigt wurde, wenn ich Sichtbarkeit hatte: versteckt.
In meinem Fall möchte ich ein (benutzerdefiniertes) Eingabe-Kontrollkästchen / Radio an Beschriftungstext ausrichten, wobei der Text fett ist, wenn die Eingabe aktiviert ist.
Die hier bereitgestellte Lösung hat bei mir in Chrome nicht funktioniert. Die vertikale Ausrichtung von Eingabe und Beschriftung wurde durcheinander gebracht mit: Nachdem Pseudo-Klasse und -Margen dies nicht behoben haben.
Hier ist ein Fix, bei dem Sie keine Probleme mit vertikalen Ausrichtungen haben.
quelle