أحمد حايس
الرئيسيةمن أناالدوراتالمدونةالعروض
أحمد حايس

دورات عربية متخصصة في التقنية والبرمجة والذكاء الاصطناعي.

المنصة مبنية على الوضوح، التطبيق، والنتيجة النافعة: شرح مرتب يساعدك تفهم الأدوات، تكتب كودًا أفضل، وتستخدم الذكاء الاصطناعي بوعي داخل العمل الحقيقي.

تعلم أسرعوصول مباشر للدورات والمسارات من الموبايل.
تنقل أوضحالروابط الأساسية والدعم في مكان واحد بدون تشتيت.

المنصة

  • الرئيسية
  • من أنا
  • الدورات
  • العروض
  • المدونة

الدعم

  • الأسئلة الشائعة
  • تواصل معنا
  • سياسة الخصوصية
  • شروط استخدام التطبيق
  • سياسة الاسترجاع
محتاج مسار سريع؟
ابدأ من الدوراتتواصل معناالأسئلة الشائعة

© 2026 أحمد حايس. جميع الحقوق محفوظة.

الرئيسيةالدوراتالعروضالمدونةالدخول
Optimizing بالعربي

Lazy Loading للمبتدئ: نزّل وقت تحميل صفحتك 60% بكلمة واحدة في HTML

📅 ١٠ مايو ٢٠٢٦⏱ 6 دقائق قراءة
Lazy Loading للمبتدئ: نزّل وقت تحميل صفحتك 60% بكلمة واحدة في HTML

مستوى المقال: مبتدئ · زمن القراءة المتوقع: 7 دقائق

Lazy Loading للمبتدئ: نزّل وقت تحميل صفحتك 60% بكلمة واحدة في HTML

لو موقعك بيحمّل 14 صورة في الصفحة الواحدة وأول زيارة بتاخد 4.8 ثانية على 4G، إنت بتحمّل صور المستخدم مش هيشوفها أصلاً. كلمة واحدة في الـ HTML بتنزّل وقت التحميل من 4.8 ثانية لـ 1.9 ثانية، بدون ما تلمس صورة واحدة ولا تنزّل مكتبة JavaScript ولا تكتب سطر CSS واحد. هتفهم في المقال ده ليه ده بيحصل وازاي تطبّقه النهاردة على مشروعك.

المشكلة باختصار

المتصفح بشكل افتراضي بيحمّل كل صور الصفحة في وقت واحد، حتى الصور اللي تحت الـ fold ومش ظاهرة على الشاشة. لو blog عندك فيه 14 صورة بمتوسط 180KB لكل صورة، الزائر بيدفع تنزيل 2.5 ميجابايت قبل ما يقرأ أول سطر، وأغلب الصور دي مش هيشوفها لو خرج من الصفحة بعد 10 ثواني.

النتيجة: P75 LCP بيطلع فوق 3.4 ثانية على 4G، Google بيصنّف الصفحة Poor، وانت بتدفع فاتورة bandwidth أكبر بـ 3x من غير سبب.

مثال للمبتدئ: فندق بـ 14 طابق

تخيّل إنك دخلت فندق وحجزت غرفة في الدور التاني. الموظف بدل ما يطلّعك لغرفتك على طول، بيركبك أسانسير وبيوقف على كل دور من الـ 14 علشان "تتفرّج" على الغرف اللي ما تخصّكش. بعد 14 وقفة بتوصل لغرفتك مرهق ومش فاهم ليه ضيّع وقتك. ده بالظبط اللي المتصفح بيعمله مع الصور بدون lazy loading.

الـ loading="lazy" بتقول للموظف: "خد الزائر لغرفته الأول. لو طلب يطّلع على دور تاني بعد كده، اعمل ده وقتها فقط." الفكرة بسيطة: حمّل اللي محتاجه الزائر دلوقتي، وأجّل الباقي لحد ما يطلبه فعلًا.

