Saya memiliki menu navigasi horizontal, yang pada dasarnya hanya a <ul>
dengan elemen yang diatur berdampingan. Saya tidak mendefinisikan lebar, tetapi hanya menggunakan padding, karena saya ingin lebar ditentukan oleh lebar item menu. Saya menebalkan item yang saat ini dipilih.
Masalahnya adalah dalam huruf tebal, kata tersebut menjadi sedikit lebih lebar, yang menyebabkan elemen lainnya bergeser sedikit ke kiri atau kanan. Adakah cara cerdas untuk mencegah hal ini terjadi? Sesuatu di sepanjang garis memberitahu padding untuk mengabaikan lebar ekstra yang disebabkan oleh bolding? Pikiran pertama saya adalah mengurangi beberapa piksel dari padding elemen "aktif", tetapi jumlahnya bervariasi.
Jika memungkinkan, saya ingin menghindari pengaturan lebar statis pada setiap entri dan kemudian memusatkan sebagai lawan dari solusi padding yang saya miliki saat ini, untuk membuat perubahan di masa mendatang menjadi sederhana.
Jawaban:
Saya memiliki masalah yang sama, tetapi mendapatkan efek yang sama dengan sedikit kompromi, saya menggunakan text-shadow sebagai gantinya.
Inilah contoh yang berfungsi:
contoh jsfiddle
sumber
li:hover {text-shadow: 1px 0 0 black;}
teks dengan jarak yang terlalu sedikit di antara huruf. Untuk meningkatkannya lagi, kami juga menetapkanli {letter-spacing: 1px;}
-0.5px 0 #fff, 0.5px 0 #fff
, karena kita bisa melihat celah kecil antara teks itu sendiri dan bayangannya. Dan juga saat teks dicetak tebal, itu menambah bobot di kedua sisi.Solusi kerja terbaik menggunakan :: after
HTML
CSS
Ia menambahkan elemen semu yang tidak terlihat dengan lebar teks tebal, bersumber dari
title
atribut.The
text-shadow
solusi terlihat tidak alami pada Mac dan tidak memanfaatkan semua keindahan yang teks rendering pada Mac penawaran .. :)http://jsfiddle.net/85LbG/
Kredit: https://stackoverflow.com/a/20249560/5061744
sumber
margin-top
ke::after
blok menyelesaikannya.Solusi yang paling portabel dan menyenangkan secara visual adalah dengan menggunakan
text-shadow
. Ini merevisi dan menunjukkan contoh jawaban Thorgeir menggunakan Alexxali dan tweak saya sendiri:Ini menempatkan "bayangan" kecil dalam warna hitam (gunakan nama / kode warna font Anda sebagai ganti
black
jika perlu) di kedua sisi setiap huruf menggunakan unit yang akan diskalakan dengan benar dengan rendering font.Lihat diri mu sendiri:
Arahkan kursor ke atas garis yang dirender untuk melihat perbedaannya dari teks standar.
Ubah tingkat zoom browser Anda ( Ctrl+ +dan Ctrl+ -) untuk melihat perbedaannya.
Saya menambahkan dua solusi lain di sini untuk perbandingan: Trik penspasian huruf @ cgTag , yang tidak berfungsi dengan baik karena melibatkan menebak rentang lebar font, dan @ workaholic_gangster911's :: setelah trik menggambar , yang menyisakan ruang ekstra yang canggung sehingga teks tebal dapat meluas tanpa menyentuh item teks yang berdekatan (saya meletakkan atribusi setelah teks tebal sehingga Anda dapat melihat bagaimana itu tidak bergerak).
Di masa mendatang, kami akan memiliki lebih banyak font variabel yang mampu melakukan hal-hal seperti mengubah kelas font melalui
font-variation-settings
. Dukungan browser sedang ditingkatkan (Chrome 63+, Firefox 62+) tetapi ini masih membutuhkan lebih dari sekedar font standar dan beberapa font yang ada mendukungnya.Jika Anda menyematkan font variabel, Anda akan dapat menggunakan CSS seperti ini:
Ada demo langsung dengan penggeser untuk dimainkan dengan berbagai tingkatan di Panduan Font Variabel Mozilla. Google Pengenalan font variabel di web memiliki GIF animasi menunjukkan toggle antara kelas tinggi dan tidak ada kelas:
sumber
Saya menemukan bahwa sebagian besar font memiliki ukuran yang sama saat Anda menyesuaikan spasi huruf sebesar 1px.
Sementara ini memang mengubah font biasa sehingga setiap huruf memiliki spasi piksel ekstra. Untuk menu, judulnya sangat pendek sehingga tidak ada masalah.
sumber
0.98px
atau pecahan yang lebih kecil.1px
ke nilai relatif seperti0.025ex
atau0.0125ex
. Lihat jawaban saya untuk demonstrasi langsung.Untuk jawaban yang lebih mutakhir, Anda dapat menggunakan
-webkit-text-stroke-width
:Hal ini untuk menghindari elemen semu (yang merupakan nilai tambah bagi pembaca layar) dan bayangan teks (yang terlihat berantakan dan masih dapat membuat sedikit efek 'lompatan') atau menyetel lebar tetap (yang mungkin tidak praktis).
Ini juga memungkinkan Anda untuk mengatur elemen menjadi lebih tebal dari 1px (secara teoritis, Anda dapat membuat font setebal yang Anda suka dan juga bisa menjadi latihan yang jelek untuk membuat versi tebal dari font yang tidak memiliki tebal varian, seperti font khusus ( edit: font variabel mengurangi saran ini ). Meskipun hal ini harus dihindari karena mungkin akan membuat beberapa font tampak kasar dan tidak rata)
Saya ini pasti berfungsi di Edge, Firefox, Chrome dan Opera (pada saat posting) dan di Safari ( edit: @Lars Blumberg terima kasih telah mengonfirmasi itu ). Ini TIDAK berfungsi di IE11 atau di bawahnya.
Perhatikan juga, ini menggunakan
-webkit
awalan, jadi ini bukan standar dan dukungan dapat dibatalkan di masa mendatang, jadi jangan mengandalkan ini tebal sangat penting - sebaiknya hindari teknik ini kecuali hanya estetika.sumber
Sayangnya, satu-satunya cara untuk menghindari perubahan lebar saat teks dicetak tebal adalah dengan menentukan lebar item daftar, namun seperti yang Anda nyatakan melakukan ini secara manual memakan waktu dan tidak dapat diskalakan.
Satu-satunya hal yang dapat saya pikirkan adalah menggunakan beberapa javascript yang menghitung lebar tab sebelum ditebalkan, dan kemudian menerapkan lebar pada saat yang sama harus menebalkan (baik saat Anda mengarahkan atau mengklik).
sumber
Gunakan JavaScript untuk menyetel lebar tetap li berdasarkan konten yang tidak dicetak tebal, lalu cetak tebal konten dengan menerapkan gaya ke
<a>
tag (atau tambahkan rentang jika<li>
tidak memiliki turunan ).sumber
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:
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.
sumber
Pertanyaan menarik. Saya kira Anda menggunakan float, bukan?
Yah, saya tidak tahu teknik apa pun yang dapat Anda gunakan untuk menghilangkan pembesaran font ini, maka mereka akan mencoba menyesuaikan dengan lebar minimum yang diperlukan - dan ketebalan font yang bervariasi akan mengubah nilai ini.
Solusi unik yang saya tahu untuk menghindari perubahan ini adalah solusi yang Anda katakan tidak Anda inginkan: mengatur ukuran tetap ke li.
sumber
Anda dapat menerapkan ini seperti menu hover "Belanja berdasarkan departemen" di amazon.com. Ini menggunakan div lebar. Anda dapat membuat div lebar dan menyembunyikan bagian kanannya
sumber
UPDATE: Harus menggunakan tag B untuk judul karena di IE11 pseudo class i: after tidak muncul ketika saya memiliki visibility: hidden.
Dalam kasus saya, saya ingin menyelaraskan kotak centang / radio input (yang dirancang khusus) dengan teks label di mana teks menjadi tebal ketika input dicentang.
Solusi yang disediakan di sini tidak berfungsi untuk saya di Chrome. Penjajaran vertikal input dan label menjadi kacau dengan: after psuedo class dan -margins tidak memperbaiki ini.
Berikut adalah perbaikan di mana Anda tidak mendapatkan masalah dengan perataan vertikal.
sumber