عناصر احتياطية محسَّنة للخطوط

كاتي هيمبينيوس
"كاتي هيمبينيوس"

ملخّص

تقدّم هذه المقالة نظرة تفصيلية على العناصر الاحتياطية للخطوط وواجهات برمجة التطبيقات size-adjust وascent-override وdescent-override وline-gap-override. تتيح واجهات برمجة التطبيقات هذه إمكانية استخدام الخطوط المحلية لإنشاء واجهات خطوط احتياطية تتطابق تمامًا أو تامة مع أبعاد خط الويب. وهذا يقلل أو يزيل متغيّرات التصميم الناتجة عن تبديل الخط.

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

أدوات إطار العمل:

  • @next/font: بدءًا من 13 التالي، تستخدم خدمة next/font عمليات إلغاء مقاييس الخط وsize-adjust لتوفير عناصر احتياطية مطابقة للخط.
  • @nuxtjs/fontaine: بدءًا من Nuxt 3، يمكنك استخدام nuxt/fontaine لإنشاء عناصر احتياطية للخطوط المطابقة وإدراجها تلقائيًا في أوراق الأنماط التي يستخدمها تطبيق Nuxt.

الأدوات غير التابعة لإطار العمل:

  • Fontaine: هي مكتبة تنشئ وتدرج تلقائيًا عناصر احتياطية للخطوط تستخدم عمليات إلغاء مقاييس الخط.
  • يحتوي هذا المستودع على عمليات إلغاء مقاييس الخطوط لجميع الخطوط التي تستضيفها خدمة Google Fonts. يمكن نسخ هذه القيم ولصقها في أوراق الأنماط.

الخلفية

الخط الاحتياطي هو واجهة خط تُستخدم عندما لا يتم تحميل الخط الأساسي بعد، أو ينقصه رموز رسومية ضرورية لعرض محتوى الصفحة. على سبيل المثال، تشير لغة CSS أدناه إلى أنّه يجب استخدام مجموعة خطوط sans-serif كعنصر احتياطي للخط في "Roboto".

font-family: "Roboto" , sans-serif;

يمكن استخدام الخطوط الاحتياطية لعرض النص بسرعة أكبر (أي باستخدام font-display: swap). ونتيجةً لذلك، يكون محتوى الصفحة قابلاً للقراءة ومفيدًا في مرحلة مبكرة، ولكن في السابق كان ذلك بسبب عدم استقرار التنسيق: تحدث متغيّرات التصميم عادةً عند تبديل خط احتياطي إلى خط الويب. ومع ذلك، يمكن لواجهات برمجة التطبيقات الجديدة التي تمت مناقشتها أدناه تقليل هذه المشكلة أو القضاء عليها من خلال إتاحة إنشاء واجهات خطوط احتياطية تشغل المساحة نفسها التي تشغلها نظيرتها على الويب.

عناصر احتياطية محسَّنة للخطوط

هناك طريقتان ممكنتان لإنشاء عناصر احتياطية "محسَّنة" للخطوط. ولا يستخدم الأسلوب الأبسط سوى مقياس الخط الذي يلغي واجهة برمجة التطبيقات. يستخدم المنهج الأكثر تعقيدًا (ولكنه الأكثر فعالية) كلاً من مقياس الخط وواجهة برمجة التطبيقات وsize-adjust. وتوضّح هذه المقالة كلا النهجين.

آلية عمل إلغاءات مقاييس الخط

مقدمة

تتيح إلغاءات مقاييس الخط وسيلة لإلغاء صعود الخط وانحداره وفجوته الخطية في الخط:

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

مخطّط بياني يصوِّر صعود الخط وانحداره وفجوته الخطية.

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

تُستخدم إلغاءات مقياس الخط في ورقة أنماط مثل ما يلي:

body {
    font-family: Poppins, "fallback for poppins";
}

@font-face {
    font-family: "fallback for poppins";
    src: local("Times New Roman");
    ascent-override: 105%;
    descent-override: 35%;
    line-gap-override: 10%;
}

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

حساب عمليات إلغاء مقاييس الخط

تُظهر المعادلات التالية عمليات إلغاء مقياس الخط لخط ويب معيّن. يجب كتابة قيم عمليات إلغاء مقاييس الخط كنسب مئوية (على سبيل المثال، 105%) بدلاً من كسور عشرية.