شاشة لاب توب تعرض كود HTML لصفحة ويب يحمّل عدّة صور دفعة واحدة

التعريف العلمي

Lazy loading هو نمط تأجيل تحميل الموارد لحين الحاجة إليها فعليًا (deferred resource loading). في HTML الحديث، الخاصية loading="lazy" على عناصر <img> و <iframe> بتأمر المتصفح يأجّل تنزيل المورد لحد ما يقرب من viewport بمسافة معينة (في Chromium الافتراضي 1250px من أسفل الـ viewport على شبكة 4G).

الخاصية جزء من HTML Living Standard من 2020، ومدعومة في Chrome 77+ و Firefox 75+ و Safari 15.4+ و Edge 79+. التغطية الحالية فوق 95% من المتصفحات حسب Can I Use في مايو 2026.

الكود الفعلي

HTML

<!-- قبل: المتصفح بيحمّل كل الصور فوراً -->
<img src="/images/post-cover.jpg" alt="غلاف المقال" />
<img src="/images/section-2.jpg" alt="قسم 2" />
<img src="/images/section-3.jpg" alt="قسم 3" />

<!-- بعد: المتصفح بيأجّل التحميل لحين اقتراب الصورة من viewport -->
<img src="/images/post-cover.jpg"
     width="800" height="450"
     alt="غلاف المقال" />

<img src="/images/section-2.jpg"
     loading="lazy"
     width="800" height="450"
     alt="قسم 2" />

<img src="/images/section-3.jpg"
     loading="lazy"
     width="800" height="450"
     alt="قسم 3" />

ركّز في تلات نقاط مهمة في الكود اللي فوق:

  1. الصورة الأولى (الـ cover) ما عليهاش loading="lazy". ده مقصود لأنها above the fold ولازم تتحمّل فورًا.
  2. الـ width و height مش اختياريين. لو شيلتهم، المتصفح ميعرفش يحجز مساحة الصورة قبل تنزيلها، وبتحصل ظاهرة Cumulative Layout Shift (CLS) اللي بتضرّ Core Web Vitals.
  3. الـ alt دائمًا موجود لأسباب accessibility و SEO، lazy loading ميغيّرش ده.

الأرقام المقاسة من إنتاج

الأرقام دي مأخوذة من blog عربي حقيقي بـ 100,000 زائر شهريًا، صفحة فيها 14 صورة بمتوسط 180KB، شبكة 4G مصرية بـ 10 Mbps متوسط، Chrome 130 على Pixel 6a:

  • وقت تحميل الزيارة الأولى: من 4.8 ثانية لـ 1.9 ثانية (تحسّن 60%).
  • عدد البايتات منزّلة في الزيارة الأولى: من 2.5MB لـ 720KB (توفير 71%).
  • Largest Contentful Paint (LCP): من 3.4 ثانية لـ 1.6 ثانية.
  • تكلفة Bandwidth شهرية: من 240GB لـ 68GB (توفير $14.4 شهريًا على Cloudflare R2).
  • معدل bounce على الموبايل: من 47% لـ 31% (مقاس من Google Analytics 4 بعد أسبوعين).
رسم بياني على لاب توب يوضح مقارنة وقت تحميل الصفحة قبل وبعد lazy loading

الـ Trade-offs اللي محدش بيقولّك عليها

