Menu

CSS ::before dan ::after: Pseudo-Element dan Contoh

::before dan ::after menyisipkan konten buatan sebagai anak pertama dan terakhir sebuah elemen, langsung dari CSS. Pelajari properti content, kenapa content kosong tetap wajib, cara memosisikannya, tooltip dengan attr(), counter, dan di mana keduanya tidak berfungsi.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

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 contentHasil
"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-quoteTanda kutip sesuai bahasa elemen
none atau normalTidak 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. Tambahkan content: "".
  • Mengatur ukuran pseudo-element inline. width dan height tidak berpengaruh sampai kamu mengatur display: block, inline-block, atau position: absolute.
  • Urutan yang salah dengan state. a:hover::after berfungsi; a::after:hover tidak.
  • Posisi absolute tanpa induk yang diposisikan. Pseudo-element jadi menyesuaikan diri dengan leluhur yang jauh. Tambahkan position: relative pada elemennya.
  • Menaruh konten sungguhan di CSS. Teks di content tidak 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.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai