Memuat...
👋 Selamat Pagi!

Cara Pakai CSS random() untuk Variasi Visual Tanpa JavaScript

Fungsi random() di CSS native kini bisa bikin layout organik dan variasi visual tanpa JavaScript. Tutorial lengkap dengan contoh nyata untuk developer UI Indone...

Cara Pakai CSS random() untuk Variasi Visual Tanpa JavaScript

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:

  1. Inisialisasi elemen di HTML
  2. Loop pakai JavaScript untuk generate nilai random
  3. Inject nilai tersebut sebagai inline style atau CSS variable
  4. 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!

Ajie Kusumadhany
Written by

Ajie Kusumadhany

Founder & Lead Developer KerjaKode. Berpengalaman dalam pengembangan web modern dengan Laravel, React.js, Vue.js, dan teknologi terkini. Passionate tentang coding, teknologi, dan berbagi pengetahuan melalui artikel.

Promo Spesial Hari Ini!

10% DISKON

Promo berakhir dalam:

00 Jam
:
00 Menit
:
00 Detik
Klaim Promo Sekarang!

*Promo berlaku untuk order hari ini

0
User Online
Halo! 👋
Kerjakode Support Online
×

👋 Hai! Pilih layanan yang kamu butuhkan:

Chat WhatsApp Sekarang