Table of Contents
▼- Selama Ini Kita Butuh Math.random() di JavaScript untuk Variasi Visual
- Mengenal CSS random(): Sintaks, Parameter, dan Cara Kerjanya
- Contoh 1: Card Grid dengan Ukuran Sedikit Berbeda-beda Secara Organik
- Contoh 2: Animasi Partikel Ringan Tanpa Library
- Batasan random() CSS dan Kapan JavaScript Masih Diperlukan
- Kapan Pakai random() CSS vs Math.random() JavaScript
- Tips Praktis Implementasi random() di Production
- Kesimpulan
Selama ini, kalau mau bikin variasi visual yang random di website—seperti ukuran card yang sedikit berbeda, rotasi elemen yang organik, atau efek partikel ringan—kita harus pakai JavaScript dengan Math.random().
Tapi sekarang, CSS punya fungsi random() native yang bisa menghasilkan nilai acak langsung di stylesheet tanpa sentuh JavaScript sama sekali.
Ini game changer buat developer UI yang mau bikin interface lebih hidup dan natural, sambil tetap menjaga performa karena semua kalkulasi dilakukan di CSS layer.
Selama Ini Kita Butuh Math.random() di JavaScript untuk Variasi Visual
Sebelum ada random() di CSS, workflow standard kita adalah:
- Inisialisasi elemen di HTML
- Loop pakai JavaScript untuk generate nilai random
- Inject nilai tersebut sebagai inline style atau CSS variable
- Re-render atau re-calculate saat ada perubahan
Contoh kode lama yang masih banyak dipakai:
const cards = document.querySelectorAll('.card');
cards.forEach(card => {
const randomScale = 0.95 + Math.random() * 0.1;
const randomRotate = -2 + Math.random() * 4;
card.style.transform = `scale(${randomScale}) rotate(${randomRotate}deg)`;
});
Masalahnya, pendekatan ini:
- Butuh JavaScript execution yang block main thread
- Harus re-run saat ada dynamic content (infinite scroll, filter, dsb)
- Nambah bundle size kalau pakai library animasi
- Lebih susah di-maintain karena logic visual tersebar antara JS dan CSS
Dengan CSS random(), semua ini bisa dilakukan purely di stylesheet.
Mengenal CSS random(): Sintaks, Parameter, dan Cara Kerjanya
Fungsi random() di CSS adalah bagian dari CSS Values and Units Module Level 5 yang baru stabil di 2026.
Sintaks dasarnya:
random(<options>)
Di mana <options> bisa berupa:
- Range number:
random(min, max)— generate nilai antara min dan max - List items:
random(item1, item2, item3)— pilih salah satu item dari list - Per-element seed:
random(--seed-name, min, max)— generate nilai yang konsisten per elemen
Contoh Sintaks Dasar
.card {
/* Random scale antara 0.95 dan 1.05 */
scale: random(0.95, 1.05);
/* Random rotasi antara -3deg dan 3deg */
rotate: random(-3deg, 3deg);
/* Random opacity antara 0.7 dan 1 */
opacity: random(0.7, 1);
}
Setiap elemen dengan class .card akan mendapat nilai random yang berbeda, dan nilai ini di-generate saat rendering oleh browser.
Per-Element Seed untuk Konsistensi
Kalau mau nilai random-nya konsisten per elemen (tidak berubah saat re-render atau hover), pakai seed:
.card {
--card-seed: random();
scale: random(--card-seed, 0.95, 1.05);
rotate: random(--card-seed, -3deg, 3deg);
}
Dengan seed, semua properti yang pakai seed yang sama akan punya basis random yang konsisten.
Browser Support dan Fallback
Per Juli 2026, random() sudah didukung di:
- Chrome/Edge 121+
- Firefox 122+
- Safari 17.4+
Untuk fallback, pakai @supports:
.card {
scale: 1; /* fallback */
rotate: 0deg; /* fallback */
}
@supports (scale: random(0.9, 1.1)) {
.card {
scale: random(0.95, 1.05);
rotate: random(-3deg, 3deg);
}
}
Browser yang belum support akan pakai nilai static sebagai fallback.
Contoh 1: Card Grid dengan Ukuran Sedikit Berbeda-beda Secara Organik
Salah satu use case paling praktis adalah bikin grid layout yang terlihat lebih organic, bukan kaku seperti template.
Misalnya portfolio grid, product listing, atau gallery.
HTML:
<div class="organic-grid">
<div class="card">
<img src="project-1.jpg" alt="Project 1">
<h3>Website UMKM Kuliner</h3>
</div>
<div class="card">
<img src="project-2.jpg" alt="Project 2">
<h3>Dashboard Analytics</h3>
</div>
<div class="card">
<img src="project-3.jpg" alt="Project 3">
<h3>E-commerce Fashion</h3>
</div>
<!-- more cards -->
</div>
CSS dengan random():
.organic-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 2rem;
padding: 2rem;
}
.card {
--card-seed: random();
background: white;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
/* Variasi scale yang subtle */
scale: random(--card-seed, 0.97, 1.03);
/* Rotasi sangat kecil agar terlihat natural */
rotate: random(--card-seed, -1.5deg, 1.5deg);
/* Variasi posisi vertikal */
translate: 0 random(--card-seed, -8px, 8px);
transition: all 0.3s ease;
}
.card:hover {
scale: 1.05;
rotate: 0deg;
translate: 0 -12px;
box-shadow: 0 12px 24px rgba(0,0,0,0.15);
}
.card img {
width: 100%;
height: 200px;
object-fit: cover;
/* Random brightness untuk variasi tone */
filter: brightness(random(0.95, 1.05));
}
.card h3 {
padding: 1.5rem;
font-size: 1.25rem;
color: #1a1a1a;
}
Hasil yang didapat:
- Setiap card punya ukuran yang sedikit berbeda (97% sampai 103%)
- Rotasi kecil yang membuat grid tidak terlihat terlalu rigid
- Posisi vertikal yang bervariasi sedikit
- Filter brightness yang beda-beda per image
- Semua tanpa JavaScript, purely CSS
Efek ini sangat berguna untuk portfolio, landing page creative, atau product showcase yang mau tampil lebih artistic.
Tips tambahan:
Jangan berlebihan dengan range random. Untuk scale, range 0.95-1.05 sudah cukup. Kalau terlalu besar (misalnya 0.8-1.2), layoutnya malah jadi kacau dan susah dibaca.
Butuh jasa pembuatan website profesional? KerjaKode menyediakan layanan pembuatan website berkualitas tinggi dengan harga terjangkau. Kunjungi jasa pembuatan website KerjaKode untuk konsultasi gratis dan wujudkan website impian Anda.
Contoh 2: Animasi Partikel Ringan Tanpa Library
Use case lain yang powerful adalah bikin efek partikel atau confetti tanpa perlu library berat seperti Particles.js atau Canvas-based animation.
Ini cocok untuk:
- Background decoration
- Success state animation
- Hero section dengan floating elements
- Loading state yang menarik
HTML:
<div class="particle-container">
<div class="particle"></div>
<div class="particle"></div>
<div class="particle"></div>
<div class="particle"></div>
<div class="particle"></div>
<div class="particle"></div>
<div class="particle"></div>
<div class="particle"></div>
<div class="particle"></div>
<div class="particle"></div>
<!-- generate 20-30 particles -->
</div>
CSS dengan random():
.particle-container {
position: fixed;
inset: 0;
pointer-events: none;
overflow: hidden;
z-index: -1;
}
.particle {
--particle-seed: random();
position: absolute;
/* Random size */
width: random(--particle-seed, 4px, 12px);
height: random(--particle-seed, 4px, 12px);
/* Random position */
left: random(0%, 100%);
top: random(-10%, 110%);
/* Random shape: circle atau rounded square */
border-radius: random(--particle-seed, 0%, 50%);
/* Random color dengan opacity */
background: hsl(
random(200, 280),
random(50%, 80%),
random(50%, 70%)
);
opacity: random(0.3, 0.7);
/* Animation dengan random duration dan delay */
animation: float random(--particle-seed, 8s, 20s)
ease-in-out
random(--particle-seed, 0s, 5s)
infinite;
}
@keyframes float {
0%, 100% {
transform: translateY(0) rotate(0deg);
}
50% {
transform: translateY(random(-30px, -80px))
rotate(random(-180deg, 180deg));
}
}
/* Variant untuk horizontal movement */
.particle:nth-child(even) {
animation-name: float-horizontal;
}
@keyframes float-horizontal {
0%, 100% {
transform: translateX(0) scale(1);
}
50% {
transform: translateX(random(-50px, 50px))
scale(random(0.8, 1.2));
}
}
Hasil yang didapat:
- Setiap particle punya size, position, color, dan animation timing yang unik
- Performa tetap ringan karena CSS-based, bukan Canvas
- Tidak perlu JavaScript untuk initialize atau update
- Animasi loop infinite tanpa memory leak
Performance note:
Meskipun CSS-based, jangan spawn terlalu banyak particle (maksimal 30-40) kalau target device termasuk mobile low-end.
Untuk production, combine dengan will-change: transform dan contain: layout untuk optimize rendering.
Batasan random() CSS dan Kapan JavaScript Masih Diperlukan
Meskipun random() CSS powerful, ada beberapa batasan yang perlu dipahami:
1. Tidak Bisa Di-Control Programmatically
Nilai random di CSS di-generate oleh browser saat rendering, dan kita tidak bisa control seed-nya dari JavaScript.
Kalau butuh:
- Generate ulang nilai random saat user click button
- Sync random value antara CSS dan JavaScript logic
- Store random value ke database atau localStorage
Maka tetap harus pakai JavaScript.
2. Tidak Cocok untuk Game Logic atau Simulation
CSS random() bukan untuk:
- Dice roll game
- Lottery simulation
- Procedural generation yang complex
- Random yang butuh cryptographically secure
Untuk kasus ini, tetap pakai Math.random() atau crypto.getRandomValues() di JavaScript.
3. Limited untuk Conditional Logic
CSS tidak punya if-else, jadi kalau butuh logic seperti:
if (random > 0.5) {
apply style A
} else {
apply style B
}
Ini tetap harus di JavaScript atau pakai CSS @layer dengan custom property.
4. Re-render Behavior
Nilai random() bisa berubah saat:
- Elemen di-repaint
- CSS property yang pakai
random()di-recalculate - Browser zoom in/out (tergantung implementasi browser)
Kalau butuh nilai yang truly persistent across session, pakai JavaScript dan save ke localStorage.
Kapan Pakai random() CSS vs Math.random() JavaScript
Pakai random() CSS kalau:
- Purely visual variation (scale, rotate, color, opacity)
- Tidak butuh control programmatic
- Mau optimize performa dengan mengurangi JavaScript execution
- Layout yang organic dan aesthetic-focused
Pakai Math.random() JavaScript kalau:
- Butuh control penuh atas seed dan generation
- Ada business logic atau game mechanic
- Perlu sync dengan backend atau database
- Butuh conditional logic yang complex based on random value
Hybrid approach:
Bisa juga combine keduanya. Misalnya:
- Pakai JavaScript untuk generate initial configuration
- Inject sebagai CSS custom properties
- Pakai CSS
random()untuk micro-variations di atas base config
// JavaScript generate base config
document.documentElement.style.setProperty(
'--base-hue',
Math.floor(Math.random() * 360)
);
/* CSS pakai base config + random variation */
.element {
background: hsl(
calc(var(--base-hue) + random(-20, 20)),
random(50%, 70%),
random(45%, 55%)
);
}
Approach ini memberikan control atas "tema" random (dari JS), tapi detail variation handled oleh CSS untuk performa optimal.
Tips Praktis Implementasi random() di Production
Berdasarkan pengalaman implement di berbagai project client, berikut tips praktis:
1. Gunakan Range yang Subtle untuk UI Element
Jangan terlalu agresif dengan range random untuk element yang fungsional.
Good:
.button {
scale: random(0.98, 1.02);
rotate: random(-0.5deg, 0.5deg);
}
Bad:
.button {
scale: random(0.7, 1.3); /* terlalu ekstrem */
rotate: random(-15deg, 15deg); /* bikin pusing */
}
2. Combine dengan Seed untuk Konsistensi
Kalau satu elemen pakai multiple random properties, pakai seed yang sama agar variasinya harmonis:
.card {
--seed: random();
scale: random(--seed, 0.95, 1.05);
rotate: random(--seed, -2deg, 2deg);
opacity: random(--seed, 0.9, 1);
}
3. Test di Multiple Browser
Implementasi random() bisa sedikit berbeda antar browser engine (Blink vs Gecko vs WebKit).
Selalu test di Chrome, Firefox, dan Safari sebelum deploy ke production.
4. Provide Fallback yang Meaningful
Jangan biarkan fallback kosong. Provide nilai default yang tetap bagus tanpa random:
.element {
scale: 1;
rotate: 0deg;
opacity: 1;
}
@supports (scale: random(0.9, 1.1)) {
.element {
scale: random(0.95, 1.05);
rotate: random(-2deg, 2deg);
opacity: random(0.85, 1);
}
}
5. Monitor Performance di Mobile
Meskipun CSS-based, terlalu banyak element dengan random() + animation bisa impact performa di device low-end.
Pakai prefers-reduced-motion untuk disable di user yang prefer less animation:
@media (prefers-reduced-motion: no-preference) {
.particle {
scale: random(0.8, 1.2);
animation: float 10s ease infinite;
}
}
@media (prefers-reduced-motion: reduce) {
.particle {
scale: 1;
animation: none;
}
}
Kesimpulan
CSS random() membuka kemungkinan baru untuk bikin interface yang lebih organic, dynamic, dan menarik tanpa harus touch JavaScript untuk setiap variasi visual kecil.
Cocok banget untuk:
- Portfolio dan creative landing pages
- Product showcase dengan aesthetic focus
- Background decorations dan particle effects
- Micro-interactions yang subtle tapi impactful
Tapi tetap aware dengan batasannya dan pakai JavaScript untuk logic yang truly butuh control programmatic.
Sekarang giliran kamu experiment. Coba implement di project berikutnya dan rasakan perbedaannya.
Happy coding!