ascent-override = ascent/unitsPerEm
descent-override = descent/unitsPerEm
line-gap-override = line-gap/unitsPerEm

على سبيل المثال، في ما يلي عمليات إلغاء مقاييس الخط لخط Poppins:

/*
Poppins font metrics:
ascent = 1050
descent = 350
line-gap = 100
UPM: 1000
*/

ascent-override: 105%;  /* = 1050/1000 */
descent-override: 35%;  /* = 350/1000 */
line-gap-override: 10%; /* = 100/1000 */

تأتي قيم ascent وdescent وline-gap وunitsPerEm من البيانات الوصفية الخاصة بالخط على الويب. ويوضّح القسم التالي من هذه المقالة كيفية الحصول على هذه القيم.

قراءة جداول الخطوط

تحتوي البيانات الوصفية للخط (على وجه التحديد، جداول الخطوط) على جميع المعلومات التي ستحتاج إليها لحساب حالات تجاوز مقاييس الخط.

لقطة شاشة لمربع حوار Font Information (معلومات الخط) في FontForge. يعرض مربع الحوار مقاييس الخط مثل "صعود خط الكتابة" و"تصحيح الخطأ الإملائي" و"ثغرة خط الخطأ".
استخدام FontForge لعرض البيانات الوصفية للخطوط

إليك بعض الأدوات التي يمكنك استخدامها لقراءة البيانات الوصفية للخط:

  • fontkit هو محرك خطوط مصمَّم من أجل Node.js. يعرض مقتطف الرمز هذا كيفية استخدام مجموعة أدوات fontkit لاحتساب حالات إلغاء مقاييس الخط.
  • Capsize هي مكتبة لتغيير حجم الخطوط وتنسيقها. يوفر Capsize واجهة برمجة تطبيقات للحصول على معلومات حول مقاييس الخطوط المختلفة.
  • fontdrop.info هو موقع إلكتروني يتيح لك عرض جداول الخطوط والمعلومات الأخرى المتعلقة بالخطوط من المتصفّح.
  • Font Forge هو محرِّر خطوط شائع لأجهزة الكمبيوتر المكتبي. لعرض ascent وdescent وline-gap: افتح مربع الحوار Font Info واختَر قائمة OS/2 ثم انقر على علامة التبويب Metrics. لعرض UPM: افتح مربع الحوار Font Info، ثم اختر القائمة General.

فهم جداول الخطوط

قد تلاحظ أنّ مفاهيم مثل "الصعود" يُشار إليها بمقاييس متعدّدة، على سبيل المثال مقاييس hheaAscent وtypoAscent وwinAscent. ويرجع ذلك إلى اتّباع أنظمة التشغيل المختلفة لأساليب مختلفة في عرض الخطوط: تستخدم البرامج على أجهزة OSX مقاييس خطوط hhea* بشكل عام، بينما تستخدم البرامج على أجهزة Windows عمومًا مقياسَي الخط typo* (يُشار إليهما أيضًا باسم sTypo*) أو win*.

بناءً على الخط والمتصفح ونظام التشغيل، سيتم عرض الخط باستخدام مقاييس hhea أو typo أو win.

نظام التشغيل Mac أجهزة Windows
Chromium تستخدم المقاييس من جدول "hhea". استخدام مقاييس من جدول "الأخطاء الإملائية" في حال ضبط "USE_TYPO_METRICS"، أو استخدام مقاييس من الجدول "الفوز"
Firefox تستخدِم مقاييس من جدول "typo" في حال ضبط "USE_TYPO_METRICS"، أو تستخدِم مقاييس من الجدول "hhea". استخدام مقاييس من جدول "الأخطاء الإملائية" في حال ضبط "USE_TYPO_METRICS"، أو استخدام مقاييس من الجدول "الفوز"
برنامج المتصفح Safari تستخدم المقاييس من جدول "hhea". استخدام مقاييس من جدول "الأخطاء الإملائية" في حال ضبط "USE_TYPO_METRICS"، أو استخدام مقاييس من الجدول "الفوز"

ولمزيد من المعلومات عن آلية عمل مقاييس الخط على جميع أنظمة التشغيل، اطّلِع على هذه المقالة عن المقاييس العمودية.

