Preprocessor dulu hampir wajib untuk nesting, token warna, dan kalkulasi responsif; kini browser menangani banyak pekerjaan itu sendiri. Inilah titik temu Sass SCSS CSS native: overlap use case tanpa identitas implementasi yang sama. Parser browser memproses CSS native langsung, sedangkan compiler Sass/SCSS menerjemahkan sumber ke CSS. Kemiripan kebutuhan tidak menjamin output atau specificity identik.
Artikel ini membandingkan pola lama (Sass/SCSS) dengan CSS modern untuk front-end dan pengembang tema WordPress yang ingin mengurangi build step. Rujukan teknis mengacu dokumentasi Sass dan halaman referensi MDN Web Docs; status Baseline mengikuti catatan riset per fitur, bukan tebakan versi browser.
Inti artikel:
- Nesting,
--*/var(),clamp(), fungsi math/warna CSS, dan nested at-rules banyak kasus menggantikan alasan compile Sass sederhana. - Variable Sass ≠ custom property: compile-time vs cascade runtime.
- Sass tetap relevan untuk mixin, loop, map, dan logika generate kode.
- Verifikasi target browser (Chrome/Edge, Firefox, Safari) sebelum production.
Sass, SCSS, dan CSS Native Bukan Hal yang Sama

Sass adalah bahasa stylesheet dengan preprocessor: compiler mengubah file sumber menjadi CSS. SCSS adalah sintaks Sass berkurung kurawal dan titik koma, mirip CSS biasa. CSS native adalah CSS yang browser parse tanpa tahap Sass. SCSS masih dominan di proyek WordPress dan theme kustom; migrasi sebagian fitur ke CSS native tidak sama dengan menghapus Sass dari seluruh codebase.
Tim yang memilih plain CSS modern sering membandingkan stack styling lebih luas—utility-first, modules, atau CSS biasa—seperti di artikel CSS Modules, Tailwind, atau CSS Biasa untuk Proyek Klien. Namun Sass dan CSS native bisa hidup berdampingan: token di custom property, komponen di nesting native, generator grid tetap di Sass bila perlu.
Ringkasan Dukungan Browser
Sebelum mengadopsi fitur di production, buka tab Compatibility pada halaman MDN masing-masing fitur. Tabel berikut merangkum status lintas Chrome/Edge, Firefox, dan Safari; label “Widely Available” mengacu Baseline web.dev bila fitur sudah masuk kategori itu.
| Fitur | Chrome/Edge | Firefox | Safari | Baseline | Rekomendasi |
|---|---|---|---|---|---|
CSS Nesting + & |
Ya | Ya | Ya | Widely Available | Production |
Custom Properties + var() |
Ya | Ya | Ya | Widely Available | Production |
color-mix() |
Ya | Ya | Ya | Widely Available | Production |
| Relative Color Syntax | Ya (modern) | Ya (modern) | Ya (modern) | Per fungsi | Modern + fallback |
min() / max() / clamp() |
Ya | Ya | Ya | Widely Available | Production |
round() / mod() / rem() |
Ya | Ya | Ya | Baseline 2024 | Production modern |
| Trigonometri CSS | Ya | Ya | Ya | Widely Available (sin() dll.) |
Production modern |
pow() / sqrt() / hypot() / log() / exp() |
Ya | Ya | Ya | Sebagian Widely Available | Production modern |
abs() / sign() |
Ya | Ya | Ya | Baseline 2025 | Production modern |
pi / e |
Ya (modern) | Ya (modern) | Ya (modern) | CSS Values L4 | Verifikasi target |
1. CSS Nesting dan Nesting Selector &
Definisi: CSS Nesting memungkinkan Anda menulis rule di dalam rule lain; browser membangun selector turunan sesuai spesifikasi nesting (MDN CSS Nesting). Fungsi: mengurangi pengulangan parent selector dan mengelompokkan gaya per komponen. Contoh Sass/SCSS:
.card {
padding: 1rem;
.title { font-weight: 700; }
&:hover { transform: translateY(-2px); }
@media (width >= 768px) { padding: 2rem; }
}
Setelah fitur ini matang di target browser, pola setara tanpa compile terlihat seperti berikut:
.card {
padding: 1rem;
.title { font-weight: 700; }
&:hover { transform: translateY(-2px); }
@media (width >= 768px) { padding: 2rem; }
}
Sass mengekspansi nesting saat compile; CSS native mem-parsing nested rule langsung. Tampilan mirip SCSS, namun aturan specificity dan batas nesting mengikuti CSS—nested selector tanpa & punya aturan sendiri. Kelebihan: tanpa preprocessor untuk struktur komponen, nested @media/@container native. Kekurangan: nesting terlalu dalam merusak maintainability; browser lama butuh fallback/build. Pakai bila hubungan selector jelas dan kedalaman terkendali; hindari bila specificity jadi labirin.
Kemudian pertimbangkan nested at-rules (@media, @supports, @container, @layer, @scope) yang bisa tinggal di dalam blok komponen. Meski demikian, @scope lebih baru—uji Safari/Firefox/Chrome target Anda sebelum menjadikannya requirement tanpa fallback (MDN @scope).
2. CSS Custom Properties dan var()
Definisi: Custom property (--nama) menyimpan nilai di cascade; var() membaca nilai itu di runtime (MDN custom properties). Fungsi: design token warna, spacing, typography, dan tema yang berubah per selector atau state. Pola variabel Sass:
$primary: #1769e0;
$radius: 12px;
.button {
background: $primary;
border-radius: $radius;
}
Padanan native memindahkan token ke cascade browser:
:root {
--primary: #1769e0;
--radius: 12px;
}
.button {
background: var(--primary);
border-radius: var(--radius);
}
Variable Sass (Sass variables) hilang setelah compile; custom property tetap di CSS dan mewarisi cascade—cocok dark mode dan multi-tema, termasuk pola semantic token seperti pada tutorial Multi Tema dan Dark Mode di Tailwind CSS v4. Lantaran itu, Sass masih unggul untuk map/list dan logika compile-time. Pakai custom property bila nilai harus berubah runtime; tetap di Sass bila struktur data kompleks di waktu build.
3. min(), max(), dan clamp()
Definisi: Fungsi perbandingan CSS memilih nilai minimum, maksimum, atau rentang fluid. Fungsi: typography dan layout responsif tanpa deret breakpoint manual. Sass modern bisa meneruskan clamp() ke output; fokus perbandingan bukan klaim historis, melainkan logic responsif yang dulu sering dipecah lewat variabel/breakpoint preprocessor:
$min-size: 1rem;
$preferred-size: 2.5vw;
$max-size: 2rem;
.title { font-size: clamp($min-size, $preferred-size, $max-size); }
.title { font-size: clamp(1rem, 2.5vw, 2rem); }
.sidebar { width: min(100%, 24rem); }
.hero { min-height: max(60vh, 30rem); }
Engine layout menghitung nilai final; formula rumit sulit dibaca. Gunakan untuk fluid type/spacing; untuk perubahan layout struktural, media atau container query sering lebih jelas. Walau begitu, latihan interaktif tetap membantu—lihat daftar CSS Playground & Simulator Layout.
4. round(), mod(), dan rem()
Definisi: Stepped value functions CSS Values Level 4 untuk pembulatan dan sisa bagi (MDN round(), mod()). Fungsi: snap nilai ke grid interval di runtime. Sass memakai modul sass:math; CSS native mengekspresikan interval langsung:
@use "sass:math";
$value: 105px;
$step: 10px;
.example { width: math.round(math.div($value, $step)) * $step; }
.example { width: round(105px, 10px); }
.item { --modulus: mod(21, 4); --remainder: rem(21, 4); }
mod() dan rem() berbeda pada operand negatif—jangan diasumsikan setara. Berguna bila sumber angka dari custom property; untuk konstanta tetap, tulis angka final agar stylesheet tetap ringkas. MDN mencatat kelompok ini masuk Baseline 2024; lewati bila organisasi masih menargetkan browser sangat lama.
5. Fungsi Trigonometri CSS
Definisi: sin(), cos(), tan(), dan inversnya dievaluasi engine CSS (MDN sin()). Fungsi: layout melingkar, transform berbasis sudut, animasi geometris. Precompute Sass versus runtime CSS:
@use "sass:math";
$angle: 45deg;
$x: math.cos($angle) * 100px;
$y: math.sin($angle) * 100px;
.item { transform: translate($x, $y); }
.item {
--angle: 45deg;
transform:
translateX(calc(cos(var(--angle)) * 100px))
translateY(calc(sin(var(--angle)) * 100px));
}
CSS trigonometri membaca sudut runtime; Sass menghitung saat compile. Overkill untuk layout statis; kuat bila sudut mengikuti custom property atau state. Akhirnya, cek Compatibility MDN sebelum memasang formula melingkar di production.
6. Fungsi Eksponensial CSS
Definisi: pow(), sqrt(), hypot(), log(), exp() untuk skala matematis di stylesheet (MDN pow()). Fungsi: modular scale tipografi, geometri layout.
@use "sass:math";
$ratio: 1.25;
h1 { font-size: 1rem * math.pow($ratio, 4); }
h1 { font-size: calc(1rem * pow(1.25, 4)); }
.box { width: hypot(30px, 40px); }
Fungsi eksponensial jarang muncul di CSS harian; formula panjang menurunkan maintainability. Pakai bila ratio hidup di token; tulis angka final bila nilai tidak pernah berubah. Ternyata banyak tim hanya membutuhkan satu atau dua titik skala, bukan seluruh kurva dinamis.
7. abs(), sign(), pi, dan e
Definisi: abs() nilai absolut; sign() arah tanda; pi dan e konstanta perhitungan CSS (MDN abs()). Fungsi: offset dinamis dan formula geometri tanpa precompute Sass.
@use "sass:math";
$distance: -40px;
$absolute-distance: math.abs($distance);
.box {
--distance: -40px;
margin-inline-start: abs(var(--distance));
translate: calc(sign(var(--direction)) * 20px);
}
.circle-item { --angle: calc(2 * pi / 8 * 1rad); }
MDN dan Baseline mencatat abs()/sign() sebagai Baseline 2025—lebih muda daripada custom properties. Verifikasi matriks browser internal sebelum rollout luas, terutama bila audience masih memakai Safari/iOS satu generasi di belakang.
8. color-mix()
Definisi: Mencampur dua warna di color space tertentu (MDN color-mix()). Fungsi: tint/shade/hover state dari token dasar.
@use "sass:color";
$primary: #1769e0;
.button { background: color.mix(white, $primary, 20%); }
:root { --primary: #1769e0; }
.button { background: color-mix(in srgb, var(--primary) 80%, white); }
Sass color.mix() dan CSS color-mix() tidak garanti pixel identik—color space eksplisit di CSS mengubah interpolasi. Cocok dengan custom property; untuk brand guideline dengan hex tetap, tetapkan nilai manual. Agar gradasi kompleks tetap terkendali, bandingkan dengan pembahasan CSS Gradient untuk Website.
9. Relative Color Syntax
Definisi: Sintaks rgb(from …), hsl(from …), oklch(from …), dll. membuat warna baru dari channel sumber (MDN relative colors). Fungsi: variasi lightness/hue/alpha tanpa duplikasi palet.
@use "sass:color";
$primary: hsl(215 80% 50%);
.button:hover { background: color.adjust($primary, $lightness: 10%); }
:root { --primary: hsl(215 80% 50%); }
.button:hover {
background: hsl(from var(--primary) h s calc(l + 10));
}
.overlay { background: rgb(from var(--primary) r g b / 40%); }
Manipulasi Sass terjadi compile-time; relative color dihitung browser—lighten() legacy Sass tidak setara matematis dengan menaikkan channel l. Syntax lebih berat; sediakan fallback bila audience masih memakai browser lama.
Fitur Sass yang Belum Layak Dianggap Sudah Digantikan CSS Native
CSS custom @function, conditional if() modern, dan random() CSS masih terbatas atau belum matang lintas browser untuk menggantikan mixin, loop, map, dan generate kode Sass di production umum. Mixin, @for/@each, module @use, dan transform compile-time tetap alasan tim Bootstrap dan framework lain mempertahankan pipeline Sass (Sass @function). Artikel ini tidak menyatakan Sass mati—hanya memetakan overlap use case.
Apakah Masih Perlu Sass/SCSS?
CSS native sudah cukup bila proyek hanya butuh nesting dangkal, token via custom property, responsif clamp()/min()/max(), warna color-mix()/relative color, dan math runtime—tanpa manfaat tambahan dari bundler selain minifikasi. Sass masih masuk akal bila ada mixin besar, loop generate utility, map design system di compile-time, atau kebutuhan transpile/fallback terpusat. Keputusan mengikuti requirement proyek dan browser target, bukan tren “hapus Sass sekarang”.
Contoh Migrasi Mini: Dari SCSS ke CSS Native
Blok SCSS berikut memakai lighten()—API lama; dipakai hanya sebagai pola kode legacy, bukan rekomendasi Sass modern (breaking changes color Sass).
$primary: #1769e0;
.card {
padding: 1rem;
background: $primary;
.title { font-size: 1rem; }
&:hover { background: lighten($primary, 8%); }
@media (width >= 768px) { padding: 2rem; }
}
:root { --primary: #1769e0; }
.card {
padding: 1rem;
background: var(--primary);
.title { font-size: 1rem; }
&:hover {
background: color-mix(in srgb, var(--primary), white 8%);
}
@media (width >= 768px) { padding: 2rem; }
}
Versi native tidak memanggil compiler Sass: nesting, token runtime, hover warna, dan media query lewat parser CSS. Sisa pipeline (PostCSS, bundler) tetap opsional untuk autoprefixer atau concat file.
FAQ
Apakah CSS native sekarang bisa menggantikan SCSS?
Untuk nesting, variable runtime, calculation, dan manipulasi warna—sering ya. Mixin, loop, map, dan generate kode belum punya pengganti setara di CSS native production, jadi tim besar tetap butuh Sass untuk arsitektur stylesheet.
Apakah CSS Nesting sama dengan SCSS nesting?
Sintaks bisa sangat mirip; namun CSS memakai parser browser dengan aturan specificity dan nesting spec sendiri (W3C CSS Nesting). Uji selector nested Anda di DevTools bila migrasi dari SCSS.
Apa perbedaan variable Sass dan CSS variable?
Variable Sass bekerja compile-time; custom property hidup di cascade dan bisa berubah per tema/state (CSS Variables W3C). Jangan menunggu Sass variable berubah saat runtime—itulah peran --token.
Apakah Sass masih perlu dipelajari?
Bergantung codebase: theme/framework berbasis SCSS, Bootstrap customization, atau legacy WordPress masih banyak SCSS. Proyek greenfield CSS-only bisa fokus native dulu, lalu belajar Sass saat masuk repo yang sudah bergantung preprocessor.
Apakah CSS modern membutuhkan compiler?
Anda tidak perlu Sass compiler untuk fitur di artikel ini; bundler/PostCSS tetap berguna untuk concat, minify, atau plugin lain. Compiler Sass dan bundler JS memecah masalah berbeda.
Penutup: Pilih Berdasarkan Pekerjaan, Bukan Label Preprocessor
CSS modern mengambil banyak alasan historis memakai Sass—terutama nesting, token runtime, math, dan warna dinamis. Proyek sederhana sampai menengah layak menulis CSS native terlebih dahulu lalu menambah Sass hanya bila compile-time logic benar-benar menghemat waktu. Sass tetap relevan untuk arsitektur yang sudah berinvestasi di module, mixin, dan generator.
Setelah deploy, uji di Chrome/Edge, Firefox, dan Safari yang Anda janjikan ke klien; gunakan Baseline dan MDN Compatibility, bukan asumsi versi. Bila tim WordPress merancang theme dari nol tanpa dependency Sass framework, kombinasi nesting + custom property + color-mix() sering menutup kebutuhan visual harian—sisanya tetap trade-off maintainability versus tooling.