Fungsi ::before dan ::after
::before menyisipkan sebuah kotak sebagai anak pertama sebuah elemen dan ::after sebagai anak terakhir. Isi kotak itu diatur oleh properti content. Tidak ada yang ditambahkan ke HTML: browser membuatnya dari CSS.
HTML-nya hanya berisi 9 dan Tests pass. Tanda dolar, label "/ month", dan tanda centang semuanya berasal dari CSS. Semuanya mewarisi style elemen (font, warna) kecuali kamu menimpanya, seperti yang dilakukan contoh di atas.
Sintaks
selector::before {
content: "text"; /* required */
/* any other styles */
}
selector::after {
content: ""; /* empty string: a box with no text */
}
Nilai content | Hasil |
|---|---|
"text" | Sebuah string. Pakai "\A" untuk pindah baris (dengan white-space: pre), "\2192" untuk karakter Unicode (→) |
"" | Kotak kosong, untuk bentuk dan dekorasi |
attr(data-label) | Nilai sebuah atribut milik elemen |
counter(step) | Nilai sebuah counter CSS |
open-quote / close-quote | Tanda kutip sesuai bahasa elemen |
none atau normal | Tidak ada pseudo-element (normal adalah default) |
content wajib ada. Tanpanya, ::before dan ::after tidak pernah dibuat, sebanyak apa pun properti lain yang kamu berikan.
Bentuk dekoratif dengan content: ""
Dengan content: "", pseudo-element menjadi kotak kosong yang bisa kamu atur ukuran dan warnanya. Secara default ia bersifat inline, dan kotak inline mengabaikan width dan height, jadi beri display: block, inline-block, atau position: absolute:
Memosisikan pseudo-element
Untuk dekorasi yang berada di atas atau di sekitar elemen, pakai position: absolute pada pseudo-element dan position: relative pada elemennya sendiri, supaya jaraknya diukur dari elemen itu:
Perhatikan urutannya saat digabung dengan pseudo-class: state ditulis lebih dulu, lalu pseudo-element, .link:hover::after, tidak pernah .link::after:hover.
Membaca atribut dengan attr(): sebuah tooltip
attr() mengambil nilai atribut ke dalam content, jadi satu aturan bisa menampilkan teks berbeda di setiap elemen:
Tooltip yang hanya muncul saat hover tidak terlihat oleh pengguna keyboard dan layar sentuh. Untuk hal yang penting, taruh teksnya di halaman, atau tampilkan juga saat :focus dengan tabindex="0" pada elemen.
Penomoran dengan counter
Counter CSS dan ::before bisa memberi nomor tanpa perlu mengetik angkanya:
Tambah atau hapus satu langkah, dan nomornya menyesuaikan sendiri.
Di mana ::before dan ::after tidak berfungsi
Pseudo-element disisipkan di dalam elemen, di antara tag-tagnya. Elemen yang tidak punya bagian dalam untuknya tidak bisa menampilkannya:
<img>,<video>,<iframe>(replaced element)<input>,<select>,<textarea>(kontrol form), dan<br>
Beberapa browser menampilkannya pada checkbox atau gambar yang rusak, tetapi hasilnya tidak konsisten. Taruh pseudo-element di pembungkus saja: <span class="field"><input></span> lalu beri style pada .field::after.
Kesalahan umum
- Tidak ada
content. Satu-satunya penyebab paling umum tidak ada yang muncul. Tambahkancontent: "". - Mengatur ukuran pseudo-element inline.
widthdanheighttidak berpengaruh sampai kamu mengaturdisplay: block,inline-block, atauposition: absolute. - Urutan yang salah dengan state.
a:hover::afterberfungsi;a::after:hovertidak. - Posisi absolute tanpa induk yang diposisikan. Pseudo-element jadi menyesuaikan diri dengan leluhur yang jauh. Tambahkan
position: relativepada elemennya. - Menaruh konten sungguhan di CSS. Teks di
contenttidak bisa dipilih atau disalin. Simpan informasi di HTML.
Pertanyaan yang sering diajukan
Apa fungsi ::before di CSS?
Ia membuat pseudo-element yang menjadi anak pertama dari elemen yang dipilih, berisi apa pun yang ditulis di properti content. ::after melakukan hal yang sama sebagai anak terakhir. Keduanya tidak ada di HTML, jadi sangat berguna untuk ikon, label, dan dekorasi.
Kenapa ::before atau ::after saya tidak muncul?
Penyebab paling umum adalah properti content yang tidak ada: tanpa properti itu, pseudo-element tidak dibuat. Pakai content: "" untuk kotak dekoratif kosong. Penyebab lain: pseudo-element inline yang diberi lebar dan tinggi (beri display: block atau inline-block), atau elemen seperti <img> atau <input> yang tidak bisa menampungnya.
Apa perbedaan :before dan ::before?
Tidak ada perbedaan perilaku. ::before dengan dua titik dua adalah sintaks saat ini yang menandai pseudo-element; :before dengan satu titik dua adalah penulisan lama dari CSS2 yang masih diterima browser untuk before, after, first-line, dan first-letter.
Bisakah ::before dipakai pada img atau input?
Tidak bisa diandalkan. Pseudo-element disisipkan di dalam konten elemen, sedangkan replaced element seperti <img> dan kontrol form seperti <input> tidak punya content box untuknya. Bungkus elemen itu dengan <span> atau <div> dan taruh pseudo-element di pembungkusnya.
Apakah pembaca layar bisa membaca konten ::before CSS?
Umumnya bisa: teks di content biasanya ikut masuk ke nama yang dapat diakses, tetapi tidak bisa dipilih atau disalin. Simpan informasi yang penting di HTML dan pakai pseudo-element untuk dekorasi dan petunjuk visual kecil.