التوافق على جميع الأجهزة

بالنسبة إلى الغالبية العظمى من الخطوط (على سبيل المثال، حوالى% 90 من الخطوط التي تستضيفها Google Fonts) يمكن استخدام عمليات إلغاء مقاييس الخطوط بأمان بدون معرفة نظام تشغيل المستخدم. بمعنى آخر، بالنسبة إلى هذه الخطوط، تظل قِيم ascent-override وdescent-override وlinegap-override كما هي تمامًا بغض النظر عمّا إذا كانت مقاييس hhea أو typo أو win تنطبق. يقدّم هذا المستودع معلومات حول الخطوط التي ينطبق عليها هذا النموذج وتلك التي لا ينطبق عليها.

إذا كنت تستخدم خطًا يتطلب استخدام مجموعات منفصلة من عمليات إلغاء مقاييس الخط للأجهزة التي تعمل بنظام التشغيل OSX وWindows، يُنصح باستخدام عمليات إلغاء مقاييس الخط وننصح باستخدام size-adjust فقط إذا كان بإمكانك تنويع أوراق الأنماط بناءً على نظام التشغيل لدى المستخدم.

استخدام عمليات إلغاء مقاييس الخط

بما أنّه يتم احتساب تجاوزات مقاييس الخط باستخدام القياسات الواردة من البيانات الوصفية للخط على الويب (وليس الخط الاحتياطي)، تبقى هذه القياسات نفسها بغضّ النظر عن الخط المستخدَم كخطّ احتياطي. مثال:

body {
  font-family: "Poppins", "fallback for Poppins", "another fallback for Poppins";
}

@font-face {
  font-family: "fallback for Poppins";
  src: local("Arial");
  ascent-override: 105%;
  descent-override: 35%;
  line-gap-override: 10%;
}

@font-face {
  font-family: "another fallback for Poppins";
  src: local("Roboto");
  ascent-override: 105%;
  descent-override: 35%;
  line-gap-override: 10%;
}

آلية عمل ميزة ضبط الحجم

مقدمة

يضبط واصف CSS size-adjust بشكل تناسب عرض الرموز الرسومية للخط وارتفاعها. على سبيل المثال، تضبط ميزة size-adjust: 200% الحروف الرسومية لمضاعفة حجمها الأصلي، وتضبط size-adjust: 50% الحروف الرسومية على نصف حجمها الأصلي.

رسم بياني يعرض نتائج استخدام 'ضبط الحجم: 50%' و 'ضبط الحجم: 200%'

في حد ذاته، تتوفر تطبيقات محدودة في size-adjust لتحسين العناصر الاحتياطية للخطوط: في معظم الحالات، يجب تضييق نطاق الخط الاحتياطي أو توسيعه قليلاً (بدلاً من تحجيمه بشكل متناسب) ليطابق خط الويب. ومع ذلك، عند دمج size-adjust مع عمليات إلغاء مقاييس الخط، يمكن مطابقة أيّ خطَين أفقيًا وعموديًا.

في ما يلي طريقة استخدام size-adjust في أوراق الأنماط:

@font-face {
  font-family: "fallback for poppins";
  src: local("Arial");
  size-adjust: 60.85099821%;
  ascent-override: 164.3358416%;
  descent-override: 57.51754455%;
  line-gap-override: 16.43358416%;
}

بسبب طريقة احتساب size-adjust (الموضّحة في القسم التالي)، تتغيّر قيمة size-adjust (وإلغاء مقياس الخط المقابل) بناءً على الخط الاحتياطي المستخدَم:

body {
  font-family: "Poppins", "fallback for Poppins", "another fallback for Poppins";
}

@font-face {
  font-family: poppins-fallback;
  src: local("Arial");
  size-adjust: 60.85099821%;
  ascent-override: 164.3358416%;
  descent-override: 57.51754455%;
  line-gap-override: 16.43358416%;
}

@font-face {
  font-family: poppins-fallback-android;
  src: local("Roboto");
  size-adjust: 55.5193474%:
  ascent-override: 180.1173909%;
  descent-override: 63.04108683%;
  line-gap-override: 18.01173909%;
}

