Browser: HTML, CSS, DOM, dan Aksesibilitas · 3/8
Dasar CSS: box model, cascade, specificity
Kenapa style-mu diabaikan, dan tiga aturan yang menjelaskannya.
Baca 30 menit
Setelah pelajaran ini kamu bisa
- Menjelaskan box model dan kenapa `border-box` itu default yang masuk akal
- Menghitung aturan mana yang menang saat beberapa aturan berlaku
- Menjelaskan cascade, inheritance, dan specificity secara berurutan
- Men-debug "style saya diabaikan" secara metodis
Hampir semua rasa frustrasi terhadap CSS berakar pada dua hal: kotaknya berukuran berbeda dari dugaanmu, atau aturan lain yang menang dari yang kamu duga. Keduanya punya aturan yang presisi dan bisa dipelajari.
Box model
┌─────────────────────────────────────┐
│ margin (outside, transparent)│
│ ┌───────────────────────────────┐ │
│ │ border │ │
│ │ ┌─────────────────────────┐ │ │
│ │ │ padding │ │ │
│ │ │ ┌───────────────────┐ │ │ │
│ │ │ │ content │ │ │ │
│ │ │ └───────────────────┘ │ │ │
│ │ └─────────────────────────┘ │ │
│ └───────────────────────────────┘ │
└─────────────────────────────────────┘Pertanyaan yang menjegal semua orang: kalau width: 300px dan padding: 20px, berapa lebar elemennya? Tergantung box-sizing.
box-sizing | width berarti | 300px + padding 20px + border 2px |
|---|---|---|
content-box (default CSS) | Hanya kontennya | Lebarnya 344px di layar |
border-box (yang kamu inginkan) | Konten + padding + border | Lebarnya 300px di layar |
Aturan mana yang menang
Saat beberapa aturan mengatur property yang sama, browser memutuskan dengan urutan ini. Turuti daftarnya; langkah pertama yang membedakan keduanya itulah yang menang.
- Asal dan tingkat kepentingan. Deklarasi
!importantmengalahkan yang biasa. - Specificity. Selector yang lebih spesifik mengalahkan yang kurang spesifik.
- Urutan penulisan. Kalau semua di atas seri, aturan yang ditulis terakhir menang.
Specificity adalah tiga angka, dibandingkan dari kiri ke kanan seperti nomor versi: (id, class, elemen). style inline mengalahkan semua selector.
Algoritma specificity. Inilah yang dipakai DevTools untuk menentukan aturan mana yang ditampilkan dengan garis coret.
Hasil
Tekan Jalankan untuk melihat hasilnya.
Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.
Inheritance
Sebagian property diturunkan ke anak-anaknya secara otomatis; sebagian besar tidak. Property terkait teks diwariskan — color, font-family, line-height. Yang terkait kotak tidak — padding, border, display, width.
Itu sebabnya mengatur font-family sekali di html memberi style ke seluruh dokumen — dan itu sebabnya globals.css di proyek ini melakukan tepat itu, dalam satu aturan.
Men-debug style yang diabaikan
- Buka DevTools dan pilih elemennya. Lihat panel Styles.
- Apakah aturanmu terdaftar sama sekali? Kalau tidak, selector-nya tidak cocok — cek ejaan dan strukturnya.
- Terdaftar tapi tercoret? Ada yang lebih spesifik menang. DevTools menampilkan pemenangnya tepat di atasnya.
- Nilainya ada tapi tidak ada yang berubah? Property-nya mungkin tidak berlaku untuk tipe
displayitu —widthtidak berpengaruh pada elemen inline. - Cek tab Computed untuk nilai akhirnya, dan klik tanda panahnya untuk melihat asalnya.
- Masih bingung? Elemennya mungkin bukan yang kamu pikirkan. Klik kanan halamannya lalu Inspect langsung.
Tugas praktik
Di DevTools pada halaman mana pun di proyek ini, pilih sebuah button dan baca panel Styles-nya dari atas ke bawah. Temukan deklarasi yang tercoret dan identifikasi aturan mana yang mengalahkannya. Lalu edit sebuah nilai secara langsung — ubah sebuah padding — dan lihat layout-nya merespons. Tidak ada yang tersimpan, jadi bereksperimenlah dengan bebas.
Hasil yang diharapkan
Kamu bisa menyebutkan aturan yang menang dan menjelaskan kenapa ia menang.
Cek pemahaman
Pilih jawaban dulu