تحميل الخطوط

كيف يؤثر تحميل خطوط الويب في مؤشرات أداء الويب الأساسية مثل CLS وLCP، واستراتيجيات font-display، والتحميل المسبق للخطوط، وتقليل تغيّر التخطيط عند تبديل الخط.

نُشر أول مرة: 2 يوليو 2026 · آخر تحديث: 11 أغسطس 2026 · Advanced
اللغات

خطوط الويب المخصصة ملفات خارجية يجب تنزيلها قبل عرض النص بها. ويحدد font-display ما يظهر أثناء الانتظار، فيؤثر في LCP عندما يؤخر الخط النص الأكبر، وفي CLS عندما يغيّر تبديل الخط التخطيط. الحلول الموثوقة هي التحميل المسبق للخط الحرج، واختيار optional أو swap عمدًا، ومطابقة مقاييس الخط الاحتياطي، أو استخدام خط نظام. ليس تحميل الخط عامل ترتيب مباشرًا؛ بل يغذي CLS وLCP ضمن إشارات تجربة الصفحة.

الخلاصة — خطوط الويب المخصصة موارد خارجية تؤثر في العرض. تضر LCP حين يؤخر خط حاجب للعرض أكبر عنصر نصي، وتضر CLS حين يعيد تبديل الخط الاحتياطي بخط الويب تدفق التخطيط. يفشل FOIT وFOUT بطريقتين مختلفتين. والرافعة الأساسية هي font-display: يضمن swap حدوث FOUT، بينما يمنح optional نافذة تقارب 100ms ثم يلتزم بالخط المتاح، فيمنع التبديل اللاحق. يعالج preload اكتشاف الخط المتأخر، والجمع بينه وبين font-display: optional هو ما أبرزته هندسة Google لإزالة اضطراب التخطيط. لكن اجتياز فحص Lighthouse لا يصلح CLS؛ إذ يتطلب ذلك خطًا احتياطيًا مطابق المقاييس أو تجاوزات size-adjust وascent-override. وليس أي من هذا عامل ترتيب مباشرًا، بل يغذي CLS وLCP.

Evidence for this claim The CSS Font Loading API exposes font loading state and control to documents. Scope: Current official or standards documentation. Confidence: high · Verified: MDN: CSS Font Loading API Evidence for this claim font-display controls how a font face is displayed while it downloads and when fallback is used. Scope: Current official or standards documentation. Confidence: high · Verified: MDN: font-display

لماذا تمثل الخطوط حالة خاصة؟

تتعلق معظم مشكلات الأداء بحجم الملفات أو بحجب الخيط الرئيسي. أما الخطوط فهي مورد خارجي وتغيّر مقاييس النص؛ لذلك قد تؤخر رسمه وتغيّر حجمه وشكله بعد ظهوره، فتضر LCP وCLS معًا.

يستحق سلوكا المتصفح الافتراضيان التسمية لأن الموضوع كله يعتمد عليهما:

  • FOIT: يبقى النص غير مرئي حتى تحميل الخط أو انتهاء المهلة، التي بلغت تاريخيًا نحو ثلاث ثوان في معظم المتصفحات.
  • FOUT: يظهر الخط الاحتياطي فورًا ثم يُستبدل بخط الويب عند تحميله.

قد يبدو FOIT أنظف لكنه يخاطر بتأخير العرض، ويبدو FOUT أسرع لكنه يخاطر بتغيّر التخطيط. ولا يكون أيهما آمنًا تلقائيًا.

افصل أيضًا مراحل المسار: تصرّح قاعدة @font-face بالخط، لكن المتصفح لا يجلب ملفه إلا عندما يحتاج نص منسق إلى وجه مطابق. ويخضع الجلب لـCORS عند اختلاف الأصل، لذلك لا يضمن نجاح ورقة الأنماط أن استجابة الخط تحمل الإذن الصحيح. وحتى الجلب الناجح لا يضمن ثبات الصفحة؛ فقد تختلف أزمنة الاكتشاف والتبديل بين الذاكرة الباردة والدافئة والخط المخزن سلفًا. لا يكفي إذن تكرار تحميل واحد في DevTools لتمثيل الزائر الجديد.

