Ini adalah pertanyaan yang sangat lama, tetapi saya mengunjunginya kembali karena saya memiliki masalah ini dalam aplikasi yang saya kembangkan dan menemukan semua jawaban yang diinginkan di sini.
(Lewati paragraf ini untuk TL; DR ...)Saya menggunakan font web Gotham dari cloud.typography.com, dan saya memiliki tombol yang mulai kosong (dengan tepi / teks putih dan latar belakang transparan) dan memperoleh warna latar belakang saat melayang. Saya menemukan bahwa beberapa warna latar belakang yang saya gunakan tidak kontras dengan teks putih, jadi saya ingin mengubah teks menjadi hitam untuk tombol-tombol itu, tetapi - entah karena trik visual atau metode anti-aliasing yang umum - gelap teks pada latar belakang terang selalu tampak lebih ringan daripada teks putih pada latar belakang gelap. Saya menemukan bahwa meningkatkan bobot dari 400 menjadi 500 untuk teks gelap mempertahankan bobot "visual" yang hampir persis sama. Namun, itu meningkatkan lebar tombol dengan jumlah kecil - sebagian kecil dari piksel - tapi itu cukup untuk membuat tombol tampak "bergetar" sedikit, yang ingin saya singkirkan.
Larutan:
Jelas sekali, ini adalah masalah yang sangat rewel sehingga diperlukan solusi yang rumit. Pada akhirnya saya menggunakan negatif letter-spacing
pada teks yang lebih tebal seperti yang direkomendasikan cgTag di atas, tetapi 1px akan terlalu berlebihan, jadi saya hanya menghitung dengan tepat lebar yang saya perlukan.
Dengan memeriksa tombol di devtools Chrome, saya menemukan bahwa lebar default tombol saya adalah 165.47px, dan 165.69px saat hover, selisih 0.22px. Tombol tersebut memiliki 9 karakter, jadi:
0,22 / 9 = 0,024444 piksel
Dengan mengonversinya ke unit em saya bisa membuat penyesuaian ukuran font agnostik. Tombol saya menggunakan ukuran font 16px, jadi:
0,024444 / 16 = 0,001527em
Jadi untuk font khusus saya, CSS berikut menjaga tombol dengan lebar yang sama persis saat hover:
.btn {
font-weight: 400;
}
.btn:hover {
font-weight: 500;
letter-spacing: -0.001527em;
}
Dengan sedikit pengujian dan menggunakan rumus di atas, Anda dapat menemukan nilai yang tepat letter-spacing
untuk situasi Anda, dan itu akan berfungsi terlepas dari ukuran fontnya.
Satu-satunya peringatan adalah bahwa browser yang berbeda menggunakan penghitungan sub-piksel yang sedikit berbeda, jadi jika Anda membidik tingkat presisi sub-piksel-sempurna OCD ini, Anda harus mengulangi pengujian dan menetapkan nilai yang berbeda untuk setiap browser. Gaya CSS bertarget browser umumnya tidak disukai , untuk alasan yang bagus, tetapi saya pikir ini adalah salah satu kasus penggunaan di mana itu satu-satunya pilihan yang masuk akal.