EduFlow
إتقان CSS الحديثة
⁦0%⁩

الوحدة 3 · متجاوب ومتين

الخصائص المنطقية والكتابة من اليمين إلى اليسار

17 دقراءة 4 دبيئة تجريب الكود

الدرس في لمحة

استبدل الخصائص الفيزيائية بالخصائص المنطقية لتعمل صفحة الجدول في اللغات التي تُكتب من اليمين إلى اليسار مثل العربية، وتعامل مع الأشياء القليلة التي لا تنعكس من تلقاء نفسها.

  1. 1محورا الـ inline والـ block
  2. 2تحويل بطاقة الجلسة
  3. 3الأحجام منطقية أيضًا
  4. 4ما لا ينعكس من تلقاء نفسه
  5. 5الخط العربي في قاعدتين
  6. 6دورك الآن

لا فيديو هنا، بل الشيء الحقيقي: درس مكتوب وأمثلة قابلة للتشغيل واختبار وتدريب.

تضيف Waypoint نسخة عربية من الجدول لفعاليتها الفرعية في القاهرة. التغيير في الـ HTML سمة واحدة، <html lang="ar" dir="rtl">، وجاء التحميل الأول صحيحًا نصفه فقط. قائمة الجلسات انعكست كما ينبغي، لأنها صف flex. لكن كل بطاقة ظهر حدّها الملوّن على اليسار، وهو في العربية نهاية السطر لا بدايته، وعمود الوقت جاءت مسافته في الجهة الخاطئة، وسهم «Details →» أشار إلى الوراء.

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

محورا الـ inline والـ block

الخصائص المنطقية (logical properties) تسمّي الجهات بحسب سير النص:

  • محور الـ inline هو الاتجاه الذي يجري فيه النص داخل السطر الواحد. في الإنجليزية من اليسار إلى اليمين؛ وفي العربية من اليمين إلى اليسار.
  • محور الـ block هو الاتجاه الذي تتراصّ فيه الأسطر: من الأعلى إلى الأسفل في اللغتين.
بطاقتان. في البطاقة من اليسار إلى اليمين تقع inline-start على اليسار وinline-end على اليمين. وفي البطاقة من اليمين إلى اليسار تقع inline-start على اليمين وinline-end على اليسار. وفي الحالتين تقع block-start في الأعلى وblock-end في الأسفل. dir="ltr" inline-start inline-end block-start block-end dir="rtl" inline-end inline-start block-start block-end الحدّ border-inline-start في بداية السطر في الحالتين
البطاقة نفسها في LTR وRTL: inline-start تنتقل من جهة إلى أخرى، وblock-start تبقى في الأعلى

لكل خاصية فيزيائية توأم منطقي:

فيزيائية منطقية
margin-left، margin-right margin-inline-start، margin-inline-end
padding-top، padding-bottom padding-block-start، padding-block-end
border-left border-inline-start
left، right، top inset-inline-start، inset-inline-end، inset-block-start
width، height inline-size، block-size
text-align: left text-align: start

وهناك اختصارات أيضًا: margin-inline: 1rem 2rem تضبط البداية والنهاية، وpadding-block: 1rem تضبط جهتي الـ block معًا، وinset-inline: 0 تحلّ محلّ left: 0; right: 0.

تحويل بطاقة الجلسة

session-card.css
/* Before: physical */
.session-card {
  border-left: 6px solid var(--track-color);
  padding: 12px 8px 12px 20px;
  text-align: left;
}
.session-card .time { margin-right: 12px; }

/* After: logical */
.session-card {
  border-inline-start: 6px solid var(--track-color);
  padding-block: 12px;
  padding-inline: 20px 8px;
  text-align: start;
}
.session-card .time { margin-inline-end: 12px; }

في الإنجليزية النتيجة مطابقة حتى آخر بكسل. وفي العربية ينتقل الحدّ إلى اليمين، حيث تبدأ الأسطر، وتتبعه المسافات. تكتب البطاقة مرة واحدة.

flexbox وgrid يفكّران بهذه الطريقة أصلًا. flex-direction: row وjustify-content: flex-start والعمود 1 في grid كلها تتبع اتجاه السطر، لذا ينعكس صف flex في RTL دون أيّ CSS إضافية. ولهذا عملت قائمة Waypoint من المحاولة الأولى.

الأحجام منطقية أيضًا

inline-size وblock-size هما الاسمان المنطقيان للعرض والارتفاع، وmax-inline-size: 40ch هي النسخة المنطقية من سقف عرض القراءة المريح الذي رأيته في درس التحجيم الذاتي. في العربية والإنجليزية تتصرّفان تمامًا مثل width وheight، لأن الخطّين يُكتبان أفقيًا. ولا تختلفان إلا في أنماط الكتابة الرأسية، مثل writing-mode: vertical-rl لليابانية أو لعنوان جدول مُدار، حيث يمتدّ محور الـ inline من الأعلى إلى الأسفل. استخدامهما لا يكلّف شيئًا اليوم، ويعني أن الـ component سيصمد إن تغيّر نمط الكتابة لاحقًا. وقاعدة معقولة للفريق: الخصائص المنطقية لكل ما يتعلّق بسير النص، والفيزيائية فقط لما هو فيزيائي بطبيعته، كظلّ يجب أن يسقط إلى الأسفل دائمًا.

ما لا ينعكس من تلقاء نفسه

