CSS: Bagian-bagian buruk yang tak terhindarkan
(matklad.github.io)- Untuk menata gaya halaman web, subhimpunan kecil yang bisa dipelajari sudah cukup untuk blog sederhana atau GUI, tetapi jebakan seperti default browser dan layout bisa berujung pada debugging berhari-hari
- Jika memakai tag HTML5 yang semantik lebih dulu dan mengurangi wrapper, akan lebih mudah membuat CSS bekerja mengikuti markup yang ada
- Tidak ada satu algoritme universal untuk layout CSS, sehingga diperlukan pendekatan yang memahami jenis penempatan yang diizinkan oleh tiap sistem
box-sizing,margin,font-size,line-height,word-breakbekerja tidak sesuai intuisi, sehingga perubahan kecil bisa meluas menjadi masalah tata letak atau keterbacaan secara keseluruhan- Untuk halaman sederhana, CSS reset, CSS tanpa class, flexbox, dan aturan responsif yang tidak berlebihan bisa menjadi titik awal yang praktis
Cakupan belajar CSS dan sudut pandang dasarnya
- CSS, HTML, dan Web API sangat luas dan memerlukan keahlian khusus, tetapi untuk pekerjaan seperti blog pemrograman atau GUI sederhana, subhimpunan modern web yang secukupnya sudah memadai
- Belum pernah terlihat materi yang hanya mengajarkan subhimpunan yang diperlukan untuk pekerjaan sederhana, tetapi dengan mengikuti MDN kita bisa memahami gambaran umumnya sampai tingkat tertentu
- Masalahnya adalah jebakan yang keberadaannya tak terduga bisa merusak halaman, dan butuh berhari-hari untuk menemukan penyebabnya
- Styling situs ini terdiri dari sekitar 200 baris CSS yang mudah dibaca
Bagian yang bagus: HTML semantik dan CSS tanpa class
-
Tag semantik HTML5
- Layak menelusuri Elements Reference di MDN, dan jumlah elemen HTML sebenarnya tidak terlalu banyak
- Tag seperti
main,article,nav,kbddapat mempermudah penyusunan struktur halaman ulbisa dipakai untuk berbagai jenis daftar, misalnya bagian-bagian situs di dalamheader > navdetailsbisa dipakai untuk daftar isi, dan sumber MDN bisa dijadikan rujukandldandtbisa digunakan untuk daftar berpasangan
-
Pendekatan mengurangi wrapper
- Jika melihat source website nyata, ada banyak elemen wrapper berlapis-lapis sehingga bisa tampak seolah masalah layout diselesaikan dengan wrapper
- Penilaian tentang pengalaman CSS production disisihkan dulu, tetapi membatasi diri hanya pada tag semantik yang bermakna lalu mencari CSS yang cocok untuk markup itu terasa lebih mudah dipahami
-
CSS tanpa class
- Tidak mungkin menginisialisasi style ke keadaan netral sepenuhnya yaitu “tidak ada apa-apa”; teks putih atau transparan pun tetap sebuah style
- Setelah reset, dimungkinkan untuk langsung memberi style pada elemen HTML umum
- Jika memakai tag
main,header,footer,nav, layout seluruh halaman bisa diatur tanpa banyak selector CSS - Pendekatan ini memang membuat CSS berasumsi tentang struktur HTML, tetapi jika HTML dan CSS itu milik sendiri, kita bisa mengubahnya bila hasilnya tidak memuaskan
Bagian buruk: layout, default browser, selector
-
Layout
- Masalah layout bukan hanya masalah web; ini juga sulit di berbagai framework GUI
- Ada banyak cara untuk menempatkan gambar raster berukuran tetap dan paragraf teks yang menjelaskannya ke dalam sebuah persegi panjang layar
- GUI pada umumnya adalah struktur hierarkis kotak-kotak dengan banyak “kebebasan layout”
- Layout tiap kotak memengaruhi layout semua kotak lain, dan biasanya semua kotak harus saling menempel tepat tanpa celah dan tanpa tumpang tindih
- Tidak ada satu algoritme layout universal; dari RectCut hingga constraint solvers, serta wilayah di antaranya, tiap sistem memakai heuristik yang berbeda
- Lebih baik memikirkan “layout seperti apa yang diizinkan sistem itu” daripada “bagaimana membuat layout dalam sistem itu”
-
Default browser dan CSS reset
- HTML semantik tanpa CSS pun tetap mendapat style bawaan browser seperti warna, font, ukuran, judul besar, dan tautan bergaris bawah
- Style bawaan ini membantu, tetapi berbeda-beda antar-browser, sehingga jika bergantung pada default yang tidak kita tulis sendiri, hasilnya bisa berbeda di browser lain
- Solusi umum adalah CSS reset atau normalisasi, yaitu menimpa default dengan aturan eksplisit di awal CSS
- Yang buruk bukan default itu sendiri, melainkan ketidakkonsistenannya satu sama lain
- Untuk mengetahui aturan mana yang perlu ditimpa, lebih baik membandingkan beberapa CSS reset yang sudah ada
-
Perlukah menata style halaman web
- Di platform web ada dua sudut pandang sekaligus: melihatnya sebagai media visual yang fleksibel dan adaptif, dan melihatnya sebagai sarana penyampaian konten di mana pengguna seharusnya bisa mengustomisasi tampilannya
- Secara default, halaman tanpa style kurang enak dipakai dan tidak menarik dilihat
- Dunia di mana halaman tanpa CSS tetap mudah dibaca mungkin akan lebih baik, tetapi dalam kondisi saat ini, menerapkan style pada konten tetap membantu
- Sebaiknya pengguna tingkat lanjut diizinkan membawa CSS mereka sendiri
- Markup HTML harus masuk akal, tidak di-overfit ke CSS, dan halaman harus tetap berfungsi dalam reader mode
-
Selector CSS
- CSS dasar bekerja seperti pewarisan yang kuat, sehingga setiap elemen desain pada halaman web dipengaruhi oleh banyak aturan
- Dengan menambahkan isi ke file CSS, elemen yang sudah ada bisa sewaktu-waktu di-“monkey patch”
- Selector CSS dipandang menambah kemampuan abstraksi pada sumbu yang keliru, sehingga pendekatan dengan CSS tanpa class dan inline style bisa dipakai
- Alat seperti Tailwind bisa mengurangi ketidaknyamanan penulisan inline, dan JSX atau template engine yang mendukung komposisi bisa mengurangi pengulangan HTML
- Dengan memakai CSS nesting, selector yang menjangkau terlalu jauh bisa dikurangi dan styling bisa dilakukan per komponen
Model kotak dan penempatan: box-sizing, margin, flow dasar, flexbox
-
box-sizing- UI adalah persegi panjang yang bersifat rekursif, dan layout adalah proses menentukan di mana tiap persegi panjang ditempatkan
- Dalam default HTML,
widthdanheightelemen tidak mencakup border dan padding, sehingga terasa tidak intuitif - Jika padding di satu tempat diperbesar, seluruh layout yang awalnya tampak sempurna bisa terdorong secara tak terduga
* { box-sizing: border-box; }layak menjadi baris pertama CSS reset, karena membuat penambahan border menjadi perubahan lokal
-
margin collapsing
- Jika kita ingin jarak
8pxdi sekitar suatu elemen lalu memakai padding, jarak antara dua elemen bertetangga bisa menjadi16px marginbekerja dengan menggabungkan dua margin yang bertetangga bukan dengan penjumlahan, melainkan denganmax- Margin collapsing sangat berguna, tetapi bisa menghasilkan perilaku yang mengejutkan
- Bisa dianggap bahwa margin anak dapat menyembul keluar dari parent, tetapi pemahaman intuitif tentang margin sendiri dirasa belum cukup
- Tulisan Julia Evans Moving away from Tailwind, and learning to structure my CSS membahas pendekatan owl selector, di mana parent mengendalikan margin antar-anak alih-alih memberi margin pada elemen itu sendiri
- Menambahkan margin pada semua anak
sectionkecuali anak pertama dipahami sebagai ide untuk mengurangi masalah margin - Tidak nyamannya, pengetahuan seperti ini sulit dipelajari kecuali menjadi web developer profesional atau melakukan reverse engineering framework CSS lain
- Jika kita ingin jarak
-
Layout flow dasar
- Algoritme layout dasar terkait dengan asal HTML sebagai bahasa dokumen, dan tampaknya disesuaikan untuk kasus pembuatan dokumen mirip kertas yang berpusat pada teks dan gambar
- Untuk teks isi, flow dasar memang bekerja cukup dekat dengan perilaku yang diinginkan
- Jika ingin mengendalikan langsung penempatan ruang elemen halaman, diperlukan pendekatan selain flow dasar
-
flexbox
- flexbox adalah layout untuk menempatkan serangkaian elemen secara vertikal atau horizontal, lalu menyesuaikannya dengan ruang yang tersedia
- Dulu, penempatan seperti “ini di kiri, ini di kanan” membutuhkan pengetahuan CSS yang dalam atau framework CSS yang tidak transparan
- Flexbox cukup rumit sehingga MDN perlu terus dirujuk, tetapi secara umum pekerjaan yang diinginkan bisa diselesaikan dengannya
-
Desain responsif
- CSS modern dapat melakukan query terhadap ukuran layar dan menerapkan logika kondisional sesuai batasan user agent
- HTML pada dasarnya bersifat responsif; tidak seperti PostScript atau PDF, paragraf akan otomatis mengalir ulang saat ukuran jendela berubah
- Lebih baik menghindari aturan responsif yang eksplisit dan membiarkan layout bekerja secara wajar
- Blog ini terlihat cukup baik di ponsel, tablet, dan desktop tanpa query
@mediayang eksplisit - Cukup dengan selalu menetapkan
max-widthpada kolom utama teks isi
Ukuran dan teks: piksel, font, line height, line break
-
Piksel
1pxmelakukan hal yang diinginkan, tetapi bukan berarti satu piksel fisik pada layar1pxdalam CSS adalah satuan sudut pandang visual, dirancang agar tampak mirip secara perseptual di layar mana pun- Nilai ini dikonversi menjadi jumlah piksel fisik yang berbeda tergantung ukuran layar, kerapatan piksel, dan jarak pandang yang umum
- Karena itu, semua ukuran bisa ditentukan dalam piksel tanpa perlu memikirkan terpisah kerapatan piksel dari display yang berbeda-beda
- Satuan “nyata” seperti sentimeter dan inci dalam CSS juga didefinisikan berdasarkan piksel, sehingga pada praktiknya bekerja seperti sudut
-
font-size- Dalam
font-size: 16px,16pxbukan ukuran glif tertentu, melainkan ukuran kotak virtual di sekitar glif - Kotak ini tidak pas membungkus glif, dan ukuran glif yang sebenarnya berbeda-beda tergantung font
font-size-adjustdapat membuatfont-sizelebih konsisten antar-font- Saat ini
font-size-adjusttampak seperti fitur yang sangat niche; secara pribadi rasanya ingin menaruhfont-size-adjust: ex-height 0.53;di sampingbox-sizing, tetapi sedikit halaman yang melakukannya - Default
font-sizerelatif konsisten antar-browser, dan16pxadalah default yang sangat dominan - Tergantung font-nya,
16pxbisa tampak kecil, dan beberapa font default memang terlihat sangat kecil - Di Apple,
font-family: seriftampak jauh lebih kecil daripadasans-serif, dan pada16pxhampir tidak nyaman dibaca - Menetapkan
font-sizedi CSS menonaktifkan mekanisme perubahan ukuran font default milik browser - Jangan mengasumsikan teks akan mudah dibaca secara default; perlu dicek dalam pengaturan lain
- Jika dengan
font-size-adjustkebebasan sudah dikurangi dan maknafont-sizesudah dibuat tetap, lalu hasilnya baik pada ukuran font default16px, maka selesai - Jika tidak, atur
font-sizeke angka yang lebih besar, lalu periksa juga apakah tetap mudah dibaca dalam reader mode
- Dalam
-
line-height- Berlawanan dengan namanya,
line-heighttidak mengatur tinggi satu baris line-heightadalah tinggi sekumpulan glif yang diatur dengan font yang sama- Jika semua teks memakai font yang sama, tinggi baris dan tinggi sekumpulan glif itu akan bertepatan
- Jika beberapa kata diatur dengan font
monospace, hasilnya bisa berbeda dari perkiraan font-size-adjustmemperbaiki ukuran glif di dalam kotak, tetapi tidak menentukan posisi relatifnya juga- Ketika kumpulan teks dari font yang berbeda disejajarkan secara vertikal agar berbagi baseline, line-box
line-heightmasing-masing menjadi tidak sejajar - Tinggi keseluruhan baris bisa tersusun seperti gabungan himpunan dan menjadi lebih besar dari perkiraan
- Efek ini dibahas rinci dalam Deep dive CSS: font metrics, line-height and vertical-align
- Berlawanan dengan namanya,
-
vertical rhythm
- Vertical rhythm adalah gagasan agar posisi baris di antara paragraf tetap berada pada posisi relatif yang sama, meskipun ada judul, gambar, dan sebagainya
- Ini dijelaskan sebagai cara menyelaraskan halaman web seolah ada kertas bergaris tak terlihat di belakangnya
- Untuk layout satu kolom, ini dinilai tidak terlalu berguna
- Dalam layout dua kolom, mungkin ada keinginan agar baris di kedua sisi sejajar
- Tidak masuk akal mengeluarkan usaha rumit untuk ini pada satu kolom
-
word-break- Keunggulan layout flow adalah perilaku dinamis di mana teks terbagi rapi menjadi baris saat jendela menyempit
- Baris hanya bisa diputus pada spasi atau titik penyisipan tanda hubung
- Bagian panjang seperti
inline codeatau URL bisa jadi tidak terputus - Masalah ini menyebabkan overflow horizontal di perangkat mobile, dan biasanya baru disadari setelah dipublikasikan
- Tidak ada satu resep tunggal untuk memperbaikinya, tetapi Against Horizontal Scroll memiliki beberapa tips
Kesimpulan praktis
- Untuk membuat blog sederhana, dibutuhkan materi yang menjelaskan secukupnya bagian HTML dan CSS yang benar-benar diperlukan secara singkat
- Ditutup dengan permintaan akan sebuah buku pendek 100 halaman yang menjelaskan HTML dan CSS secukupnya untuk membuat blog sederhana tanpa tumbang oleh masalah seperti margin collapsing
1 komentar
Pendapat di Lobste.rs
Koreksi kecil, tetapi definisi responsive design adalah “membuatnya terender dengan baik di berbagai perangkat dan ukuran jendela/layar sehingga kegunaan dan kepuasan tetap terjamin”
Media query atau container query hanyalah salah satu alat untuk mewujudkannya, dan responsive design lebih dekat ke cara berpikir daripada “mari pakai media query untuk semua hal”
Jadi yang tampaknya lebih tepat disebut “buruk” bukan responsive design itu sendiri, melainkan media query atau penggunaan breakpoint yang berlebihan
Bagian “Browser defaults” cukup menyesatkan. Reset stylesheet dan normalize stylesheet sangat berbeda tujuan dan cara kerjanya, tetapi tulisan itu mencampuradukkan keduanya
Reset bukan sekadar menghilangkan perbedaan antar-browser, melainkan juga menghapus perbedaan bawaan antarelemen seperti
padding-inline-startpadaolatau tampilan defaultbutton, sehingga style bisa dibuat dari kertas kosong alih-alih di atas user agent stylesheetNormalize adalah pendekatan yang mencoba bekerja bersama user agent stylesheet, dan isinya campuran antara penyamaan perbedaan antar-browser dan penggantian ke nilai default yang dianggap “lebih masuk akal”
Sekarang ini kasus ketika nilai bawaan browser berbeda secara berarti sudah tidak banyak, jadi penulis konten web biasa hampir bisa mengabaikannya. Pengecualiannya antara lain Chromium has the wrong
tableborder-color, WebKit fixed theirs 1½ years ago, perbedaan margin/ukuran pada beberapa elemen formulir,appearance, dan styling::markerpada<summary>di WebKitSaya juga cenderung menentang
box-sizing: border-box.border-boxberpusat pada layout, sedangkancontent-boxberpusat pada konten, jadi menurut saya lebih baik orang tua menangani layout sementara desain dibuat berdasarkan konten. Saat menangani rasio,content-boxdiperlukan, dan kasus ketikaborder-boxbenar-benar berguna pada praktiknya kira-kira sebatas membuatbodymemenuhi viewportSaya juga skeptis terhadap
font-size-adjust. Ia menukar masalah yang sudah dikenal luas dengan masalah yang lebih sedikit tervalidasi; bagi sebagian orang mungkin sedikit lebih baik, bagi yang lain sedikit lebih buruk. Masalah dasarnya tidak bisa diselesaikan, dan itu memaksa kita membuat asumsi yang tidak berdasar tentang rasio dan metrik font milik penggunaline-heightdan ungkapan “diatur ke font yang sama” juga kurang presisi. Pada kenyataannya ukuran font, pergantian bahasa,font-family: monospace,vertical-align,<sup>,<sub>, dan metrik font semuanya saling terkait, jadi sulit menganggap ini sekadar masalah font yang samaMargin collapsing memang lebih rumit daripada yang digambarkan tulisan itu, tetapi juga cukup praktis. Jika memakai
flexataugriduntuk konten biasa, kita jadi harus terus mengutak-atikgapatau margin sehingga mudah rapuh. Dengandisplay: flow-root, kita bisa mencegah margin anak bergabung dengan margin indukSaya tidak sepakat dengan kerangka besar soal responsive design, tetapi arah untuk mengurangi media query yang tidak perlu dan tidak melawan browser itu benar. Jika perubahan layout bisa diekspresikan berdasarkan konten, biasanya itu pilihan yang lebih baik
Belakangan saya sering memakai interpolasi linear
clampdengan satuan viewport:margin-inline: --vw-lerp(1rem at 20rem, 2.5rem at 60rem);diekspansi menjadimargin-inline: clamp(1rem,1rem + ((2.5 - 1)/(60 - 20)*(100vw - 20rem)),2.5rem);Tahun lalu saya mengimplementasikan ini sebagai visitor LightningCSS, dan hasilnya adalah 1rem saat viewport 20rem atau kurang, lalu naik mulus hingga 2.5rem pada 60rem dan berhenti di sana, sehingga terasa enak karena tanpa breakpoint dan tetap menyesuaikan ukuran font pengguna
font-size-adjustbekerja seperti itu. Namanya memang membingungkan, tetapi pemahaman saya adalahfont-sizemengubah ukuran kotak em, sedangkanfont-size-adjustmengubah ukuran glif di dalam kotak emJadi
emdanremtetap sama, sedangkanchberubah. Namunchmemang dari awal bergantung pada font, jadi wajar jika berubahSaya ingin ada tulisan tentang
font-size-adjust. Saya bukan ahli jadi tingkat keyakinan saya rendah, tetapi sejauh ini ini tampak seperti peningkatan besar yang hampir tidak dikenal orang. Memang tidak mungkin menyelaraskan dua font apa pun secara otomatis dalam semua konteks, tetapi hanya dengan menyamakan ukuranxalih-alih kotak em, menurut saya 90% kasus font/konteks sudah tercakupArah tulisan ini bagus, dan sudut pandang orang yang tidak sepenuhnya tenggelam dalam HTML/CSS juga penting, tetapi cukup banyak hal yang disebut “buruk” justru bisa bagus tergantung konteks
Selector CSS mudah disalahgunakan, tetapi pada dasarnya tidak buruk. Daripada dipaksa menyimpulkan A atau B, kita bisa punya aturan/selector umum lalu menaburkan class berbasis pengecualian atau utility class saat diperlukan
Bahkan di dalam tulisan itu sendiri ada contoh selector yang bagus:
Media query juga bisa jadi tidak diperlukan jika bisa diselesaikan dengan container queries
Permukaan CSS bisa terasa sangat luas, tetapi karena ia dipakai secara luas dan mampu melakukan banyak hal, benturan pendapat juga sering terjadi. Meski begitu, kita juga perlu melihat seberapa jauh CSS telah berkembang, dan betapa sedikit kode yang dibutuhkan untuk melakukan banyak hal jika konsep-konsepnya sudah dipahami
Kalau ingin belajar lebih jauh, https://every-layout.dev/ cukup membantu saya memahami bagaimana berbagai elemen saling terkait di CSS
Saya mulai memahami web layout ketika sadar bahwa situs web yang baik pada dasarnya dirancang secara vertikal. Elemen secara default seharusnya ditumpuk dari atas ke bawah, lalu layar mobile dirancang lebih dulu dan pada layar besar tinggal dibentangkan sebagai bonus
Sulit untuk setuju dengan klaim ini. CSS nesting hanyalah gula sintaks, dan tidak benar-benar membantu menghindari masalah selector yang terlalu spesifik secara berarti
Bahkan 15 tahun lalu orang sudah banyak memakai nesting selector lewat Sass, dan satu per satu sampai pada kesimpulan bahwa itu justru membelenggu diri sendiri dengan mengikat selector CSS terlalu erat ke struktur HTML
Jebakan nesting tidak terlalu terlihat di awal proyek. Pada tahap greenfield saat yang utama adalah membuat fitur baru, menulis CSS seperti ini terlihat sangat bagus
Beberapa bulan kemudian, saat mulai melakukan perubahan layout besar dan redesign, elemen wrapper di HTML berpindah-pindah tempat, dan menyesuaikan CSS dengannya terasa seperti memecahkan Rubik's Cube sambil memakai LSD
Menurut saya puncaknya adalah menjaga spesifisitas selector tetap rendah untuk sebagian besar kasus, yaitu dengan selector sederhana berupa satu class, dan hanya memakai sedikit selector gabungan serta selector kombinasi seperti
a:hover. Ini jalur seperti BEM dan OOCSS, lalu setelah itu perhatian cepat bergeser ke alat yang berpusat pada JSTulisan yang menarik, tetapi penulis tampaknya memakai nested selector di posisi yang tidak memberi efek apa pun
&itu sebuah kesalahan, dan karena itu selalu menuliskan&. Menurut saya itu sikap yang cukup masuk akalSecara pribadi saya masih setengah-setengah. Awalnya saya juga mengira itu kesalahan, tetapi cukup praktis ketika setelah menulis banyak style kita bisa langsung mempersempit cakupannya hanya dengan membungkusnya dalam
header { … }. Akan bagus juga kalau at-rule yang bukan berbasis selector seperti@keyframesbisa dipakai di dalamnyaIni terus terang nasihat yang sangat buruk. Saya suka tulisan Maklad, tetapi ini jelas terlihat ditulis oleh orang yang belum pernah memakai CSS secara profesional
Hampir semuanya adalah kebiasaan buruk ala amatir yang dihindari dalam penulisan CSS profesional
Karena menatanya tanpa class selector, akhirnya
<main>atau<nav>pun didandani tanpa selectorSebaliknya, di lingkungan profesional waktu untuk merancang kotak konten sangat sedikit. Biasanya dibuat sekali di awal proyek, lalu setelah itu hanya bug kecil yang diperbaiki perlahan
Sebagian besar waktu justru dihabiskan untuk membuat komponen kustom atau komponen yang dapat dipakai ulang. Komponen reusable lebih sulit, dan pada dasarnya ujung-ujungnya membuat klon Bootstrap khusus untuk situs itu sendiri
Komponen kustom lebih mudah, tetapi jumlah kodenya membengkak, dan agar tidak tanpa sengaja mengganggu komponen lain dibutuhkan strategi seperti BEM, OOCSS, atau utility class seperti Tailwind
Kesimpulannya, tiap teknik punya skala yang berbeda-beda. Jika cara menulis CSS profesional terlihat tidak berguna, kemungkinan besar itu karena Anda sedang memecahkan masalah pada skala yang berbeda
Meski begitu, saya setuju dengan
Bad: Wrappers. Saya pernah melihat pakar CSS menulis seluruh situs dalam satu atau dua file, dan juga pernah melihat orang yang memakai CSS dalam jumlah sangat besarJalur yang terakhir ini pada akhirnya mudah mengarah ke pendekatan yang keliru seperti BEM demi mengelola CSS yang begitu banyak
Di dalam tulisan itu tampaknya ada nasihat yang saling bertabrakan
Good: Classless CSSdanBad: CSS selectorsmuncul bersamaan, padahal untuk memakai classless CSS justru harus lebih bergantung pada selector CSSReferensi: https://www.keithcirkel.co.uk/css-classes-considered-harmful/
Vertical rhythm seperti “seolah ada buku tulis bergaris tak terlihat di belakang halaman web” sepenuhnya bisa dilakukan dengan nilai EM
Kalau mencampur font yang berbeda mungkin akan sedikit goyah karena perbedaan metrik, tetapi bahkan saat itu Anda bisa memakai
align-items: baselinedari flex