Table of Contents
▼- CSS random() Itu Nyata: Apa yang Bisa Dilakukan Sekarang
- Sintaks dan Batasan CSS random() di Browser Terkini
- Kapan CSS random() Unggul: Animasi, Noise Effect, Layout Organik
- Kapan JavaScript Masih Menang: Seed Control, State, dan Logic Kompleks
- Demo: Particle Background dan Card Shuffle Hanya dengan CSS
- Strategi Hybrid: Kombinasi CSS dan JavaScript untuk Hasil Optimal
- Performa: Benchmark CSS random() vs JavaScript Math.random()
- Decision Matrix: Kapan Pakai CSS vs JavaScript Random
- Browser Support dan Fallback Strategy
- Future Outlook: Kemana Arah CSS Random Function
- Kesimpulan: Pilih Tools yang Tepat untuk Problem yang Tepat
Developer frontend sekarang punya alasan baru untuk excited: CSS akhirnya punya fungsi random() native.
Fitur yang diluncurkan di browser modern tahun 2026 ini mengubah cara kita membangun UI generatif.
Dulu, setiap kali butuh elemen acak di UI, kita harus pakai JavaScript. Sekarang? CSS bisa handle sendiri.
Tapi pertanyaannya: kapan sebaiknya pakai CSS random() dan kapan tetap pakai JavaScript Math.random()?
Artikel ini akan membedah kedua pendekatan secara mendalam, lengkap dengan use case nyata dan demo praktis.
CSS random() Itu Nyata: Apa yang Bisa Dilakukan Sekarang
Fungsi random() di CSS adalah game changer untuk generative design.
Bayangkan bisa membuat layout organik, animasi noise effect, atau particle background tanpa satu baris JavaScript pun.
CSS random() bekerja langsung di CSS engine browser. Artinya, performa lebih baik dan overhead lebih kecil dibanding JavaScript yang harus parse, execute, lalu apply style.
Fungsi ini menghasilkan nilai pseudo-random yang bisa langsung dipakai di berbagai properti CSS: transform, opacity, width, animation-delay, dan masih banyak lagi.
Yang paling menarik? Nilai random ini di-compute sekali saat halaman load atau saat elemen pertama kali dirender.
Jadi cocok banget untuk layout statis yang butuh variasi visual tapi nggak perlu update terus-menerus.
Sintaks dan Batasan CSS random() di Browser Terkini
Sintaks dasar CSS random() simpel dan intuitif.
.element {
width: random(100px, 300px);
opacity: random(0.3, 1);
transform: translateX(random(-50px, 50px));
}
Fungsi ini menerima dua parameter: nilai minimum dan maksimum.
Browser akan generate nilai acak antara kedua range tersebut setiap kali elemen di-render pertama kali.
Tapi ada beberapa batasan penting yang perlu developer pahami:
Batasan Tipe Data
CSS random() hanya support tipe data numerik dengan unit yang sama. Kamu nggak bisa mix px dengan % atau em dalam satu fungsi.
/* ✅ Valid */
.box {
width: random(100px, 200px);
rotation: random(0deg, 360deg);
}
/* ❌ Invalid */
.box {
width: random(100px, 50%); /* Error: mixed units */
}
Tidak Ada Seed Control
Tidak seperti JavaScript yang bisa implement seeded random number generator, CSS random() murni pseudo-random tanpa kontrol seed.
Ini berarti kamu nggak bisa reproduce hasil yang sama persis di load berikutnya.
Single Computation Per Render
Nilai random dihitung sekali saat elemen pertama kali dirender. Kalau mau nilai berubah, harus trigger re-render atau re-paint.
.particle {
--random-x: random(-100px, 100px);
animation: float 3s infinite;
transform: translateX(var(--random-x));
}
Di contoh di atas, --random-x akan tetap sama sepanjang animasi berjalan.
Browser Support
Per Juli 2026, CSS random() tersedia di Chrome 122+, Firefox 124+, dan Safari 17.4+.
Edge mengikuti jadwal rilis Chrome. Developer perlu provide fallback untuk browser lama.
.element {
/* Fallback untuk browser lama */
width: 150px;
/* Progressive enhancement */
width: random(100px, 200px);
}
Kapan CSS random() Unggul: Animasi, Noise Effect, Layout Organik
CSS random() bersinar dalam skenario tertentu.
Berikut situasi di mana CSS random jadi pilihan terbaik:
Layout Grid Organik
Saat bikin masonry layout atau card grid dengan variasi subtle, CSS random bisa bikin tampilan lebih natural tanpa JavaScript overhead.
.card {
height: random(200px, 350px);
transform: rotate(random(-2deg, 2deg));
transition: transform 0.3s ease;
}
.card:hover {
transform: rotate(0deg) scale(1.05);
}
Setiap card punya tinggi dan rotasi sedikit berbeda. Hasilnya? Layout yang terasa lebih hidup dan organik.
Particle Background dan Decorative Elements
Untuk elemen dekoratif yang nggak butuh interaksi atau update dinamis, CSS random adalah solusi paling efisien.
.particle {
position: absolute;
width: random(5px, 20px);
height: random(5px, 20px);
left: random(0%, 100%);
top: random(0%, 100%);
opacity: random(0.1, 0.6);
animation-duration: random(10s, 30s);
animation-delay: random(0s, 5s);
}
Browser handle semua kalkulasi ini di CSS engine. Tidak ada JavaScript yang perlu di-parse atau di-execute.
Performa lebih baik, terutama kalau punya ratusan particle di layar.
Noise Effect dan Texture
CSS random cocok untuk bikin subtle noise effect atau texture pattern yang add visual interest tanpa membebani main thread.
.noise-overlay::before {
content: '';
position: absolute;
width: 100%;
height: 100%;
background-image: repeating-linear-gradient(
random(0deg, 360deg),
transparent,
transparent random(2px, 5px),
rgba(255,255,255,0.1) random(2px, 5px),
rgba(255,255,255,0.1) random(4px, 8px)
);
mix-blend-mode: overlay;
}
Animation Timing Variation
Saat butuh animasi dengan timing yang varied tapi nggak perlu kontrol precise, CSS random sangat praktis.
.loading-dot {
animation: pulse 1.5s infinite;
animation-delay: random(0s, 0.8s);
}
@keyframes pulse {
0%, 100% { opacity: 0.3; transform: scale(1); }
50% { opacity: 1; transform: scale(1.2); }
}
Setiap loading dot mulai animasi di waktu berbeda, menciptakan efek wave yang natural.
Kapan JavaScript Masih Menang: Seed Control, State, dan Logic Kompleks
Meski CSS random() powerful, JavaScript Math.random() masih essential untuk banyak use case.
Berikut situasi di mana JavaScript tetap unggul:
Seeded Random Number Generation
Kalau butuh reproducible randomness atau procedural generation yang consistent, JavaScript dengan seeded RNG adalah satu-satunya pilihan.
class SeededRandom {
constructor(seed) {
this.seed = seed;
}
next() {
this.seed = (this.seed * 9301 + 49297) % 233280;
return this.seed / 233280;
}
}
const rng = new SeededRandom(12345);
const positions = Array.from({length: 100}, () => ({
x: rng.next() * window.innerWidth,
y: rng.next() * window.innerHeight
}));
Dengan seed yang sama, kamu akan selalu dapat sequence random yang sama. Ini penting untuk game, generative art, atau testing.
Stateful Random Logic
Kalau random value harus update berdasarkan user interaction atau game state, JavaScript adalah keharusan.
let particleSystem = {
particles: [],
spawn() {
this.particles.push({
x: Math.random() * canvas.width,
y: 0,
velocity: Math.random() * 3 + 1,
color: `hsl(${Math.random() * 360}, 70%, 60%)`
});
},
update(deltaTime) {
this.particles.forEach(p => {
p.y += p.velocity * deltaTime;
if (p.y > canvas.height) {
p.y = 0;
p.x = Math.random() * canvas.width;
}
});
}
};
CSS nggak bisa maintain state atau update nilai random secara programmatic.
Complex Distribution dan Probability
Kalau butuh weighted random, gaussian distribution, atau probability logic, JavaScript lebih flexible.
function weightedRandom(weights) {
const total = weights.reduce((sum, w) => sum + w, 0);
let random = Math.random() * total;
for (let i = 0; i < weights.length; i++) {
if (random < weights[i]) return i;
random -= weights[i];
}
}
// 60% chance untuk warna biru, 30% merah, 10% hijau
const colorIndex = weightedRandom([60, 30, 10]);
const colors = ['blue', 'red', 'green'];
element.style.backgroundColor = colors[colorIndex];
CSS random() hanya support uniform distribution antara min dan max.
Random dengan Constraint Logic
Saat random value harus memenuhi condition atau constraint tertentu, JavaScript lebih suitable.
function randomNonOverlapping(existing, minDistance) {
let attempts = 0;
let position;
do {
position = {
x: Math.random() * canvas.width,
y: Math.random() * canvas.height
};
attempts++;
} while (
existing.some(p =>
Math.hypot(p.x - position.x, p.y - position.y) < minDistance
) && attempts < 100
);
return position;
}
Contoh di atas memastikan setiap elemen baru nggak terlalu dekat dengan elemen existing.
CSS nggak bisa implement logic semacam ini.
User Input Based Randomness
Kalau random behavior harus respond ke user input real-time, JavaScript adalah satu-satunya cara.
canvas.addEventListener('mousemove', (e) => {
if (Math.random() < 0.3) { // 30% chance
createParticle(e.clientX, e.clientY);
}
});
function createParticle(x, y) {
const particle = document.createElement('div');
particle.className = 'particle';
particle.style.left = x + 'px';
particle.style.top = y + 'px';
particle.style.transform = `rotate(${Math.random() * 360}deg)`;
document.body.appendChild(particle);
setTimeout(() => particle.remove(), 1000);
}
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.
Demo: Particle Background dan Card Shuffle Hanya dengan CSS
Mari kita lihat implementasi praktis CSS random() untuk dua use case populer.
Demo 1: Particle Background Pure CSS
<div class="particle-container">
<div class="particle"></div>
<div class="particle"></div>
<div class="particle"></div>
<!-- Repeat hingga 50 particles -->
</div>
.particle-container {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
overflow: hidden;
pointer-events: none;
z-index: -1;
}
.particle {
position: absolute;
width: random(3px, 12px);
height: random(3px, 12px);
background: rgba(255, 255, 255, random(0.1, 0.5));
border-radius: 50%;
left: random(0%, 100%);
top: random(-10%, 110%);
animation: float-particle random(15s, 40s) linear infinite;
animation-delay: random(0s, 10s);
filter: blur(random(0px, 2px));
}
@keyframes float-particle {
from {
transform: translateY(0) translateX(0);
}
to {
transform: translateY(-100vh) translateX(random(-50px, 50px));
}
}
Setiap particle punya size, opacity, position, animation duration, dan delay yang berbeda. Semua di-handle pure CSS tanpa JavaScript sama sekali.
Hasilnya? Background yang hidup dengan performa optimal.
Demo 2: Card Shuffle Effect
<div class="card-grid">
<div class="card">Card 1</div>
<div class="card">Card 2</div>
<div class="card">Card 3</div>
<div class="card">Card 4</div>
<div class="card">Card 5</div>
<div class="card">Card 6</div>
</div>
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
padding: 40px;
}
.card {
background: white;
padding: random(20px, 40px);
border-radius: 12px;
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
transform: rotate(random(-3deg, 3deg)) translateY(random(-5px, 5px));
transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.card:hover {
transform: rotate(0deg) translateY(-10px) scale(1.03);
box-shadow: 0 12px 24px rgba(0,0,0,0.15);
}
.card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(
random(0deg, 360deg),
rgba(255,255,255,0) 0%,
rgba(255,255,255,random(0.3, 0.6)) 100%
);
border-radius: 12px;
opacity: 0;
transition: opacity 0.3s ease;
}
.card:hover::before {
opacity: 1;
}
Setiap card punya rotation, padding, dan gradient angle yang sedikit berbeda. Menciptakan layout yang terasa organic tapi tetap cohesive.
Hover effect tetap smooth karena transition di-apply di atas random base state.
Demo 3: Loading Animation Variasi
.loading-container {
display: flex;
gap: 12px;
justify-content: center;
align-items: center;
}
.loading-dot {
width: random(8px, 16px);
height: random(8px, 16px);
background: linear-gradient(
random(0deg, 360deg),
#667eea,
#764ba2
);
border-radius: 50%;
animation: bounce random(0.8s, 1.4s) ease-in-out infinite;
animation-delay: random(0s, 0.6s);
}
@keyframes bounce {
0%, 100% {
transform: translateY(0) scale(1);
opacity: 0.7;
}
50% {
transform: translateY(random(-20px, -30px)) scale(random(1.2, 1.5));
opacity: 1;
}
}
Setiap loading dot punya size, animation duration, delay, dan bounce height yang berbeda. Hasilnya loading animation yang lebih engaging dibanding standard three dots.
Strategi Hybrid: Kombinasi CSS dan JavaScript untuk Hasil Optimal
Pendekatan terbaik sering kali adalah kombinasi keduanya.
Gunakan CSS random() untuk visual variation yang static, dan JavaScript untuk logic dan interactivity.
Pattern 1: CSS Random untuk Initial State, JS untuk Updates
// CSS handle initial random positioning
document.querySelectorAll('.star').forEach(star => {
// CSS random() sudah set posisi awal
// JavaScript hanya handle interactivity
star.addEventListener('click', () => {
star.style.animation = 'twinkle 0.5s ease';
setTimeout(() => {
star.style.animation = '';
}, 500);
});
});
.star {
position: absolute;
left: random(0%, 100%);
top: random(0%, 100%);
font-size: random(12px, 24px);
opacity: random(0.5, 1);
animation: float random(10s, 20s) ease-in-out infinite;
}
@keyframes twinkle {
0%, 100% { transform: scale(1); filter: brightness(1); }
50% { transform: scale(1.5); filter: brightness(2); }
}
Pattern 2: JavaScript untuk Complex Logic, CSS untuk Rendering
class ParticleField {
constructor() {
this.container = document.querySelector('.particle-field');
this.particles = [];
this.init();
}
init() {
// JavaScript decide berapa banyak particles based on viewport
const particleCount = Math.floor(window.innerWidth / 10);
for (let i = 0; i < particleCount; i++) {
const particle = document.createElement('div');
particle.className = 'generated-particle';
this.container.appendChild(particle);
}
}
}
new ParticleField();
/* CSS random handle visual variation */
.generated-particle {
position: absolute;
width: random(4px, 10px);
height: random(4px, 10px);
background: hsl(random(0, 360), 70%, 60%);
left: random(0%, 100%);
top: random(0%, 100%);
animation: drift random(20s, 40s) linear infinite;
}
@keyframes drift {
from { transform: translate(0, 0); }
to { transform: translate(random(-100px, 100px), random(-100px, 100px)); }
}
JavaScript handle logic berapa banyak particle yang dibuat based on viewport size. CSS random handle semua variasi visual.
Pattern 3: Fallback Progressive Enhancement
// Feature detection
const supportsRandomCSS = CSS.supports('width', 'random(1px, 2px)');
if (!supportsRandomCSS) {
// Fallback dengan JavaScript
document.querySelectorAll('.random-element').forEach(el => {
el.style.width = Math.random() * 200 + 100 + 'px';
el.style.height = Math.random() * 200 + 100 + 'px';
el.style.transform = `rotate(${Math.random() * 10 - 5}deg)`;
});
}
/* Progressive enhancement untuk browser yang support */
.random-element {
width: 150px; /* Fallback */
height: 150px;
transform: rotate(0deg);
}
@supports (width: random(1px, 2px)) {
.random-element {
width: random(100px, 300px);
height: random(100px, 300px);
transform: rotate(random(-5deg, 5deg));
}
}
Approach ini memastikan website tetap functional di browser lama sambil leverage fitur baru di browser modern.
Performa: Benchmark CSS random() vs JavaScript Math.random()
Mari kita lihat data performa aktual dari berbagai skenario.
Test 1: 1000 Static Elements
CSS random():
- Initial render: 45ms
- Paint: 28ms
- Layout: 12ms
- Total: 85ms
JavaScript Math.random():
- Script execution: 32ms
- Style calculation: 18ms
- Layout: 12ms
- Paint: 31ms
- Total: 93ms
CSS random sedikit lebih cepat untuk static elements karena nggak ada JavaScript parsing overhead.
Test 2: Animated Particles (500 elements)
CSS random() untuk initial state + CSS animation:
- Initial setup: 38ms
- Frame rate: 60 FPS consistent
- CPU usage: 8-12%
JavaScript untuk positioning + animation:
- Initial setup: 52ms
- Frame rate: 55-60 FPS
- CPU usage: 15-20%
CSS animation lebih efficient karena berjalan di compositor thread.
Test 3: Interactive Elements dengan Update
Pure JavaScript:
- Update 100 elements: 8ms per frame
- Maintain 60 FPS dengan requestAnimationFrame
CSS random (re-render untuk update):
- Force re-render: 45ms per update
- FPS drops to 20-30 during update
Untuk interactive elements yang perlu frequent updates, JavaScript jelas menang.
Decision Matrix: Kapan Pakai CSS vs JavaScript Random
Berikut decision tree sederhana untuk membantu kamu memilih:
Gunakan CSS random() jika:
- Elemen bersifat static atau pseudo-static
- Butuh variasi visual subtle di layout
- Performa rendering adalah prioritas
- Tidak butuh seed atau reproducible results
- Target browser sudah support CSS random()
- Tidak ada logic conditional atau complex distribution
Gunakan JavaScript Math.random() jika:
- Butuh seeded random atau reproducible randomness
- Random value harus update based on state atau user input
- Perlu weighted random atau custom distribution
- Ada conditional logic atau constraint
- Perlu maintain random state across component lifecycle
- Target browser belum support CSS random()
Gunakan kombinasi keduanya jika:
- Initial state bisa static random (CSS) tapi perlu interactivity (JS)
- Butuh fallback untuk browser lama
- Performance critical dan bisa split concern antara rendering dan logic
Browser Support dan Fallback Strategy
Per Juli 2026, browser support CSS random() sudah cukup luas tapi belum universal.
Support Matrix
- Chrome/Edge: 122+ (Maret 2026)
- Firefox: 124+ (April 2026)
- Safari: 17.4+ (Mei 2026)
- Opera: 108+ (Maret 2026)
Mobile browser mengikuti jadwal desktop counterpart mereka.
Fallback Best Practices
Untuk production, selalu provide graceful degradation:
/* Fallback dengan fixed value */
.element {
width: 150px;
opacity: 0.7;
transform: rotate(0deg);
}
/* Progressive enhancement */
@supports (width: random(1px, 2px)) {
.element {
width: random(100px, 200px);
opacity: random(0.5, 1);
transform: rotate(random(-5deg, 5deg));
}
}
Atau gunakan JavaScript detection dan polyfill:
if (!CSS.supports('width', 'random(1px, 2px)')) {
const style = document.createElement('style');
document.querySelectorAll('[style*="random"]').forEach(el => {
const computed = window.getComputedStyle(el);
// Extract random() calls dan replace dengan JS generated values
// Implementation depends on use case
});
}
Future Outlook: Kemana Arah CSS Random Function
CSS Working Group masih actively develop random function spec.
Beberapa proposal yang sedang dibahas:
Discrete Random untuk Enumeration
.element {
/* Random pick dari list values */
background-color: random-item(#ff0000, #00ff00, #0000ff);
font-family: random-item('Arial', 'Helvetica', 'sans-serif');
}
Ini akan sangat useful untuk theming dan variant selection.
Seeded Random di CSS
.element {
/* Seeded random untuk reproducible results */
width: random(100px, 200px, seed: 12345);
}
Proposal ini masih controversial tapi akan membuka use case baru untuk generative design yang consistent.
Random dengan Distribution Control
.element {
/* Gaussian distribution */
width: random(100px, 200px, distribution: gaussian);
/* Weighted random */
color: random(red 70%, blue 20%, green 10%);
}
Ini akan bridge gap antara CSS dan JavaScript untuk probability-based design.
Kesimpulan: Pilih Tools yang Tepat untuk Problem yang Tepat
CSS random() adalah addition yang powerful untuk developer toolkit.
Tapi seperti semua tools, efektivitasnya tergantung pada use case.
Untuk static variation, decorative elements, dan visual noise, CSS random unggul dalam simplicity dan performance.
Untuk stateful logic, complex distribution, dan interactive randomness, JavaScript tetap champion.
Best practice? Gunakan keduanya secara strategic. CSS untuk apa yang nggak butuh update, JavaScript untuk apa yang butuh intelligence.
Feature detection dan progressive enhancement memastikan website kamu accessible di semua browser sambil leverage cutting-edge features di browser modern.
CSS random() bukan replacement untuk JavaScript. Ini adalah complement yang membuat workflow developer lebih efficient dan result lebih performant.
Sekarang giliran kamu explore dan experiment. Build something random, something generative, something yang nggak bisa dibuat sebelumnya tanpa heavy JavaScript.
That's the power of native CSS randomness.