Fitur-fitur Modern HTML/CSS yang Kurang Dikenal
(lyra.horse)- Penyebab utama penurunan performa situs web belakangan ini adalah penggunaan JavaScript yang berlebihan dan skrip pelacakan, padahal dalam banyak kasus hal itu bisa cukup digantikan dengan HTML/CSS saja
- Fitur-fitur yang baru ditambahkan seperti CSS nesting, relative colors, unit viewport baru (lvh, svh, dvh) memungkinkan penyelesaian sederhana untuk hal-hal yang dulu bergantung pada JS atau preprocessor
- CSS bukan sekadar alat styling, melainkan bahasa yang kuat yang mampu mewujudkan animasi, validasi input, tema dark mode, hingga menu accordion
- Dari sisi performa, CSS berjalan dengan akselerasi GPU dan di thread terpisah sehingga lebih mulus dan efisien daripada JS untuk animasi dan efek transisi
- Penulis menekankan CSS bukan hanya alat praktis, tetapi juga sarana ekspresi dan seni, serta mendorong para web developer untuk lebih memanfaatkan potensi CSS modern
Pendahuluan: Kompleksitas web, dan upaya baru
- Banyak situs web mengalami penurunan performa dan kompleksitas akibat penggunaan framework JavaScript yang berlebihan
- Aplikasi React membutuhkan beberapa detik untuk memuat, dan NextJS memunculkan hydration error
- Folder
node_modulesdapat memakan ukuran hingga beberapa gigabita
- Bahkan tanpa JavaScript, HTML dan CSS saja sudah bisa mewujudkan fitur yang kuat
- Selain keranjang belanja e-commerce yang kompleks atau dashboard, JavaScript mungkin tidak selalu wajib
- Tulisan ini memperkenalkan fitur-fitur terbaru CSS dan mendorong developer mengeksplorasi berbagai kemungkinan tanpa hanya bergantung pada JavaScript
Kesalahpahaman dan persepsi tentang CSS
Apakah CSS benar-benar sulit dan tidak nyaman digunakan?
- Persepsi negatif terhadap CSS berasal dari kurangnya pembelajaran dasar
- Banyak developer melewati dasar-dasar CSS dan fokus pada JavaScript atau TypeScript
- CSS bukan sekadar alat styling, melainkan bahasa khusus domain yang menyediakan kemampuan kuat
- CSS memungkinkan pembuatan layout kompleks dengan mudah lewat alat seperti flexbox
- Contoh: memusatkan div cukup mudah dengan
display: flexdanjustify-content: center - Developer tools di browser menyediakan widget untuk menyesuaikan properti flexbox secara visual
- Contoh: memusatkan div cukup mudah dengan
- Jika hanya mendalami satu sisi saja (misalnya JS) dan mengabaikan CSS, wajar bila CSS terasa berat
Susahnya menulis CSS, dan perubahannya
- Dulu CSS memang tidak terlalu nyaman, sehingga lahirlah alat seperti Sass dan Tailwind
- Contoh: harus mengelola rantai selector panjang seperti
.post > .buttons .like:hover
- Contoh: harus mengelola rantai selector panjang seperti
- Belakangan ini ditambahkan fitur peningkatan kualitas (seperti nesting), sehingga pengembangan dengan CSS murni menjadi jauh lebih nyaman
- CSS nesting mengumpulkan style yang saling terkait di satu tempat sehingga keterbacaan meningkat
- Contoh:
.post { & > .buttons { .like { &:hover { ... } } } } - Hubungan parent-child jadi lebih jelas, sehingga nama class bisa dibuat lebih pendek dan sederhana
- Contoh:
- CSS nesting mengumpulkan style yang saling terkait di satu tempat sehingga keterbacaan meningkat
- Relative colors memudahkan penyesuaian warna
- Kecerahan dapat diatur dengan
hsl(from #123456 h s calc(l + 10)) - Menghasilkan warna dinamis dengan mencampur dua warna lewat
color-mix()
- Kecerahan dapat diatur dengan
- Sintaks rentang media query memungkinkan penetapan kondisi yang intuitif seperti
(width <= 768px) - Unit lh mendukung styling yang menyesuaikan tinggi baris
- Properti scrollbar-gutter menyelesaikan masalah pergeseran layout akibat scrollbar
- Baseline menjamin kompatibilitas fitur di browser utama
- newly available berarti berfungsi di browser modern
- widely available berarti didukung hingga browser dari 2,5 tahun lalu
- Contoh: CSS nesting didukung di semua browser sejak Desember 2023
Mengapa membangun hanya dengan CSS/HTML?
- Sebagian pengguna menonaktifkan JavaScript secara default karena alasan keamanan, privasi, dan sebagainya
- Jika situs disajikan hanya dengan CSS/HTML murni, kemungkinan besar pengguna seperti ini tetap bisa memakainya
- Dari sudut pandang developer maupun pengguna, penggunaan CSS/HTML saja memberi keuntungan besar dalam hal kecepatan, aksesibilitas, serta penggunaan CPU/baterai
- Animasi CSS berjalan di compositor thread, sehingga mengurangi beban CPU
- JavaScript berjalan melalui event loop dan dapat menimbulkan sedikit latensi
- Aksesibilitas dan kemudahan penggunaan juga meningkat
- Efek hover pada tombol, animasi toast, dan validasi input bisa dibuat dengan mudah memakai CSS
Contoh nyata dan fitur-fitur utama CSS
Membuat animasi awal yang natural dengan @starting-style
- Dulu animasi kemunculan elemen memerlukan struktur rumit seperti keyframes dan trigger JS
- Dengan hadirnya @starting-style, penentuan state awal menjadi sederhana. Animasi state awal elemen (misalnya fade-in) bisa dibuat dengan mudah
- Diatur dengan
transition: opacity 1s; @starting-style { opacity: 0; } - Berfungsi tanpa
@keyframesatau JavaScript tambahan
- Diatur dengan
- Cukup nyatakan state awal bersama transition agar animasi diterapkan secara natural
- Contoh: menangani perubahan opacity dan posisi pesan toast dengan mulus
Pengaturan tema dark/light mode yang mudah
- color-scheme: light dark mengalihkan tema secara otomatis sesuai preferensi pengguna
- Fungsi light-dark(#000, #FFF) menentukan warna yang sesuai untuk mode terang/gelap
- Pemilihan tema oleh pengguna bisa didukung lewat radio button dan selector :has
- Pergantian tema bisa dilakukan hanya dengan CSS tanpa JavaScript
- Penyimpanan/pemuatan tema dengan JavaScript dapat ditambahkan secara opsional
Membuat UI kustom dengan radio/checkbox dan :has, :checked, dll.
- Interaksi kompleks seperti tab, accordion, dan toggle juga bisa dibuat tanpa JavaScript
- Radio button dapat diberi styling kustom dengan :checked dan :has
- Contoh: menetapkan style tombol yang dipilih dengan
label:has(input:checked) - Elemen input disembunyikan dengan
opacity: 0, tetapi aksesibilitas screen reader tetap terjaga
- Contoh: menetapkan style tombol yang dipilih dengan
- Elemen details cocok untuk membuat menu accordion seperti FAQ
- Status buka tunggal dapat dikendalikan dengan atribut
name - Animasi dapat ditambahkan berdasarkan state
[open]
- Status buka tunggal dapat dikendalikan dengan atribut
Validasi input dan refleksi state
- Dengan menggabungkan atribut HTML seperti pattern dan required serta pseudo-class CSS (:valid, :invalid, :user-valid, dll.), kita bisa memberi validasi real-time dan umpan balik visual
- Pengalaman pengguna meningkat lewat perubahan style seperti outline/border pada field input
- Atribut pattern di HTML memvalidasi isian field input
- Contoh:
\w{3,16}mengizinkan 3–16 huruf, angka, atau underscore
- Contoh:
- :valid dan :invalid di CSS memberi styling sesuai validitas
- :user-valid dan :user-invalid hanya menerapkan style setelah pengguna melakukan input
- Selector :has memungkinkan styling elemen lain berdasarkan state input
- Dalam beberapa kasus (misalnya syarat input yang kompleks), JS memang dibutuhkan, tetapi untuk kebanyakan hal CSS/HTML sudah cukup
Cara yang benar menggunakan unit viewport
- Unit vw/vh memiliki masalah akurasi di mobile karena address bar (navigation bar) dapat muncul dan menghilang
- Disarankan memakai unit viewport baru seperti lvh/svh/dvh (largest/smallest/dynamic viewport height)
- lvh: untuk layar penuh (misalnya background penuh)
- svh: untuk tombol, tautan, dan elemen lain yang harus selalu terlihat di layar
- dvh: untuk mengalokasikan ukuran secara dinamis sesuai perubahan seperti scroll
- Overlay keyboard ditangani dengan properti interactive-widget atau VirtualKeyboard API
<meta name="viewport" content="width=device-width, interactive-widget=resizes-content">- Di browser berbasis Chromium, gunakan
navigator.virtualKeyboard.overlaysContent = true
Wishlist CSS (fitur yang masih kurang atau diharapkan)
- Blok yang dapat digunakan ulang: menerapkan class lain di dalam class (misalnya
@apply border) - Selector media query gabungan: menggabungkan
@mediadengan selector class - Variabel nth-child: styling dinamis dengan
span { --nth: nth-child(); } - Selector nth-letter: styling huruf tertentu (misalnya
p::nth-letter(2)) - Menghapus unit: membuat nilai tanpa unit dengan
calc(100vw / 1px) - Fungsi image(): mendukung warna fallback dan potongan gambar
- Tag style di dalam body: dukungan standar resmi untuk mengurangi masalah FOUC
Penutup: CSS, dan sisi artistik web
- CSS bukan sekadar alat, melainkan sarana ekspresi kreatif
- Alat AI atau build chain (linter, alat minifikasi) dapat membatasi kreativitas
- CSS memenuhi performa, aksesibilitas, dan ekspresi artistik sekaligus
- Tulisan ini dibuat dengan HTML/CSS tanpa JavaScript berukuran sekitar 49kB
- Semua widget interaktif dan elemen visual dibuat secara manual
- Contoh: CSS click game membuktikan kemungkinan CSS sebagai bahasa pemrograman
3 komentar
Saya dulu full-stack, tetapi makin naik dalam karier rasanya makin tidak ada kesempatan mengerjakan FE, jadi selama sekitar 10 tahun saya nyaris tidak menyentuhnya. Belakangan saya sempat perlu memberi kuliah singkat di sebuah perusahaan dan mencoba melihatnya lagi sekalian untuk pengenalan singkat, dan ternyata perubahannya benar-benar mengejutkan. Kalau digabung dengan SCSS malah terasa lebih mantap. Tapi ranah CSS ini memang cukup unik. Mempelajarinya mudah, tetapi untuk menggunakannya sampai diakui benar-benar bagus menurut saya sangat ditentukan oleh selera estetika dan kreativitas masing-masing. Di era web yang makin mementingkan kegunaan dan desain, saya merasa sayang sekali nilai para publisher/front-end markup specialist belum mendapat apresiasi yang lebih tinggi.
Kali ini, sebagai kegiatan hobi mencicipi teknologi pengembangan web, saya mencoba membuat papan buletin dasar dari nol tanpa pengetahuan dasar sama sekali dengan menggunakan nextjs, authjs, tailwind, dan shadcn ... dan ternyata tingkat kesulitan belajar tertinggi ada di CSS.
Komentar Hacker News
Saya bersyukur CSS kini punya fitur nesting, tetapi secara keseluruhan CSS benar-benar aneh, dan menurut saya pribadi ini bahasa yang buruk, mungkin karena saya tidak bisa memakainya dengan benar, tetapi terlalu rumit dan berantakan sampai rasanya seperti memindahkan rune tak dikenal ke sana-sini, sistem styling dan layout bercampur, tetapi relasi pewarisan dan inklusinya berbeda sehingga makin membingungkan, menurut saya menggabungkan styling dan layout adalah kesalahan, dan rasanya menambahkan fitur ke sistem yang dari dasarnya sudah rusak tidak mungkin menjadi solusi
Hal terburuk dari CSS menurut saya adalah banyak orang bahkan tidak benar-benar mempelajarinya, cuma dipaksa memakainya sehari atau sekitar itu lalu langsung punya opini yang sangat kuat
Saya tidak terlalu tersentuh oleh argumen dalam tulisan ini bahwa "sebagian pengguna tidak menginginkan JavaScript", saya juga pengguna Arch dan sangat antusias dengan berbagai scripting dan crawling, tetapi fokus pada lingkungan "NoScript" tidak terasa terlalu penting, menurut saya itu preferensi kelompok yang sangat kecil sehingga pada umumnya bisa diabaikan, rasanya mirip era ketika orang bilang "10% masih memakai IE6", meskipun begitu saya tetap merasa ada banyak alasan lain yang jauh lebih kuat mengapa CSS lebih unggul, bagaimanapun ini bukan isu utama, hanya saja alur besarnya terasa seperti itu
Saya tidak tahu bahwa nesting kini sudah menjadi standar resmi, sampai belum lama ini saya kira masih tahap proposal, CSS memang punya banyak keanehan, tetapi saya juga merasakan arus bahwa ia berkembang menjadi bahasa yang makin layak seperti JavaScript, berkat Flexbox, selector :has, dan nesting, banyak titik sakit yang dulu sering saya alami kini sudah jauh berkurang
Dua fitur CSS yang ada di wishlist ternyata sudah ada dalam spesifikasi
Saya rasa sintaks CSS buruk, saya bekerja dengan 10~15 bahasa tetapi CSS adalah yang paling sulit dibaca dan dipahami, bahkan lebih rumit daripada assembly x86, CSS adalah input yang sudah ditokenisasi terlebih dulu untuk renderer, tetapi juga bukan token, dan terasa aneh untuk ditulis manusia, seperti ASN.1 di RFC, rasanya cocok dijadikan contoh buruk "jangan melakukan ini"
Saya penasaran apakah contoh tab radio itu baik dari sudut pandang aksesibilitas, setahu saya menurut pedoman WAI-ARIA, atribut aria-selected, tabindex, dan aria-controls harus diperbarui oleh JS saat tab berubah, meski saya tidak sepenuhnya yakin, aksesibilitas sering kali jadi urusan belakangan, dan ada juga kesalahpahaman bahwa memakai HTML/CSS saja otomatis menjamin aksesibilitas, ini hal yang perlu dipertimbangkan sekali lagi saat memilih pendekatan
Efek interaktif seperti ini juga bisa dibuat tanpa JS (halaman contoh)
Sebagai web developer dengan pengalaman 10 tahun, saya merasa tulisan seperti ini memang perlu mengguncang keyakinan kita, judulnya kurang bagus sampai saya hampir melewatkannya, sebagai catatan, rendering peta tidak bisa dilakukan hanya dengan CSS
Mungkin ada prasangka karena nama Vega, tetapi saya benar-benar suka situs ini, desain keseluruhannya bagus, dan isi halaman ini juga sangat hebat, ke depannya saya pasti akan membagikan tautan ini kepada orang-orang yang membuat web, saya juga sangat menyukai arrupted, yang dulu pernah menghasilkan karya keren, jadi menyenangkan melihat domain yang familiar ini muncul di halaman utama