كيف تؤثر الخطوط في LCP؟

إذا كان أكبر عنصر ظاهر عنوانًا أو فقرة، فقد يصبح خطه جزءًا من مسار LCP. ووفق web.dev، يكون مورد LCP، إن وجد، صورة أو خط ويب. يدفع الخط الحاجب الذي يترك النص مخفيًا قيمة LCP حتى يصل.

تقول صفحة تحسين Largest Contentful Paint:

“If you set a font-display value of anything other than auto or block, then text will always be visible during load, and LCP won’t be blocked on an additional network request.” (ترجمة) «إذا ضبطت font-display على قيمة غير auto أو block، يبقى النص مرئيًا أثناء التحميل ولا يحجبه طلب شبكة إضافي عن LCP». — web.dev

أي إن swap وfallback وoptional تبقي النص ظاهرًا فلا يصبح LCP رهينة طلب الخط.

كيف تؤثر الخطوط في CLS؟

ينشأ CLS من التبديل. فنادرًا ما تتطابق عروض الحروف وارتفاعات الأسطر في الخط الاحتياطي وخط الويب؛ وعند الاستبدال يعاد تدفق النص ويتحرك ما تحته.

والمفاجأة أن FOIT يسبب CLS أيضًا. فالنص غير المرئي يُنسق بمقاييس الخط الاحتياطي، ولذلك يستمر التبديل في تحريك العناصر. تقول صفحة تحسين CLS:

“Both approaches can cause layout shifts. Even if the text is invisible, it’s still laid out using the fallback font, so when the web font loads, the text block and the surrounding content shift” (ترجمة) «قد يسبب النهجان تغيّر التخطيط. وحتى إن كان النص غير مرئي، فإنه يُنسق بالخط الاحتياطي؛ وعند تحميل خط الويب يتحرك قالب النص والمحتوى المحيط». — web.dev

وتلخص الصفحة السلوكين:

“The fallback font is swapped with the web font, incurring a Flash of Unstyled Text (FOUT). ‘Invisible’ text is displayed using the fallback font until a web font is available and the text is made visible (FOIT—flash of invisible text).” (ترجمة) «يُستبدل الخط الاحتياطي بخط الويب فيحدث FOUT. ويُعرض النص غير المرئي بمقاييس الخط الاحتياطي حتى يتاح خط الويب ويصبح النص ظاهرًا، أي FOIT». — web.dev

وقد شرحت الأمر بصورة أبسط في مقالتي لدى Ahrefs عن CLS: تحميل الخط أو تغييره يسبب تحولًا ملحوظًا، وهو من أكثر أسباب CLS الواقعية شيوعًا إلى جانب الصور بلا أبعاد والمحتوى المحقون بعد التحميل.

خاصية font-display

font-display واصف في @font-face يتحكم في نافذتين: فترة الحجب التي يخفي المتصفح النص خلالها، وفترة التبديل التي يظل فيها مستعدًا لاستبدال الخط بعد انتهاء الحجب. وفق أفضل ممارسات الخطوط:

القيمةفترة الحجبفترة التبديل
autoحسب المتصفححسب المتصفح
block2–3 ثوانغير محدودة
swap0msغير محدودة
fallback100ms3 ثوان
optional100msلا توجد

يصف مرجع MDN swap بأنه يمنح فترة حجب بالغة القصر وفترة تبديل غير محدودة، وoptional بأنه يمنح فترة حجب بالغة القصر ولا يمنح فترة تبديل. وهذا هو جوهر optional: بعد إغلاق النافذة يبقى الخط المستخدم ولا يحدث تبديل لاحق.

