Selector
Selector Dasar
*Universal — semua elemen
divTipe — semua elemen
.classClass — elemen dengan class
#idID — elemen dengan id
[attr]Atribut — memiliki atribut
[attr="val"]Atribut sama dengan nilai
Kombinator
A BKeturunan (kedalaman berapa pun)
A > BAnak langsung saja
A + BSibling bersebelahan (berikutnya)
A ~ BSibling umum (semua setelahnya)
Pseudo-class
:hoverMouse di atas elemen
:focusElemen mendapat fokus
:first-childAnak pertama dari parent
:nth-child(n)Anak ke-n (1-based, odd, even, 2n+1)
:not(sel)Negasi — kecualikan yang cocok
:has(sel)Selector parent (mengandung yang cocok)
Pseudo-element
::beforeSisipkan konten sebelum elemen
::afterSisipkan konten setelah elemen
::placeholderGaya teks placeholder input
::selectionGaya teks yang disorot
Box Model
Box Sizing
/* Include padding/border in width */ *, *::before, *::after { box-sizing: border-box; }
Properti
marginRuang di luar border
borderTepi di sekitar padding
paddingRuang di dalam border
width / heightDimensi konten
outlineRing di luar margin (tanpa ruang)
Shorthand
margin: 10px; /* all sides */ margin: 10px 20px; /* vertical | horizontal */ margin: 10px 20px 30px; /* top | horiz | bottom */ margin: 10px 20px 30px 40px; /* T R B L */
Flexbox
Container
.flex { display: flex; justify-content: center; /* main axis */ align-items: center; /* cross axis */ gap: 1rem; }
Properti Container
flex-directionrow | column | row-reverse | column-reverse
flex-wrapnowrap | wrap | wrap-reverse
justify-contentflex-start | center | space-between | space-around | space-evenly
align-itemsstretch | center | flex-start | flex-end | baseline
align-contentPerataan sumbu silang multi-baris
gapJarak antar item flex
Properti Item
flex: 1Tumbuh mengisi ruang yang tersedia
flex: 0 0 200pxLebar tetap, tidak tumbuh/menyusut
align-selfOverride align-items untuk satu item
orderUbah urutan visual (default 0)
Grid
Container
.grid { display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: auto 1fr auto; gap: 1rem; }
Properti Container
grid-template-columnsDefinisikan kolom: 1fr 2fr, repeat(3, 1fr)
grid-template-rowsDefinisikan baris
grid-template-areasArea bernama: "header header" "nav main"
gapJarak antar baris dan kolom
justify-itemsPerataan item horizontal
align-itemsPerataan item vertikal
Penempatan Item
.item { grid-column: 1 / 3; /* span cols 1-2 */ grid-row: 1 / -1; /* span all rows */ grid-area: header; /* named area */ }
Tipografi
Properti Font
font-familyStack typeface: 'Inter', sans-serif
font-sizeUkuran: 1rem, 16px, clamp(1rem, 2vw, 2rem)
font-weightnormal (400) | bold (700) | 100-900
font-stylenormal | italic | oblique
line-heightSpasi baris: 1.5 (tanpa satuan direkomendasikan)
letter-spacingSpasi karakter: 0.05em
Properti Teks
text-alignleft | center | right | justify
text-decorationnone | underline | line-through
text-transformuppercase | lowercase | capitalize
text-overflowellipsis (dengan overflow: hidden)
white-spacenowrap | pre | pre-wrap
word-breakbreak-all | break-word
Warna & Background
Format Warna
color: #ff6600; /* hex */ color: rgb(255, 102, 0); /* rgb */ color: hsl(24, 100%, 50%); /* hsl */ color: oklch(70% 0.15 50); /* oklch */
Properti Background
background-colorWarna solid: #f0f0f0
background-imageurl(img.jpg) atau gradient
background-sizecover | contain | 100px 200px
background-positioncenter | top right | 50% 50%
background-repeatno-repeat | repeat-x | repeat-y
Gradient
background: linear-gradient(to right, #f00, #00f); background: radial-gradient(circle, #fff, #000); background: conic-gradient(red, yellow, green);
Transisi & Animasi
Transisi
.btn { transition: background 0.3s ease, transform 0.2s; } .btn:hover { background: #0056b3; transform: scale(1.05); }
Properti Transisi
transition-propertyProperti mana yang dianimasikan
transition-durationDurasi: 0.3s, 300ms
transition-timing-functionease | linear | ease-in-out | cubic-bezier()
transition-delayTunggu sebelum mulai
Animasi Keyframe
@keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } .icon { animation: spin 1s linear infinite; }
Properti Animasi
animation-nameReferensi nama @keyframes
animation-durationDurasi satu siklus
animation-iteration-count1 | 3 | infinite
animation-directionnormal | alternate | reverse
animation-fill-modeforwards | backwards | both
Desain Responsif
Media Query
@media (max-width: 768px) { .sidebar { display: none; } } @media (prefers-color-scheme: dark) { body { background: #1a1a1a; color: #eee; } }
Breakpoint Umum
max-width: 480pxPonsel
max-width: 768pxTablet
max-width: 1024pxLaptop kecil
max-width: 1280pxDesktop
Satuan Viewport
vw / vh% lebar / tinggi viewport
dvhTinggi viewport dinamis (aman untuk mobile)
svh / lvhTinggi viewport kecil / besar
cqiUkuran inline container query
Container Query
.card-wrapper { container-type: inline-size; } @container (min-width: 400px) { .card { flex-direction: row; } }
Positioning
Nilai Position
staticDefault — alur dokumen normal
relativeOffset dari posisi normal; tetap mengisi ruang
absoluteRelatif terhadap ancestor yang ter-position
fixedRelatif terhadap viewport; tetap saat scroll
stickyBerganti relative/fixed berdasarkan scroll
Pola Centering
/* Flex center */ display: flex; justify-content: center; align-items: center; /* Grid center */ display: grid; place-items: center;
Stacking
z-indexUrutan tumpukan (lebih tinggi = di atas); butuh position
isolation: isolateMembuat stacking context baru
Custom Properties
Definisi & Penggunaan
:root { --color-primary: #3b82f6; --spacing-md: 1rem; } .btn { background: var(--color-primary); padding: var(--spacing-md); }
Nilai Fallback
color: var(--accent, #ff6600); /* uses #ff6600 if --accent is not defined */
Theming Dinamis
[data-theme="dark"] { --bg: #1a1a2e; --text: #e0e0e0; } body { background: var(--bg); color: var(--text); }