الخصائص المنطقية والمواقع العربية — تصميم CSS
الخصائص المنطقية والمواقع العربية (RTL)
كتبت margin-left: 16px لأيقونة قبل النص، ثم صار الموقع عربياً فأصبحت الأيقونة بعد النص والمسافة في الجهة الخطأ. الخصائص الفيزيائية (left/right/top/bottom) ثابتة على الشاشة، أما المنطقية فتتبع اتجاه الكتابة.
المحوران المنطقيان
| المنطقي | المعنى | في العربية (rtl) | في الإنجليزية (ltr) |
|---|---|---|---|
| inline | اتجاه سير النص في السطر | أفقي | أفقي |
| inline-start | بداية السطر | يمين | يسار |
| inline-end | نهاية السطر | يسار | يمين |
| block | اتجاه تتابع الأسطر/الفقرات | رأسي | رأسي |
| block-start / end | الأعلى / الأسفل | أعلى / أسفل | أعلى / أسفل |
جدول التحويل
| فيزيائي | منطقي |
|---|---|
| margin-left / margin-right | margin-inline-start / margin-inline-end (حسب المعنى) |
| margin-left + margin-right | margin-inline |
| margin-top + margin-bottom | margin-block |
| padding-left | padding-inline-start |
| border-left | border-inline-start |
| left / right (مع position) | inset-inline-start / inset-inline-end |
| text-align: left | text-align: start |
| width / height | inline-size / block-size |
| border-top-left-radius | border-start-start-radius |
.quote {
border-inline-start: 4px solid var(--color-primary); /* خط على اليمين في العربية */
padding-inline-start: 16px;
}
.icon {
margin-inline-end: 8px; /* مسافة بين الأيقونة والنص الذي بعدها */
}
.badge {
position: absolute;
inset-inline-end: 8px; /* الزاوية في نهاية السطر */
top: 8px;
}نفس CSS يعمل صحيحاً في صفحة dir="rtl" وصفحة dir="ltr" دون أي تعديل.
ما ينعكس تلقائياً وما لا ينعكس
ينعكس تلقائياً مع dir="rtl": ترتيب Flexbox (row)، أعمدة Grid، محاذاة start و end، الخصائص المنطقية، مواقع نقاط القوائم.
لا ينعكس (ويجب معالجته):
- left و right وكل الخصائص الفيزيائية.
- transform: translateX(...) — الإشارة لا تنقلب.
- background-position: left.
- الأيقونات الاتجاهية: سهم "التالي" يشير يميناً في الإنجليزية ويساراً في العربية.
[dir="rtl"] .icon-arrow {
transform: scaleX(-1); /* اعكس الأسهم فقط — لا تعكس الشعارات أو أيقونات مثل ✓ */
}
.slide-in {
translate: calc(var(--dir, 1) * 20px) 0;
}
[dir="rtl"] { --dir: -1; }أو استخدم :dir(rtl) في المتصفحات الحديثة: .icon-arrow:dir(rtl) { transform: scaleX(-1); }
أشياء لا تنعكس في الواقع
- الأرقام: تُكتب من اليسار لليمين حتى داخل النص العربي (2026).
- الشيفرة البرمجية والروابط والبريد: اجعلها dir="ltr":
code, pre, kbd, input[type="email"], input[type="url"] {
direction: ltr;
text-align: start; /* تأخذ بداية سطرها الخاص (يسار) */
unicode-bidi: isolate;
}- أزرار التشغيل في الفيديو: ▶ يبقى يشير يميناً عالمياً.
- الرسوم البيانية الزمنية: غالباً تبقى من اليسار لليمين.
النص ثنائي الاتجاه (Bidi)
جملة عربية فيها كلمة إنجليزية في آخرها مع علامة ترقيم قد تظهر بترتيب غريب. الحل في HTML: لفّ الجزء الأجنبي بـ <span dir="ltr"> أو <bdi> للمحتوى غير المعروف (أسماء المستخدمين).
موقع ثنائي اللغة
<html lang="ar" dir="rtl"> <!-- أو lang="en" dir="ltr" للنسخة الإنجليزية -->إذا كتبت CSS كله بخصائص منطقية، تتبدل النسختان بتغيير هذين الحرفين فقط. هذه أكبر فائدة عملية تحصل عليها.
تمرين
ابحث في ملف CSS الخاص بك عن كل left و right و margin-left و padding-right و text-align: right وحوّلها لمنطقية. ثم غيّر dir في صفحتك إلى ltr وتأكد أن كل شيء انعكس صحيحاً.
/* مكوّن بطاقة يعمل في rtl و ltr دون تعديل */
.card {
position: relative;
padding-block: 20px;
padding-inline: 24px;
border-inline-start: 4px solid var(--color-primary, #4f46e5);
border-start-end-radius: 12px;
border-end-end-radius: 12px;
text-align: start;
}
.card .badge {
position: absolute;
top: 12px;
inset-inline-end: 12px;
}
.card .icon {
margin-inline-end: 8px;
}
/* الأسهم الاتجاهية فقط تُعكس */
.icon-arrow:dir(rtl) {
transform: scaleX(-1);
}
/* الشيفرة والبريد والروابط تبقى من اليسار */
code,
pre,
input[type="email"],
input[type="url"] {
direction: ltr;
unicode-bidi: isolate;
text-align: start;
}
/* حاوية متوسطة بهوامش منطقية */
.container {
max-inline-size: 1100px;
margin-inline: auto;
padding-inline: 16px;
}
/* شريط تنقل: Flexbox ينعكس تلقائياً، والهامش التلقائي منطقي */
.navbar {
display: flex;
align-items: center;
gap: 16px;
}
.navbar .login {
margin-inline-start: auto;
}اختبر فهمك