تنبيه: لا تحدد مواصفة CSS سوى فئات الفترات: قصيرة، وبالغة القصر، وغير محدودة، ومعدومة؛ وتترك المدة للمتصفح. أرقام الجدول سلوك Chromium موثق في web.dev وليست ضمانًا عبر المتصفحات. اعتبرها توضيحية وافحص إصدار المتصفح المستهدف.

تقترح web.dev المزج: استخدم swap للعلامة والعناصر المميزة حيث يهم ظهور الخط، وoptional للنص الأساسي حيث يتقدم ثبات CLS. لا تطبق قيمة واحدة على الموقع كله تلقائيًا.

التحميل المسبق للخطوط

تُكتشف طلبات الخطوط متأخرة، بعد تحليل CSS ومطابقة @font-face بعنصر ظاهر. تختصر <link rel="preload"> ذلك، ويعالج preload مرحلة الاكتشاف:

<link rel="preload" href="/fonts/brand.woff2" as="font" type="font/woff2" crossorigin>

تجعل العلامة المتصفح يبدأ الجلب فورًا وبالتوازي. وتصف هندسة Bing هذا على صفحات البحث: تبدأ علامات preload في <head> التنزيل مباشرة، بينما ينتظر المتصفح من دونها تحليل CSS والعثور على العناصر المطابقة.

أقوى تركيبة وفق Google هي <link rel="preload"> + font-display: optional. تصف web.dev في منع تغيّر التخطيط وFOIT بتحميل الخطوط الاختيارية مسبقًا هذا الجمع بأنه الأكثر فاعلية لضمان عدم اضطراب التخطيط، وتذكر أن Chrome منذ الإصدار 83 أزال التغيّر الذي كان يحدث عند تحميل الخطوط الاختيارية مسبقًا. يمنح preload الخط فرصة للوصول خلال نافذة نحو 100ms، ويضمن optional ألا تدفع ثمن التأخر بتغيّر التخطيط.

متى لا تستخدم preload؟ يستهلك التحميل المسبق موارد المتصفح من موارد أخرى. حمّل خطًا أو خطين حرجين فوق الطية، لا كل وزن؛ فقد يؤدي الإفراط إلى تجويع موارد أهم وإبطاء الصفحة.

تأكد من إعادة استخدام الطلب. يجب أن تتطابق قيم href وas="font" وtype ووضع crossorigin مع الطلب الفعلي في @font-face. وإلا يظهر تحذير preload غير مستخدم وتنزيل ثان مهدور. وقد يتجاوز preload اختيار unicode-range فينزل مجموعة لا تحتاجها الصفحة. تحقق في Network من طلب واحد بدأه preload، لا طلبين.

إصلاح التغيّر نفسه: مطابقة مقاييس الخط الاحتياطي

اجتياز فحص Lighthouse لـfont-display لا يصلح CLS. توضح وثائق Lighthouse أن FOIT وFOUT يتركان الأثر نفسه في CLS عندما يستبدل الخط المخصص خط النظام المؤقت. يجعل swap النص مرئيًا، لكنه يبقي تغيّر التبديل، لذلك يظل font-display جزءًا واحدًا من الحل.

لمنع التغيّر عند حدوث التبديل، اجعل الخطين يشغلان المساحة نفسها:

  1. اختر خط نظام قريب المقاييس في مكدس font-family بدل اسم خط مخصص بلا بديل مناسب.
  2. تجاوز مقاييس خط الويب باستخدام size-adjust وascent-override وdescent-override وline-gap-override في @font-face كي يطابق صندوق الخط الاحتياطي. تذكر web.dev هذه الواصفات، وتشرحها Smashing Magazine بالتفصيل.

يضبط كل واصف مقياسًا مختلفًا، ويختلف دعم المتصفحات؛ تحقق من التوافق ومن الأوزان والأنماط والنصوص الفعلية. نجاح الوزن العادي باللاتينية لا يضمن نجاح العريض أو المائل أو نص غير لاتيني.