حساب عمليات ضبط الحجم وحالات تجاوز مقياس الخط

في ما يلي المعادلات المتعلّقة بحساب size-adjust وعمليات إلغاء مقياس الخط:

size-adjust = avgCharacterWidth of web font / avgCharacterWidth of fallback font
ascent-override = web font ascent / (web font UPM * size-adjust)
descent-override = web font descent / (web font UPM * size-adjust)
line-gap-override = web font line-gap / (web font UPM * size-adjust)

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

متوسط عرض الأحرف التقريبي

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

من الأمثلة على المنهجية البسيطة لحساب avgCharacterWidth استخدام متوسط عرض كل أحرف [a-z\s].

 رسم بياني يقارن عرض الأحرف الرسومية الفردية في Roboto [a-z].
عرض الأحرف الرسومية لـ Roboto

ومع ذلك، من المحتمل أن يؤدي ترجيح جميع الأحرف بالتساوي إلى تقليل عرض الأحرف التي تُستخدم كثيرًا (على سبيل المثال، e) وزيادة عرض الأحرف التي نادرًا ما يتم استخدامها (على سبيل المثال، z).

وهناك منهج أكثر تعقيدًا لتحسين الدقة يتمثل في مراعاة معدل تكرار الأحرف واحتساب متوسط العرض المرجح لعدد مرات الظهور بمقدار [a-z\s] حرف بدلاً من ذلك. هذه المقالة هي مرجع جيد لتكرار الأحرف ومتوسط طول الكلمات في النصوص الإنجليزية.

رسم بياني يعرض تكرار الأحرف للّغة الإنجليزية.
معدّل تكرار الأحرف باللغة الإنجليزية

اختيار نهج

النهجان اللذان تمت مناقشتهما في هذه المقالة له إيجابيات وعيوب:

  • يُعدّ استخدام عمليات إلغاء مقاييس الخط بمفردها طريقة جيدة للاستخدام إذا كنت تبدأ في تحسين العناصر الاحتياطية للخطوط. على الرغم من أن هذا هو الأبسط بين المنهجين، إلا أنه عادةً ما يكون قويًا بما يكفي لتقليل حجم متغيّرات التصميم المتعلقة بالخطوط بشكل ملحوظ.

  • من ناحية أخرى، إذا كنت تريد الحصول على دقة أكبر وكنت على استعداد لإجراء المزيد من العمل والاختبار، فإنّ دمج size-adjust هو أسلوب جيد للاستخدام. عند تطبيق هذه الطريقة بشكل صحيح، يمكنها أن تزيل بشكل فعال متغيّرات التصميم المتعلقة بالخطوط.

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

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

Arial هو الخط الاحتياطي الموصى به لخطوط sans-serif وTimes New Roman هو الخط الاحتياطي الموصى به لخطوط serif. ومع ذلك، لا يتوفر أي من هذين الخطين على Android (Roboto هو خط النظام الوحيد على Android).

يستخدم المثال التالي ثلاثة خطوط احتياطية لضمان تغطية الأجهزة واسعة النطاق: خط احتياطي يستهدف أجهزة Windows/Mac، خط احتياطي يستهدف أجهزة Android، خط احتياطي يستخدم مجموعة خطوط عامة.

body {
  font-family: "Poppins", poppins-fallback, poppins-fallback-android, sans-serif;
}

/*
Poppins font metrics:
- ascent = 1050
- descent = 350
- line-gap = 100
- UPM: 1000
AvgCharWidth:
- Poppins: 538.0103768
- Arial: 884.1438804
- Roboto: 969.0502537
*/

@font-face {
  font-family: poppins-fallback;
  src: local("Arial");
  size-adjust: 60.85099821%;
  ascent-override: 164.3358416%;
  descent-override: 57.51754455%;
  line-gap-override: 16.43358416%;
}

@font-face {
  font-family: poppins-fallback-android;
  src: local("Roboto");
  size-adjust: 55.5193474%:
  ascent-override: 180.1173909%;
  descent-override: 63.04108683%;
  line-gap-override: 18.01173909%;
}

طلب إرسال ملاحظات

يُرجى التواصل معنا إذا كان لديك أي ملاحظات حول تجربتك في استخدام عمليات إلغاء مقاييس الخط وsize-adjust.