To bardzo stare pytanie, ale wracam do niego, ponieważ miałem ten problem w aplikacji, którą tworzę, i znalazłem wszystkie potrzebne odpowiedzi.
(Pomiń ten akapit w przypadku TL; DR ...)Używam czcionki internetowej Gotham z cloud.typography.com i mam przyciski, które zaczynają się puste (z białą obwódką / tekstem i przezroczystym tłem) i uzyskują kolor tła po najechaniu kursorem. Zauważyłem, że niektóre kolory tła, których używałem, nie kontrastowały dobrze z białym tekstem, więc chciałem zmienić tekst na czarny dla tych przycisków, ale - czy to z powodu wizualnej sztuczki, czy zwykłych metod wygładzania - ciemny tekst na jasnym tle zawsze wydaje się być lżejszy niż biały tekst na ciemnym tle. Zauważyłem, że zwiększenie wagi z 400 do 500 dla ciemnego tekstu zachowało prawie dokładnie tę samą „wizualną” wagę. Zwiększyło to jednak nieznacznie szerokość przycisku - ułamek piksela - ale wystarczyło, aby przyciski wydawały się lekko „drżeć”, czego chciałem się pozbyć.
Rozwiązanie:
Oczywiście jest to naprawdę drobny problem, więc wymagał wyrafinowanego rozwiązania. Ostatecznie użyłem negatywu letter-spacing
na odważniejszym tekście, jak zalecono powyżej cgTag, ale 1px byłby znacznie przesadzony, więc po prostu obliczyłem dokładnie potrzebną szerokość.
Po sprawdzeniu przycisku w devtools Chrome stwierdziłem, że domyślna szerokość mojego przycisku wynosiła 165,47px, a 165,69px po najechaniu kursorem, czyli różnica 0,22px. Przycisk miał 9 znaków, więc:
0,22 / 9 = 0,024444px
Konwertując to na jednostki em, mogłem zmienić rozmiar czcionki na agnostyczny. Mój przycisk miał rozmiar czcionki 16px, więc:
0,024444 / 16 = 0,001527em
Więc dla mojej konkretnej czcionki poniższy kod CSS utrzymuje przyciski dokładnie tej samej szerokości po najechaniu kursorem:
.btn {
font-weight: 400;
}
.btn:hover {
font-weight: 500;
letter-spacing: -0.001527em;
}
Po krótkim przetestowaniu i zastosowaniu powyższego wzoru możesz znaleźć dokładnie odpowiednią letter-spacing
wartość dla swojej sytuacji i powinna działać niezależnie od rozmiaru czcionki.
Jedynym zastrzeżeniem jest to, że różne przeglądarki używają nieco innych obliczeń subpikseli, więc jeśli dążysz do tego poziomu OCD doskonałej precyzji subpikseli, musisz powtórzyć testy i ustawić inną wartość dla każdej przeglądarki. Style CSS ukierunkowane na przeglądarkę są generalnie źle widziane , nie bez powodu, ale myślę, że jest to jeden przypadek użycia, w którym jest to jedyna sensowna opcja.