يقدم DebugBear في إصلاح تغيّرات التخطيط التي تسببها خطوط الويب مسارًا كاملًا: القياس، وتحديد الخط، وتطبيق font-display، واختيار بديل أفضل، ثم ضبط المقاييس.

Google Fonts أم الاستضافة الذاتية؟

لا يلزم أن تستضيف الخط ذاتيًا للتحكم في font-display. تقبل واجهة Google Fonts CSS2 معامل display؛ فالعنوان https://fonts.googleapis.com/css2?family=Roboto&display=swap يضبط الواصف في قواعد @font-face. يشرح Addy Osmani هذا التغيير الذي أزال الحاجة السابقة إلى الاستضافة الذاتية لهذا الغرض.

تزيل الاستضافة الذاتية طلب DNS والاتصال الإضافيين إلى fonts.googleapis.com وfonts.gstatic.com. وهذه كلفة حقيقية، ولهذا يساعد تلميح preconnect عند استخدام Google Fonts. لكن تضمين Google المنسوخ يظل ورقة أنماط حاجبة ثم طلب خط، وقد تخلو التضمينات القديمة من display.

لا يوجد فائز عام؛ فالقرار يعتمد على النصوص والأوزان التي تقدمها، وإعداد التخزين المؤقت، وشروط الترخيص. قارن على صفحاتك بدل اتباع توصية درس آليًا.

الخطوط المتغيرة

يجمع الخط المتغير أوزانًا وأنماطًا كثيرة في ملف واحد بمحاور قابلة للضبط. قد يكون طلب واحد أفضل من ستة إذا استخدمت عدة أشكال، لكن الملف الكامل أكبر من وزن ثابت واحد؛ فإذا عرضت وزنًا واحدًا قد يكون أبطأ. قسّمه إلى المحاور والمحارف المطلوبة، وقدمه بصيغة WOFF2، وافحص الترخيص؛ فليست كل المسابك تسمح بالتقسيم أو الاستضافة الذاتية.

تقليل الملف نفسه

تدير الحلول السابقة متى يحمل الخط، ويمكن أيضًا تقليل ما يُحمّل. يزيل تقسيم الخط المحارف غير المستخدمة، وتوفر WOFF2 ضغطًا جيدًا. يزيد الملف الأصغر احتمال وصوله داخل نافذة optional ويقل احتمال حجبه LCP؛ فالتقسيم والضغط مكملان لـfont-display وpreload.

لكن لا توجد مجموعة فرعية صحيحة أو نسبة توفير عالمية؛ يعتمد الأمر على النصوص والمحارف والأوزان التي يحتاجها جمهورك. قس طلباتك قبل التغيير وبعده ولا تعامل دراسة حالة بوصفها وعدًا.

هل هو عامل ترتيب؟

تحميل الخطوط ليس عامل ترتيب مباشرًا. إنه يؤثر في CLS وLCP، وهما من مؤشرات أداء الويب الأساسية وإشارات تجربة الصفحة. وتجربة الصفحة إشارة خفيفة أشبه بكسر التعادل؛ تتقدم عليها الصلة والجودة. أصلح الخطوط لأنها مشكلة حقيقية للمستخدم وتغذي مدخلين للترتيب، لا لأن قيمة font-display سترفع النتيجة وحدها.

رأيي

في دليلي Ahrefs عن CLS وLCP استقر ترتيب الأولويات نفسه: استخدم خط نظام إن استطعت. وإن كان الخط المخصص ضروريًا، فاجمع <link rel="preload"> لجلبه مبكرًا مع font-display: optional لمنحه نافذة قصيرة؛ وإن تأخر تعرض الصفحة خطًا افتراضيًا ويُخزّن المخصص للزيارات اللاحقة. preload ثم optional، والأفضل عدم استخدام خط مخصص أصلًا.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.