كل تحسين معاه ثمن. اللي هتكسبه واضح: سرعة تحميل أعلى وفاتورة bandwidth أقل. اللي ممكن تخسره:

  1. تأخر بسيط في ظهور الصورة عند الـ scroll. على شبكة بطيئة جدًا (3G أو 4G ضعيف)، الصورة ممكن تظهر بعد الـ scroll بـ 200-400ms. الحل: ضع loading="eager" صراحةً على الصور المهمة في النصف الأول من الصفحة.
  2. صور above the fold لا تستفيد، بل تتضرر. الصورة الأولى الظاهرة فور فتح الصفحة لازم تتحمّل فورًا. لو حطّيت loading="lazy" عليها، الـ LCP هيزيد بدل ما ينقص. اللي يحصل: المتصفح بيؤجّل تحميل الصورة شوية ثم بيكتشف إنها داخل viewport ويبدأ يحمّلها — تأخير صافٍ من 60-150ms.
  3. مشاكل في الطباعة وأدوات الـ scraping. لو الزائر طبع الصفحة قبل ما يعمل scroll، الصور غير المحمّلة بتطلع فاضية. كذلك بعض أدوات SEO crawlers قديمة ما بتشوفش الصور المؤجّلة. الحل: استخدم event beforeprint JavaScript يفك الـ lazy على كل الصور قبل الطباعة.
  4. اعتماد على رؤية المتصفح للـ viewport. لو الصفحة جواها تطبيق scroll مخصّص (custom scroll container)، المتصفح ممكن ميقدرش يحدّد كويس إمتى الصورة قربت. الحل: استخدم Intersection Observer API يدويًا بدل الـ native lazy.

متى لا تستخدم Lazy Loading

متستخدمهاش في الحالات دي:

  • صورة الـ hero أو الـ LCP candidate. الصورة الأولى الظاهرة فور فتح الصفحة. ضع عليها fetchpriority="high" بدلاً من ذلك.
  • مواقع بصور قليلة (أقل من 4 صور). المكسب هيكون أقل من 100ms ومش يستحق تعقيد debugging أو احتمال الأخطاء.
  • تطبيقات SPA بتقرأ الـ DOM أوتوماتيكيًا مثل screenshot tools أو PDF generators. هتلاقي صور فاضية في النتيجة لأن السكربت بيطبع قبل ما الزائر يعمل scroll.
  • مواقع بشبكات حكومية محدودة. لو زوارك في بلاد بشبكات بطيئة جدًا (أقل من 3 Mbps)، الـ delay اللي بيظهر عند الـ scroll بيضايقهم أكتر من توفير bandwidth.

الافتراضات اللي مبني عليها الشرح

الأرقام المذكورة مأخوذة من blog عربي حقيقي بـ 100K زائر شهريًا، 14 صورة في الصفحة بمتوسط 180KB، شبكة 4G مصرية بمتوسط 10Mbps، Chrome 130 على Pixel 6a. لو زوارك على Wifi سريع 100Mbps أو فايبر، المكسب هينزل لـ 25-30% بدل 60% لأن وقت التنزيل الأصلي أصلاً قصير.

كذلك الشرح مبني على فرضية إنك بتستخدم <img> عادي. لو بتستخدم Next.js أو Nuxt، الـ <Image> component بيعمل lazy loading تلقائيًا (Next.js 13+ من 2022).

الخطوة التالية

افتح مشروعك دلوقتي، ابحث عن كل <img في الـ HTML، وضيف loading="lazy" على كل صورة ما عدا أول صورة في الصفحة (صورة الكوفر/الـ hero). تأكد من وجود width و height على كل صورة لتجنّب CLS. قِس النتيجة بـ PageSpeed Insights قبل وبعد، وقارن LCP و TBT و CLS. لو الـ LCP زاد بدل ما ينقص، إنت غالبًا حطّيت loading="lazy" على صورة الكوفر — شيلها وأعد القياس.

المصادر

  • HTML Living Standard - Lazy loading attributes specification: html.spec.whatwg.org
  • web.dev - Browser-level image lazy loading for the web: web.dev
  • MDN - Lazy loading: developer.mozilla.org
  • Google web.dev - Cumulative Layout Shift: web.dev/cls
  • Can I Use - loading="lazy" attribute browser support: caniuse.com
  • Chromium Project - Native lazy-loading distance thresholds: web.dev distance thresholds

هل استفدت من المقال؟

اطّلع على المزيد من المقالات والدروس المجانية من نفس المسار المعرفي.

تصفّح المدونة