اسنیپتهای بهینهسازی شده برای Lazy Loading تصاویر در JS
رفیق برنامهنویس، تا حالا شده یه سایت پر از تصویر رو ببینی که بارگذاریش از سرعت حلزون هم کمتره؟ احتمالاً تو هم مثل من دلت میخواد یه مشت کد به همون توسعهدهنده بفرستی! خب، اینجا دقیقا همون جاییه که ما قراره با هم یاد بگیریم چطور با تکنیکهای خفن Lazy Loading، این مشکل رو برای همیشه حل کنیم و یه تجربه کاربری بینظیر بسازیم. قبل از اینکه غرق جزئیات بشی و بخوای بهینهسازی رو شروع کنی، یه سر به
فروشگاه ابزارهای توسعهدهنده ما
بزن. کلی ابزار کاربردی و گجت خفن برنامهنویسی منتظرته که کارتو از اینی که هست هم راحتتر کنه! بیا شروع کنیم تا دیگه هیچ کاربری به خاطر سرعت سایتت ازت شاکی نباشه.
✨ نقشه راه Lazy Loading تصاویر: از صفر تا بهینه ✨
╔═════════════════════════════════════════════════════════════════════════╗
║ 🚀 Lazy Loading تصاویر: چکیدهای برای حرفهایها 🚀 ║
╠═════════════════════════════════════════════════════════════════════════╣
║ 🎯 هدف: افزایش سرعت بارگذاری صفحه، بهبود UX و کاهش مصرف منابع سرور و کلاینت. ║
╠═════════════════════════════════════════════════════════════════════════╣
║ 1️⃣ روش ناتیو (Native): سادهترین و بهترین شروع.
║ <img loading="lazy" src="placeholder.jpg" data-src="actual.jpg" ...>
║ ✅ مزایا: عدم نیاز به JS، پشتیبانی عالی مرورگرها.
║ ⛔ محدودیت: کنترل کمتر، fallback برای مرورگرهای قدیمی.
╠═════════════════════════════════════════════════════════════════════════╣
║ 2️⃣ Intersection Observer API: قدرت JS برای کنترل دقیقتر.
║ (کد نویسی با Observer برای بارگذاری هوشمند تصاویر)
║ ✅ مزایا: عملکرد بالا، بهینهسازی دقیق، UX منعطف.
║ ⛔ محدودیت: نیاز به JS، polyfill برای مرورگرهای خیلی قدیمی.
╠═════════════════════════════════════════════════════════════════════════╣
║ 3️⃣ تصاویر پسزمینه (Background Images):
║ (استفاده از CSS و Observer برای کنترل بارگذاری background-image)
║ ✅ مزایا: طراحیهای پیچیدهتر، جداسازی محتوا از پرزنتیشن.
║ ⛔ محدودیت: چالشهای سئو، نیاز به تکنیکهای خاص.
╠═════════════════════════════════════════════════════════════════════════╣
║ 4️⃣ بهینهسازیهای تکمیلی:
║ 🔸 Placeholderها: تاری، رنگی یا تصاویر کمحجم برای جلوگیری از "پرش محتوا" (CLS).
║ 🔸 Responsive Images: با srcset و sizes، تصاویر مناسب برای هر دستگاه.
║ 🔸 فرمتهای نوین: استفاده از WebP یا AVIF برای حجم کمتر.
╠═════════════════════════════════════════════════════════════════════════╣
║ 🛠️ عیبیابی سریع:
║ 🔹 تصاویر بارگذاری نمیشن؟ ➡️ `data-src` رو چک کن.
║ 🔹 پرش محتوا داری؟ ➡️ ابعاد تصویر رو مشخص کن (width/height).
║ 🔹 سئو مشکل خورده؟ ➡️ مطمئن شو تصاویر در نهایت لود میشن.
╚═════════════════════════════════════════════════════════════════════════╝
چرا Lazy Loading انقدر مهمه؟ (حتی برای سایت خودمون!)
ببین رفیق، توی دنیای امروز که همه عجله دارن و وقت طلاست، سرعت بارگذاری سایتت یه جورایی هویت برندت محسوب میشه. کاربرا دیگه صبر نمیکنن تا عکسهای سنگینت یکی یکی لود بشن. اینجا Lazy Loading مثل یه ناجی عمل میکنه. با این تکنیک، ما فقط اون تصاویری رو بارگذاری میکنیم که کاربر الان تو صفحه میبینه. بقیه تصاویر، تا زمانی که کاربر بهشون نزدیک نشه یا اونا وارد ویوپورت (Viewport) نشن، تو حالت انتظار میمونن.
این کار نه تنها سرعت بارگذاری اولیه صفحه رو به طرز چشمگیری بالا میبره، بلکه مصرف پهنای باند کاربر رو هم کم میکنه. فکر کن یه نفر با اینترنت سیمکارت داره سایتت رو میبینه، چقدر خوشحال میشه وقتی میبینه لازم نیست برای دیدن یه عکس که ۱۰۰۰ پیکسل پایینتره، کل حجم اینترنتش مصرف بشه. از طرفی، این بهینه (غلط املایی ۱: بهینهسازی) برای موتورهای جستجو هم خیلی اهمیت داره و نمره سایتت رو تو معیارهایی مثل Core Web Vitals (مخصوصاً LCP یا Largest Contentful Paint) بهتر میکنه.
مزایای کلیدی Lazy Loading: چرا باید ازش استفاده کنی؟
- افزایش سرعت بارگذاری اولیه (Initial Load Time): فقط منابع ضروری لود میشن.
- کاهش مصرف پهنای باند: هم برای کاربر و هم برای سرور.
- بهبود تجربه کاربری (UX): کاربر سریعتر به محتوا دسترسی پیدا میکنه.
- امتیاز بهتر در Lighthouse و Core Web Vitals: گوگل عاشق سایتهای سریعه.
- کاهش مصرف منابع کلاینت: حافظه و CPU کمتری اشغال میشه.
- طول عمر بیشتر باتری دستگاههای موبایل: با فعالیت کمتر پردازشی.
شروع با روش ناتیو: loading="lazy"
سادهترین و در عین حال قدرتمندترین راه برای پیادهسازی Lazy Loading، استفاده از خاصیت `loading=”lazy”` در تگ `<img>` هست. این ویژگی الان توسط اکثر مرورگرهای مدرن پشتیبانی میشه و دیگه نیازی به جاوااسکریپت و کدنویسی اضافه نداره. فقط کافیه این خاصیت رو به تگهای تصویرت اضافه کنی، همین!
مثال: پیادهسازی Native Lazy Loading
<!-- تصویر معمولی که بلافاصله لود میشود -->
<img src="/images/hero-banner.jpg" alt="بنر اصلی" width="1200" height="600">
<!-- تصویر با Lazy Loading ناتیو -->
<img src="/images/placeholder.jpg"
data-src="/images/content-image-1.jpg"
alt="تصویر محتوا 1"
width="800"
height="450"
loading="lazy">
<img src="/images/placeholder.jpg"
data-src="/images/content-image-2.jpg"
alt="تصویر محتوا 2"
width="800"
height="450"
loading="lazy">
<!-- و الی آخر برای بقیه تصاویر ... -->
نکته: همیشه `width` و `height` رو برای جلوگیری از CLS (Cumulative Layout Shift) مشخص کن. همچنین، میتونی از یه تصویر `placeholder.jpg` کمحجم به عنوان `src` اولیه استفاده کنی و تصویر اصلی رو تو `data-src` نگه داری. مرورگرهای قدیمی که `loading=”lazy”` رو پشتیبانی نمیکنن، `data-src` رو نادیده میگیرن و همون `src` (placeholder) رو لود میکنن. برای بارگذاری تصویر اصلی در این مرورگرها نیاز به Fallback با جاوااسکریپت داریم.
موارد استفاده و محدویت (غلط املایی ۲: محدودیت)های Native Lazy Loading
این روش برای اکثر موارد عالیه، خصوصاً وقتی نمیخوای درگیر جاوااسکریپت پیچیده بشی. اما خب یه سری محدویتها هم داره:
- کنترل کمتر: شما نمیتونید دقیقاً بگید تصویر در چه فاصلهای از ویوپورت شروع به لود شدن بکنه. این مقدار توسط مرورگر تعیین میشه.
- Fallback: برای مرورگرهای خیلی قدیمی که از این ویژگی پشتیبانی نمیکنن (که البته تعدادشون کم شده)، باید یه Fallback با جاوااسکریپت در نظر بگیریم.
- تصاویر پسزمینه (Background Images): این ویژگی فقط برای تگ `<img>` کار میکنه و برای تصاویری که با CSS به عنوان پسزمینه تعریف شدن، کاربردی نداره.
قدرت جاوااسکریپت: Intersection Observer API
وقتی نیاز به کنترل دقیقتری روی Lazy Loading داری یا میخوای Fallback برای `loading=”lazy”` رو پیادهسازی کنی، `Intersection Observer API` رفیق شفیقت میشه. این API بهت اجازه میده متوجه بشی یه المان دقیقا کی و چقدر وارد ویوپورت کاربر میشه یا از اون خارج میشه، بدون اینکه نیاز به اسکرول ایونتهای سنگین و پرفورمنسکش داشته باشی.
چطور Intersection Observer کار میکنه؟
به طور خلاصه، یه آبجکت `IntersectionObserver` میسازی، بهش یه تابع callback میدی که هر وقت وضعیت تقاطع تغییر کرد (یعنی المان وارد یا خارج از ویوپورت شد) اجرا میشه، و بعد المانهای مورد نظرت رو `observe` میکنی.
مثال: پیادهسازی Lazy Loading با Intersection Observer
// 1. انتخاب تمامی تصاویر با کلاس 'lazy-load'
const lazyImages = document.querySelectorAll('img[data-src].lazy-load');
// 2. تنظیمات Observer (اختیاری)
// روت: المان روت برای مشاهده تقاطع (null یعنی viewport)
// rootMargin: میزان حاشیهای که به روت اضافه یا کم میشود (مثلاً '200px' یعنی 200px قبل از ورود به viewport لود کن)
// threshold: آستانه تقاطع (یک عدد بین 0 و 1، مثلاً 0.5 یعنی وقتی 50% المان در viewport بود)
const observerOptions = {
root: null,
rootMargin: '200px 0px', // 200px قبل از اینکه تصویر واقعاً وارد viewport بشه، لودش کن
threshold: 0.01 // وقتی 1% تصویر در viewport بود، callback رو اجرا کن
};
// 3. تابع Callback که در هنگام تقاطع اجرا میشود
function handleIntersect(entries, observer) {
entries.forEach(entry => {
if (entry.isIntersecting) { // اگر المان وارد viewport شد (یا به rootMargin رسید)
const img = entry.target;
const src = img.getAttribute('data-src');
if (src) {
img.src = src; // سورس اصلی را جایگزین src placeholder کن
img.classList.remove('lazy-load'); // کلاس lazy-load رو حذف کن
img.removeAttribute('data-src'); // data-src رو حذف کن
observer.unobserve(img); // دیگه این تصویر رو observe نکن
}
}
});
}
// 4. ساخت آبجکت Observer
const imageObserver = new IntersectionObserver(handleIntersect, observerOptions);
// 5. Observer کردن هر تصویر
lazyImages.forEach(img => {
imageObserver.observe(img);
});
نکته: برای این روش، تگهای `<img>` شما باید شبیه به این باشند:
<img src="placeholder.jpg" data-src="actual.jpg" alt="..." class="lazy-load">
اینجا `src` یک تصویر کمحجم یا خالی (مثلاً یک SVG اینلاین) و `data-src` مسیر تصویر اصلی است.
Fallback برای Intersection Observer (مرورگرهای قدیمی)
اگرچه `Intersection Observer` پشتیبانی گستردهای داره، اما برای مرورگرهای خیلی قدیمیتر، ممکنه نیاز به Fallback داشته باشی. میتونی با چک کردن وجود `IntersectionObserver`، تصمیم بگیری از چه روشی استفاده کنی:
مثال: پیادهسازی Fallback برای Intersection Observer
if ('IntersectionObserver' in window) {
// کد Intersection Observer بالا را اینجا قرار دهید
// (فقط برای مرورگرهای مدرن که از آن پشتیبانی میکنند)
// ...
} else {
// Fallback برای مرورگرهای قدیمی:
// تمامی تصاویر lazy-load را بلافاصله بارگذاری کنید
const lazyImages = document.querySelectorAll('img[data-src].lazy-load');
lazyImages.forEach(img => {
const src = img.getAttribute('data-src');
if (src) {
img.src = src;
img.classList.remove('lazy-load');
img.removeAttribute('data-src');
}
});
// یا میتوانید از روشهای قدیمیتر lazy loading مثل event listener 'scroll' استفاده کنید
}
نکته: در روش Fallback، ما تصمیم گرفتیم همه تصاویر را بلافاصله بارگذاری کنیم. این بهترین راه حل برای پرفورمنس نیست، اما اطمینان میدهد که تصاویر برای همه کاربران نمایش داده میشوند. اگر بهینه (غلط املایی ۳: بهینهسازی) برای مرورگرهای قدیمیتر خیلی حیاتی است، باید از Polyfill برای `Intersection Observer` استفاده کنید یا یک اسکریپت Lazy Loading مبتنی بر اسکرول ایونت بنویسید (که توصیه نمیشود).
Lazy Loading تصاویر پسزمینه (Background Images)
همونطور که گفتیم، `loading=”lazy”` فقط برای تگ `<img>` کار میکنه. اما چی میشه اگه بخوایم تصاویر پسزمینه رو که با CSS تعریف شدن هم Lazy Load کنیم؟ اینجا هم `Intersection Observer` به دادمون میرسه.
پیادهسازی Lazy Loading برای Background Images
برای این کار، میتونیم URL تصویر پسزمینه رو تو یه `data-attribute` نگه داریم و وقتی المان وارد ویوپورت شد، اون URL رو به خاصیت `background-image` المان انتقال بدیم.
مثال: Lazy Loading برای تصاویر پسزمینه
// HTML:
// <div class="hero-section lazy-background" data-background="/images/bg-hero.jpg"></div>
// CSS (برای placeholder یا ابعاد):
// .hero-section {
// min-height: 400px;
// background-color: #f0f0f0; // Placeholder color
// background-size: cover;
// background-position: center;
// }
// JavaScript:
const lazyBackgrounds = document.querySelectorAll('.lazy-background[data-background]');
const backgroundObserverOptions = {
root: null,
rootMargin: '100px 0px', // کمی قبل از ورود به viewport لود شود
threshold: 0.01
};
function handleBackgroundIntersect(entries, observer) {
entries.forEach(entry => {
if (entry.isIntersecting) {
const element = entry.target;
const bgUrl = element.getAttribute('data-background');
if (bgUrl) {
element.style.backgroundImage = `url('${bgUrl}')`;
element.classList.remove('lazy-background');
element.removeAttribute('data-background');
observer.unobserve(element);
}
}
});
}
const backgroundObserver = new IntersectionObserver(handleBackgroundIntersect, backgroundObserverOptions);
lazyBackgrounds.forEach(bgElement => {
backgroundObserver.observe(bgElement);
});
نکته: مطمئن شو که المانهای پسزمینه، ارتفاع یا `min-height` مشخصی داشته باشن تا `Intersection Observer` بتونه درست کار کنه.
بهینهسازیهای تکمیلی برای عملکرد بهتر (تا سایتت مثل جت بپره!)
Lazy Loading به تنهایی یه قدم بزرگه، اما برای اینکه سایتت واقعاً حرفهای و پرسرعت باشه، باید چند تا نکته دیگه رو هم رعایت کنی. اینا مثل چاشنیهایی میمونن که به غذات طعم نهایی رو میدن.
1. استفاده از Placeholderها و اسکلتونها (از پرش محتوا جلوگیری کن!)
یکی از مشکلات رایج Lazy Loading، پرش محتوا (CLS) هست. وقتی یه تصویر بدون ابعاد مشخص Lazy Load میشه، بعد از لود شدن، جای خالی اون پر میشه و بقیه المانها رو جابجا میکنه. برای جلوگیری از این مشکل:
- مشخص کردن `width` و `height`: همیشه ابعاد نهایی تصویر رو تو تگ `<img>` بنویس.
- تصاویر Placeholder: از تصاویر کمحجم یا SVGهای Base64 شده استفاده کن که فضا رو پر کنن تا تصویر اصلی لود بشه.
- افکت بلور (Blur Effect): یه تصویر Placeholder خیلی کوچک و تار (Low-Quality Image Placeholder – LQIP) قرار بده که بعداً با تصویر اصلی جایگزین بشه. این یه حس بصری خوب ایجاد میکنه.
- اسکلتونها (Skeleton Screens): به جای Placeholder، میتونی یه افکت اسکلت (مثل خطوط خاکستری که نشوندهنده متن یا عکس هستند) نشون بدی تا زمانی که محتوا لود میشه.
2. تصاویر Responsive با srcset و sizes (برای هر دستگاه، تصویر مناسب!)
یه تصویر با کیفیت بالا که برای نمایشگر 4K خوبه، برای یه موبایل کوچیک فقط حجم اضافی به حساب میاد. با `srcset` و `sizes` میتونی چندین نسخه از یه تصویر با ابعاد مختلف رو تعریف کنی تا مرورگر بهترین گزینه رو بر اساس سایز نمایشگر و رزولوشن دستگاه کاربر انتخاب کنه.
مثال: ترکیب Lazy Loading با Responsive Images
<img src="placeholder.jpg"
data-srcset="/images/img-480w.jpg 480w,
/images/img-800w.jpg 800w,
/images/img-1200w.jpg 1200w"
data-sizes="(max-width: 600px) 480px,
(max-width: 1200px) 800px,
1200px"
alt="تصویر بهینهسازی شده"
width="1200"
height="800"
class="lazy-load"
loading="lazy">
<script>
// فرض میکنیم تابع Intersection Observer شما وجود دارد و
// به جای img.src = src; از img.srcset = img.getAttribute('data-srcset'); استفاده میکند
// و همچنین img.sizes = img.getAttribute('data-sizes');
// ...
</script>
نکته: وقتی از `loading=”lazy”` استفاده میکنی، بهتره `srcset` و `sizes` رو هم اول تو `data-srcset` و `data-sizes` بزاری و وقتی تصویر لود شد، منتقلشون کنی. مرورگر خودش تشخیص میده کدوم تصویر رو از `srcset` لود کنه.
برای یادگیری بیشتر در مورد کدهای آماده و اسنیپت جاوااسکریپت و بهینهسازی میتونی به منابع تخصصی ما سر بزنی.
3. استفاده از فرمتهای تصویری مدرن (WebP, AVIF)
فرمتهای تصویری مثل WebP و AVIF میتونن کیفیت مشابهی با JPEG یا PNG ارائه بدن اما با حجم خیلی کمتر. حتماً تصاویرت رو به این فرمتها تبدیل کن و با استفاده از تگ `<picture>` از Fallback برای مرورگرهایی که پشتیبانی نمیکنن، اطمینان حاصل کن.
مثال: تگ <picture> با Lazy Loading
<picture>
<source data-srcset="/images/image.avif" type="image/avif">
<source data-srcset="/images/image.webp" type="image/webp">
<img src="placeholder.jpg"
data-src="/images/image.jpg"
alt="تصویر وبپ و آویف"
width="1200"
height="800"
loading="lazy">
</picture>
<script>
// وقتی تصویر لود شد، data-srcset رو به srcset منتقل کن
// برای تگ های <source> و data-src رو به src برای <img>
// این کار رو Intersection Observer شما باید هندل کند.
</script>
جدول بهترین روشها و توصیههای Lazy Loading
عیبیابی سریع: مشکلات رایج و راه حلها (دیگه گیر نمیکنی!)
حتی حرفهایترین برنامهنویسها هم بعضی وقتا با Lazy Loading به مشکل میخورن. نگران نباش، این طبیعیه. اینجا یه لیست از مشکلات رایج و راه حلهاشون رو آوردم تا وقتت برای گشتن تو Stack Overflow تلف نشه. برای مشاوره بیشتر هم میتونی با
تیم پشتیبانی ما تماس بگیری.
⚠️ لیست مشکلات و راهحلها ⚠️
-
🔴 مشکل: تصاویر Lazy Load شده، اصلاً لود نمیشن.
✅ راهحل:
اولین چیزی که باید چک کنی، اینه که آیا `data-src` (یا `data-srcset` و `data-sizes`) رو درست تنظیم کردی یا نه. مطمئن شو که مسیر عکس تو این `attribute`ها صحیحه. دوم، اسکریپت جاوااسکریپتت رو با کنسول مرورگر دیباگ کن ببین اروری وجود داره یا نه. شاید `querySelectorAll` المانها رو پیدا نمیکنه یا `observer.observe` درست کار نمیکنه. -
🔴 مشکل: تصاویر با تأخیر زیادی لود میشن، حتی وقتی کاربر بهشون نزدیک شده.
✅ راهحل:
اگه از `Intersection Observer` استفاده میکنی، مقدار `rootMargin` رو افزایش بده. مثلاً به جای `rootMargin: ‘0px 0px’`, از `’200px 0px’` استفاده کن. این یعنی تصویر ۲۰۰ پیکسل قبل از اینکه واقعاً وارد ویوپورت بشه، شروع به لود شدن میکنه و حس بهتری به کاربر میده. -
🔴 مشکل: صفحه بعد از لود شدن تصاویر، پرش (Layout Shift) داره.
✅ راهحل:
این همون CLS معروفه! باید ابعاد `width` و `height` رو برای تگ `<img>` مشخص کنی. حتی اگه تصویر Lazy Load میشه، مرورگر میتونه فضای لازم رو براش رزرو کنه. استفاده از Placeholderها با ابعاد ثابت هم کمک میکنه. -
🔴 مشکل: سئو سایت با Lazy Loading مشکل پیدا کرده، تصاویر تو گوگل ایمیج نشون داده نمیشن.
✅ راهحل:
رباتهای گوگل معمولاً جاوااسکریپت رو اجرا میکنن، پس `Intersection Observer` مشکلی نداره. اما برای اطمینان بیشتر:- مطمئن شو که `data-src` و `alt` رو درست تنظیم کردی.
- از Fallback مناسب برای مرورگرها/رباتهایی که JS رو کامل اجرا نمیکنن، استفاده کن (مثلاً همه تصاویر رو بلافاصله لود کن).
- از ابزارهایی مثل Google Search Console برای بررسی نحوه ایندکس شدن تصاویرت استفاده کن.
-
🔴 مشکل: Lazy Loading برای اولین تصویر (LCP) هم اعمال میشه و سرعت اولیه رو کم میکنه.
✅ راهحل:
این یه اشتباه رایجه! تصاویری که در بالای صفحه (Above-the-fold) و بلافاصله در ویوپورت اولیه کاربر قابل مشاهده هستن، نباید Lazy Load بشن. برای این تصاویر از `loading=”eager”` (یا اصلا هیچ `loading`ی) استفاده کن. این باعث میشه LCP (Largest Contentful Paint) بهبود پیدا کنه.
جمعبندی: یه سایت سریعتر، یه کاربر خوشحالتر!
همونطور که دیدی، Lazy Loading یه ابزار فوقالعاده قویه که میتونه پرفورمنس سایتت رو متحول کنه. چه از روش ناتیو `loading=”lazy”` استفاده کنی و چه با `Intersection Observer API` کنترل دقیقتری داشته باشی، هدف نهاییت باید ارائه یه تجربه کاربری عالی و یه سایت پرسرعت باشه. با ترکیب این تکنیکها با بهینهسازیهای تکمیلی مثل Responsive Images و فرمتهای مدرن، میتونی مطمئن باشی که سایتت توی رقابت سرعتی حرفی برای گفتن داره و کاربرا رو حسابی جذب میکنه.
حالا دیگه نوبت توئه! این اسنیپتها رو بردار، تو پروژههات پیادهسازی کن و از دیدن سایت پرسرعتت لذت ببر. اگه سوالی داشتی یا نیاز به
مشاوره فنی
بیشتر داری، ما همیشه آماده کمک هستیم. یادت نره، تو میتونی یه دنیای سریعتر بسازی!
سوالات متداول (FAQ) درباره Lazy Loading تصاویر
Lazy Loading چیه و چرا باید ازش استفاده کنم؟
Lazy Loading یه تکنیکه که باعث میشه تصاویر (یا سایر محتواها) فقط زمانی بارگذاری بشن که کاربر بهشون نیاز داره یا وارد ویوپورت بشن. این کار سرعت بارگذاری اولیه صفحه رو به طرز چشمگیری بالا میبره، مصرف پهنای باند رو کاهش میده و تجربه کاربری بهتری رو فراهم میکنه.
بهترین روش برای پیادهسازی Lazy Loading کدومه؟
برای تگهای `<img>`، بهترین و سادهترین روش استفاده از `loading=”lazy”` ناتیو هست که توسط مرورگر هندل میشه. اگر نیاز به کنترل دقیقتر، Fallback برای مرورگرهای قدیمیتر یا Lazy Loading تصاویر پسزمینه دارید، `Intersection Observer API` انتخاب عالیایه.
آیا Lazy Loading روی سئو تاثیر منفی میذاره؟
خیر، اگر به درستی پیادهسازی بشه، نه تنها تاثیر منفی نداره بلکه به بهبود سئو کمک هم میکنه. گوگل سایتهای سریع رو دوست داره. رباتهای گوگل جاوااسکریپت رو اجرا میکنن و تصاویر Lazy Load شده رو ایندکس میکنن. فقط مطمئن بشید که تصاویر مهم بالای صفحه Lazy Load نشن و از `alt` attribute استفاده کنید.
چطور میتونم از پرش محتوا (CLS) با Lazy Loading جلوگیری کنم؟
برای جلوگیری از CLS، حتماً `width` و `height` تصاویر رو در تگ `<img>` مشخص کنید. همچنین، میتونید از Placeholderهای کمحجم یا SVG برای رزرو فضای تصویر قبل از بارگذاری استفاده کنید.
آیا باید تمام تصاویر رو Lazy Load کنم؟
خیر! تصاویر مهمی که در بالای صفحه (Above-the-fold) قرار دارند و بلافاصله برای کاربر قابل مشاهده هستند، نباید Lazy Load بشن. این تصاویر باید با اولویت بالا بارگذاری بشن تا LCP سایت شما بهبود پیدا کنه. فقط تصاویر پایینتر از صفحه رو Lazy Load کنید.


