Table of Contents
▼- Kenapa Lazy Loading Wajib Ada di Website Modern?
- Native Lazy Loading untuk Gambar dan Iframe
- Kapan Harus Pakai JavaScript Lazy Loading?
- Implementasi Lazy Loading dengan Intersection Observer
- Lazy Loading untuk Background Images CSS
- Implementasi Progressive Image Loading
- Lazy Loading untuk Video
- Lazy Loading Komponen React dan Vue
- Lazy Loading untuk Route/Page Splitting
- Best Practices Lazy Loading yang Harus Diikuti
- Lazy Loading dengan Library Modern
- Measuring Lazy Loading Impact
- Common Pitfalls dan Cara Menghindarinya
- Advanced: Adaptive Lazy Loading
- Kesimpulan
Website yang lambat adalah musuh terbesar bisnis online di 2026. Setiap detik loading bisa bikin pengunjung kabur ke kompetitor.
Lazy loading adalah teknik yang bikin website cuma load konten yang terlihat di layar. Sisanya? Baru dimuat saat user scroll ke bawah.
Teknik ini bisa bikin website kamu 10x lebih cepat, terutama kalau punya banyak gambar atau video. Google juga suka website yang implement lazy loading karena Core Web Vitals jadi jauh lebih baik.
Di artikel ini, kamu akan belajar cara implementasi lazy loading yang benar untuk berbagai jenis konten. Dari yang paling simpel sampai advanced.
Kenapa Lazy Loading Wajib Ada di Website Modern?
Bayangin kamu punya landing page dengan 50 gambar produk. Tanpa lazy loading, browser harus download semua 50 gambar sekaligus, meskipun user cuma lihat 5 gambar pertama.
Ini yang terjadi:
- Initial load time jadi sangat lambat
- Bandwidth terbuang percuma untuk konten yang belum dilihat
- User dengan koneksi lambat langsung frustrasi
- Google kasih ranking lebih rendah karena performa jelek
Dengan lazy loading, browser cuma load 5 gambar yang terlihat. Sisanya baru dimuat saat user scroll.
Hasilnya? Initial load time turun drastis, bandwidth hemat, user happy, Google senang.
Native Lazy Loading untuk Gambar dan Iframe
Kabar baik: browser modern udah support lazy loading secara native. Kamu cuma perlu tambah satu atribut.
Ini cara paling mudah dan recommended untuk gambar:
<img src="produk-1.jpg" alt="Produk 1" loading="lazy">Yup, cuma tambah loading="lazy" dan browser otomatis handle lazy loading untuk kamu.
Browser support untuk atribut ini sudah sangat baik di 2026. Chrome, Firefox, Safari, Edge semuanya support.
Untuk iframe (seperti embed YouTube atau Google Maps), cara yang sama juga berlaku:
<iframe src="https://www.youtube.com/embed/VIDEO_ID"
loading="lazy"
title="Video Tutorial">
</iframe>Native lazy loading ini adalah pilihan terbaik karena ringan, tidak butuh JavaScript tambahan, dan performanya optimal.
Kapan Harus Pakai JavaScript Lazy Loading?
Ada kalanya native lazy loading tidak cukup. Kamu butuh JavaScript library untuk kasus-kasus ini:
- Support browser lama yang belum implement native lazy loading
- Butuh kontrol lebih detail tentang kapan konten dimuat
- Lazy load komponen kompleks seperti carousel atau infinite scroll
- Implementasi fade-in effect saat konten dimuat
Salah satu library paling populer adalah Intersection Observer API. Ini adalah JavaScript API modern yang sangat efisien.
Implementasi Lazy Loading dengan Intersection Observer
Intersection Observer memantau kapan suatu element masuk ke viewport browser. Ini cara kerjanya:
// HTML
<img data-src="gambar-besar.jpg" alt="Produk" class="lazy">
// JavaScript
const lazyImages = document.querySelectorAll('.lazy');
const imageObserver = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
img.classList.remove('lazy');
observer.unobserve(img);
}
});
});
lazyImages.forEach(image => {
imageObserver.observe(image);
});Perhatikan kita pakai data-src bukan src di HTML. Ini mencegah browser langsung load gambar.
Saat gambar masuk viewport, JavaScript baru pindahin URL dari data-src ke src, dan browser mulai download gambar.
Kamu juga bisa atur threshold untuk load lebih awal:
const imageObserver = new IntersectionObserver((entries, observer) => {
// ... kode yang sama
}, {
rootMargin: '50px' // Load 50px sebelum masuk viewport
});Dengan rootMargin, gambar sudah mulai load sedikit sebelum user sampai ke gambar tersebut. User experience jadi lebih smooth.
Lazy Loading untuk Background Images CSS
Background image di CSS tidak bisa pakai atribut loading="lazy". Kamu harus pakai teknik berbeda.
Cara terbaik adalah pakai class switching:
/* CSS */
.hero {
background-image: url('placeholder.jpg');
min-height: 500px;
}
.hero.loaded {
background-image: url('hero-image-large.jpg');
}
/* JavaScript */
const hero = document.querySelector('.hero');
const heroObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('loaded');
heroObserver.unobserve(entry.target);
}
});
});
heroObserver.observe(hero);Teknik ini load placeholder dulu (gambar kecil atau low-quality), baru load gambar full quality saat element terlihat.
Implementasi Progressive Image Loading
Progressive loading adalah teknik yang load gambar blur dulu, kemudian gradually jadi sharp. Instagram dan Medium pakai teknik ini.
Cara kerjanya:
<div class="progressive-image">
<img src="thumbnail-blur.jpg"
data-large="image-full.jpg"
alt="Produk"
class="lazy-progressive">
</div>/* CSS */
.progressive-image {
position: relative;
overflow: hidden;
}
.progressive-image img {
width: 100%;
transition: filter 0.3s;
filter: blur(10px);
}
.progressive-image img.loaded {
filter: blur(0);
}
/* JavaScript */
const progressiveImages = document.querySelectorAll('.lazy-progressive');
progressiveImages.forEach(img => {
const largeImage = new Image();
largeImage.src = img.dataset.large;
largeImage.onload = () => {
img.src = largeImage.src;
img.classList.add('loaded');
};
});User langsung lihat preview blur saat page load, kemudian gambar gradually jadi clear. Ini kasih feedback visual yang bagus dan bikin perceived performance lebih baik.
Lazy Loading untuk Video
Video adalah content yang paling berat. Lazy loading video bisa hemat bandwidth sangat signifikan.
Untuk video HTML5:
<video controls preload="none" poster="thumbnail.jpg" data-src="video.mp4">
<source data-src="video.mp4" type="video/mp4">
</video>Pakai preload="none" untuk cegah browser auto-load video. Tambah poster untuk kasih preview thumbnail.
Kemudian pakai Intersection Observer seperti gambar:
const lazyVideos = document.querySelectorAll('video[data-src]');
const videoObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const video = entry.target;
const source = video.querySelector('source');
source.src = source.dataset.src;
video.src = video.dataset.src;
video.load();
videoObserver.unobserve(video);
}
});
});
lazyVideos.forEach(video => videoObserver.observe(video));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.
Lazy Loading Komponen React dan Vue
Kalau kamu pakai React atau Vue, lazy loading komponen bisa dramatically reduce initial bundle size.
Di React, pakai React.lazy() dan Suspense:
import React, { Suspense, lazy } from 'react';
const HeavyComponent = lazy(() => import('./HeavyComponent'));
function App() {
return (
<div>
<Suspense fallback={<div>Loading...</div>}>
<HeavyComponent />
</Suspense>
</div>
);
}Component baru di-load saat pertama kali dirender. Ini sangat berguna untuk component yang jarang dipakai atau ada di bawah fold.
Di Vue 3, cara yang sama juga sangat mudah:
import { defineAsyncComponent } from 'vue';
const HeavyComponent = defineAsyncComponent(() =>
import('./components/HeavyComponent.vue')
);
export default {
components: {
HeavyComponent
}
};Lazy Loading untuk Route/Page Splitting
Selain komponen individual, kamu juga bisa lazy load entire pages atau routes.
Di React Router:
import { lazy, Suspense } from 'react';
import { BrowserRouter, Routes, Route } from 'react-router-dom';
const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));
const Products = lazy(() => import('./pages/Products'));
function App() {
return (
<BrowserRouter>
<Suspense fallback={<div>Loading page...</div>}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/products" element={<Products />} />
</Routes>
</Suspense>
</BrowserRouter>
);
}Setiap page jadi separate bundle. User cuma download page yang mereka kunjungi.
Kalau kamu punya 10 pages dan setiap page 200KB, tanpa lazy loading user harus download 2MB. Dengan lazy loading, mungkin cuma 200KB untuk initial load.
Best Practices Lazy Loading yang Harus Diikuti
Lazy loading powerful, tapi kalau salah implement bisa jadi masalah. Ikuti best practices ini:
1. Jangan lazy load konten above the fold
Konten yang langsung terlihat saat page load jangan di-lazy load. Ini malah bikin Largest Contentful Paint (LCP) jadi lambat.
Load normal untuk hero image, header, dan konten pertama. Lazy load baru mulai dari konten yang below the fold.
2. Kasih placeholder atau skeleton screen
Jangan biarkan area kosong saat konten loading. Kasih visual feedback pakai placeholder atau skeleton screen.
.image-placeholder {
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
background-size: 200% 100%;
animation: loading 1.5s infinite;
}
@keyframes loading {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}3. Set width dan height untuk prevent layout shift
Saat gambar lazy load, kalau tidak ada width/height yang defined, layout bisa shift dan bikin Cumulative Layout Shift (CLS) jelek.
<img src="image.jpg"
width="800"
height="600"
loading="lazy"
alt="Product">Atau pakai CSS aspect ratio:
.image-container {
aspect-ratio: 16 / 9;
width: 100%;
}
.image-container img {
width: 100%;
height: 100%;
object-fit: cover;
}4. Preload critical resources
Untuk resource penting yang akan segera dibutuhkan, pakai preload untuk hint ke browser:
<link rel="preload" as="image" href="hero-image.jpg">5. Test di koneksi lambat
Pakai Chrome DevTools untuk throttle koneksi ke "Slow 3G" dan test user experience. Pastikan loading state jelas dan tidak ada blank areas yang membingungkan.
Lazy Loading dengan Library Modern
Kalau mau implementasi yang lebih robust tanpa coding dari nol, ada beberapa library excellent:
1. LazySizes
Library paling populer dengan 17k+ stars di GitHub. Sangat lightweight (3.4KB gzipped) dan zero configuration.
<script src="lazysizes.min.js" async></script>
<img data-src="image.jpg" class="lazyload" alt="Product">Sudah include automatic size calculation, responsive images support, dan plugin system.
2. Lozad.js
Minimal library yang pakai Intersection Observer. Cuma 1.9KB dan very performant.
const observer = lozad('.lozad', {
loaded: function(el) {
el.classList.add('fade-in');
}
});
observer.observe();3. Vanilla LazyLoad
Modern library dengan support untuk responsive images, background images, dan video. 2.5KB gzipped.
const lazyLoad = new LazyLoad({
elements_selector: ".lazy",
threshold: 0
});Measuring Lazy Loading Impact
Setelah implement lazy loading, measure impact-nya pakai tools ini:
Google PageSpeed Insights
Check Core Web Vitals terutama LCP dan CLS. Lazy loading yang benar harus improve kedua metrics ini.
Chrome DevTools Network Tab
Lihat berapa request yang di-trigger saat initial load vs saat scroll. Initial load harus significantly lebih sedikit.
WebPageTest
Test dari multiple locations dengan berbagai connection speeds. Lihat time to interactive dan total page size.
Real User Monitoring (RUM)
Pakai tools seperti Google Analytics 4 atau custom RUM untuk track real user metrics. Ini lebih akurat dari lab tests.
Common Pitfalls dan Cara Menghindarinya
Pitfall 1: SEO Impact
Search engine bots mungkin tidak execute JavaScript. Kalau gambar penting buat SEO di-lazy load pakai JavaScript, Google mungkin tidak index.
Solusi: Pakai native lazy loading untuk content yang SEO-critical, atau implement server-side rendering.
Pitfall 2: Infinite Scroll Issues
Lazy loading di infinite scroll bisa cause memory leak kalau tidak proper cleanup.
Solusi: Unobserve elements setelah loaded dan cleanup observers saat component unmount.
Pitfall 3: Content Jumping
Layout shift saat content loads bisa bikin user accidentally click wrong thing.
Solusi: Always set dimensions atau aspect ratio. Pakai skeleton screens untuk reserve space.
Advanced: Adaptive Lazy Loading
Di 2026, kita bisa bikin lazy loading yang adaptive based on user's connection dan device.
// Check network quality
const connection = navigator.connection ||
navigator.mozConnection ||
navigator.webkitConnection;
let loadThreshold = 50; // default
if (connection) {
if (connection.effectiveType === '4g') {
loadThreshold = 100; // Load lebih agresif
} else if (connection.effectiveType === '2g' ||
connection.effectiveType === 'slow-2g') {
loadThreshold = 0; // Load hanya saat visible
}
}
const observer = new IntersectionObserver(callback, {
rootMargin: `${loadThreshold}px`
});Check juga kalau user enable data saver mode:
if (connection && connection.saveData) {
// User wants to save data
// Load only when absolutely necessary
loadThreshold = 0;
}Kesimpulan
Lazy loading adalah teknik fundamental untuk website modern yang fast dan efficient.
Mulai dari native lazy loading yang simpel, sampai advanced techniques dengan Intersection Observer dan adaptive loading, semua bisa dramatically improve user experience.
Key takeaways:
- Pakai native
loading="lazy"untuk gambar dan iframe sebagai baseline - Implement Intersection Observer untuk kontrol lebih detail
- Jangan lazy load konten above the fold
- Always set dimensions untuk prevent layout shift
- Test di real conditions dengan slow connections
- Measure impact dengan PageSpeed Insights dan RUM
Website yang load cepat bukan luxury, tapi necessity. User expect instant gratification, dan Google reward fast websites dengan better rankings.
Implement lazy loading hari ini dan lihat perbedaan dramatic di metrics dan user satisfaction.