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:
.btn {
font-weight: 400;
}
.btn:hover {
font-weight: 500;
letter-spacing: -0.001527em;
}
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.