بعض الأشياء فيزيائية بطبيعتها وتحتاج إلى قاعدة RTL صريحة:

  • الـ transforms: translateX(8px) تحرّك العنصر إلى اليمين دائمًا.
  • الأيقونات الاتجاهية: الأسهم، وعلامات «التالي»، واتجاه مؤشّر التقدّم.
  • مواضع الخلفيات والظلال: box-shadow: 4px 0 … تلقي ظلّها إلى اليمين دائمًا.

الـ pseudo-class :dir() تطابق الاتجاه المحسوب للعنصر، الموروث من أقرب سمة dir:

CSS
.more .arrow {
  display: inline-block;
  margin-inline-start: 4px;
}
.more .arrow:dir(rtl) {
  scale: -1 1;   /* mirror horizontally */
}

:dir(rtl) أفضل من [dir="rtl"] .arrow لأنها لا تهتم بمكان السمة، ولا بما إذا كان عنصر متداخل قد عاد إلى LTR. وهي ضمن Baseline منذ ديسمبر 2023، ومتاحة على نطاق واسع منذ منتصف 2026.

ليست كل أيقونة بحاجة إلى الانعكاس. زر التشغيل والساعة وعلامة الصح تعني الشيء نفسه في الاتجاهين؛ أما سهم «رجوع» أو اتجاه المنزلق (slider) فلا. اسأل أحد الناطقين باللغة حين لا تكون متأكّدًا.

الخط العربي في قاعدتين

الأولى: لا تطبّق letter-spacing على العربية أبدًا. الحروف العربية تتّصل بما يجاورها؛ وتبعيدها يقطع هذا الوصل ويجعل الكلمات صعبة القراءة. إن كان نظام التصميم لديك يضيف تباعدًا للتسميات بالأحرف الكبيرة، فأعده إلى الصفر بـ :lang(ar) { letter-spacing: 0; }. والثانية: كثيرًا ما تحتاج العربية إلى حجم خط وارتفاع سطر أكبر قليلًا من النص اللاتيني لتظهر بالوزن البصري نفسه. اضبط ذلك لكل لغة بـ :lang(ar) لا لكل component.

دورك الآن

بطاقة التمرين مكتوبة بخصائص فيزيائية. حوّلها إلى خصائص منطقية واعكس السهم في RTL. تعرض الفحوصات البطاقة في الاتجاهين. وبعدها ستستبدل الألوان السداسية (hex) في البطاقة بـ oklch()، وتبني لوحات ألوان المسارات بـ color-mix().

أهم النقاط

  • الخصائص المنطقية تصف التخطيط نسبةً إلى اتجاه النص: margin-inline-start هي الـ margin اليسرى في الإنجليزية واليمنى في العربية.
  • ضبط dir="rtl" على الجذر يعكس flexbox وgrid والخصائص المنطقية تلقائيًا؛ أما الخصائص الفيزيائية مثل padding-left فتبقى حيث هي.
  • الـ transforms ومواضع الخلفيات والظلال والأيقونات الاتجاهية لا تنعكس، لذا تعامل معها صراحةً بـ :dir(rtl).
  • لا تضف letter-spacing إلى النص العربي أبدًا؛ فهي تقطع الوصل بين الحروف.

قراءات إضافية

تحقّق من فهمك

4 أسئلة

السؤال 1 من 4

لبطاقة padding-left: 20px; border-left: 6px solid. ضبطت dir="rtl" على <html>. أين أصبح الـ padding والحدّ الآن؟

السؤال 2 من 4

في صف flex له justify-content: flex-start داخل صفحة dir="rtl"، من أين تبدأ العناصر؟

السؤال 3 من 4

لرابط «Details →» أيقونة سهم يجب أن تشير إلى الاتجاه المعاكس في العربية. أيّ قاعدة تحقّق ذلك؟

السؤال 4 من 4

أيّ تصريح يضبط عرض بطاقة الجلسة بطريقة تعمل أيضًا في أنماط الكتابة الرأسية؟

تدريب

بيئة تجريب الكود

اجعل البطاقة تعمل من اليمين إلى اليسار

البطاقة مكتوبة بخصائص فيزيائية، لذا تنكسر حين يتحوّل الغلاف إلى dir="rtl". دون تغيير الـ HTML:

  • استبدل الحدّ الأيسر، والـ padding الأيسر والأيمن، والـ margin اليمنى للوقت، وقيم text-align، والـ margin اليسرى للسهم بنظائرها المنطقية، بحيث تبدو النسخة الإنجليزية كما هي تمامًا.
  • في RTL اعكس أيقونة السهم أفقيًا (استخدم :dir(rtl)).

تعرض الفحوصات البطاقة في الاتجاهين.

<div class="wrap" dir="ltr">
  <article class="session-card">
    <span class="time">09:30</span>
    <h3>Logical Properties for Real Products</h3>
    <a class="more" href="#details">Details <span class="arrow" aria-hidden="true">→</span></a>
  </article>
</div>جارٍ تحميل المحرّر…

Ctrl/⌘ + Enter للتشغيل · يعمل في بيئة معزولة داخل متصفّحك. لا شيء يغادر جهازك.

المعاينة

الـ console

(لا مخرجات)

الفحوص

  • في الإنجليزية تبدو البطاقة تمامًا كما كانت
  • في RTL يقع الحدّ الملوّن على اليمين
  • في RTL يتبع الـ padding اتجاه النص
  • في RTL تقع المسافة التي تلي الوقت على يساره
  • في RTL يُحاذى الرابط إلى النهاية وتنعكس مسافة السهم
  • في RTL يُعكس السهم