Panduan lengkap CSS Houdini untuk memperluas kemampuan CSS dengan JavaScript
CSS Houdini adalah kumpulan API yang memungkinkan pengembang untuk memperluas CSS dengan JavaScript, memberikan kontrol lebih besar atas rendering dan animasi.
/* Custom Properties and Values API */
CSS.registerProperty({
name: '--gradient-angle',
syntax: '<angle>',
initialValue: '0deg',
inherits: false
});
/* Paint API */
CSS.paintWorklet.addModule('paint-worklet.js');
/* Layout API */
CSS.layoutWorklet.addModule('layout-worklet.js');
/* Animation Worklet */
CSS.animationWorklet.addModule('animation-worklet.js');
đ Penjelasan Detail:
âĸ CSS.registerProperty
- Mendaftarkan properti kustom dengan tipe dan nilai awal
âĸ CSS.paintWorklet
- Paint API untuk menggambar elemen secara dinamis
âĸ CSS.layoutWorklet
- Layout API untuk membuat layout kustom
âĸ CSS.animationWorklet
- Animation Worklet untuk animasi performa tinggi
/* Custom Paint Worklet */
.custom-background {
background: paint(checkerboard);
}
/* Custom Properties */
:root {
--gradient-angle: 45deg;
--gradient-colors: #9333ea, #a855f7;
}
/* Custom Layout Worklet */
.custom-layout {
display: layout(masonry);
}
/* Animation Worklet */
.animated-element {
animation: scroll 1s linear infinite;
}
CSS Houdini didukung sebagian di Chrome 78+, Edge 79+, dan Opera 65+. Firefox dan Safari memiliki dukungan terbatas (per 2023).
/* Properties and Values API */
syntax: '<length>' /* Nilai panjang */
syntax: '<color>' /* Nilai warna */
syntax: '<angle>' /* Nilai sudut */
syntax: '<percentage>' /* Nilai persentase */
/* Paint API */
paint() /* Fungsi untuk menggambar */
registerPaint() /* Mendaftarkan paint worklet */
/* Layout API */
layout() /* Fungsi untuk layout kustom */
registerLayout() /* Mendaftarkan layout worklet */
đ Penjelasan Detail:
âĸ Properties and Values API - Mendefinisikan properti kustom dengan tipe data spesifik
âĸ Paint API - Menggambar elemen secara dinamis dengan JavaScript
âĸ Layout API - Membuat layout kustom seperti masonry grid
âĸ Animation Worklet - Animasi performa tinggi di thread terpisah
/* Complex Paint Worklet */
registerPaint('gradient-border', class {
paint(ctx, size, props) {
const angle = props.get('--gradient-angle').value;
const colors = props.get('--gradient-colors').toString().split(',');
const gradient = ctx.createLinearGradient(...);
ctx.fillStyle = gradient;
ctx.fillRect(0, 0, size.width, size.height);
}
});
/* Custom Layout Worklet */
registerLayout('masonry', class {
layout(children, edges, constraints, styleMap) {
// Custom layout logic here
}
});
/* Animation Worklet */
registerAnimator('scroll', class {
animate(currentTime, effect) {
// Animation logic here
}
});
Fitur lanjutan seperti Paint API dan Layout API memerlukan Chrome 78+ dengan flag experimental Web Platform Features.
Gunakan CSS Houdini untuk kasus yang memerlukan kontrol tingkat rendah. Hindari penggunaan berlebihan untuk menjaga performa.
/* â
Good - Simple Paint Worklet */
registerPaint('checkerboard', class {
paint(ctx, size) {
const tileSize = 20;
for (let y = 0; y < size.height; y +=tileSize) {
for (let x = 0; x < size.width; x +=tileSize) {
const color = (x + y) % (tileSize * 2) === 0 ? '#9333ea' : '#a855f7';
ctx.fillStyle = color;
ctx.fillRect(x, y, tileSize, tileSize);
}
}
}
});
/* â Avoid - Overusing Houdini */
* {
background: paint(complex-effect);
display: layout(custom);
animation: scroll 1s linear infinite;
}
đ Penjelasan Detail:
âĸ Gunakan dengan bijak - Hanya untuk kasus yang memerlukan kontrol tingkat rendah
âĸ Optimasi performa - Hindari komputasi berat di worklet
âĸ Sediakan fallback - Pastikan situs tetap berfungsi tanpa Houdini
âĸ Test di berbagai browser - Dukungan browser masih terbatas
âĸ Gunakan polyfill - Untuk browser yang belum mendukung