أوضاع الكتابة وتخطيط CSS

نشرت: 2022-03-10
ملخص سريع ↬ يعد فهم أوضاع الكتابة في CSS مفيدًا إذا كنت تريد العمل باستخدام البرامج النصية الرأسية أو تغيير وضع الكتابة لأسباب إبداعية. ومع ذلك ، فإنها تدعم أيضًا أساليب التخطيط الجديدة لدينا ، ويتم تطبيق هذه الأفكار بشكل متزايد في جميع CSS. في هذه المقالة ، اكتشف لماذا تعتقد راشيل أندرو أن فهم أوضاع الكتابة مهم جدًا.

هذه ليست مقالة حول التطبيق العملي أو الإبداعي لهذه الخاصية. بدلاً من ذلك ، أريد أن أوضح سبب أهمية فهم أوضاع الكتابة - حتى لأولئك منا الذين نادرًا ما يحتاجون إلى تغيير نمط الكتابة لصفحة أو مكون. يعد دعم أوضاع الكتابة المتعددة مفتاحًا للطريقة التي تم بها تصميم أساليب التخطيط الجديدة الخاصة بنا لـ Flexbox و Grid Layout. يمكن لفهم هذا أن يفتح لك فهماً أفضل لكيفية عمل أساليب التخطيط هذه.

ما هي أوضاع الكتابة؟

يشير وضع كتابة المستند أو المكون إلى الاتجاه الذي يتدفق فيه النص. في CSS ، للعمل مع أوضاع الكتابة ، نستخدم خاصية writing-mode . يمكن أن تأخذ هذه الخاصية القيم التالية:

  • horizontal-tb
  • vertical-rl
  • vertical-lr
  • sideways-rl
  • sideways-lr

إذا كنت تقرأ هذا المقال في Smashing Magazine باللغة الإنجليزية ، فإن وضع الكتابة في هذا المستند هو horizontal-tb ، أو Horizontal Top To Bottom . في اللغة الإنجليزية ، تتم كتابة الجمل أفقياً - يبدأ الحرف الأول من كل سطر على اليسار.

تحتوي لغة مثل العربية أيضًا على وضع كتابة horizontal-tb . إنه مكتوب أفقيًا ، من أعلى إلى أسفل ، ولكن الخط العربي يُكتب من اليمين إلى اليسار ، وهكذا تبدأ الجمل باللغة العربية على اليمين.

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

تتم كتابة المنغولية أيضًا بشكل عمودي ، ولكن من اليسار إلى اليمين. لذلك ، إذا كنت ترغب في تنضيد البرنامج النصي المنغولي ، فستستخدم وضع الكتابة vertical-lr .

المزيد بعد القفز! أكمل القراءة أدناه ↓

تم تصميم القيمتين الأخريين لوضع writing-mode لأغراض إبداعية أكثر من تنضيد النصوص الرأسية. يؤدي استخدام sideways-lr و sideways-rl إلى تحويل النص بشكل جانبي - حتى الأحرف المكتوبة عادةً رأسيًا ومستقيمًا. القيم ، للأسف ، مدعومة فقط في Firefox في الوقت الحالي. يُظهر CodePen التالي جميع القيم المختلفة لوضع writing-mode ، ستحتاج إلى استخدام Firefox إذا كنت تريد رؤية العناصر sideways-* في العمل.

راجع عرض القلم [عرض وضع الكتابة] (https://codepen.io/rachelandrew/pen/dxVVRj) بقلم راشيل أندرو.

شاهد العرض التوضيحي لوضع كتابة القلم بقلم راشيل أندرو.

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

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

  • يحتوي موقع W3C Internationalization على ثروة من المعلومات المفيدة. اقرأ عن نصوص RTL النصية والنص الرأسي.
  • كتب Jen Simmons مقالة ممتازة حول أوضاع كتابة CSS والتي تتضمن أيضًا عدة أمثلة من طباعة هذه الأوضاع قيد الاستخدام.
  • أفكار حول العالم وأنظمة الكتابة لدينا - Chen Hui Jing
  • إعادة النظر في التنضيد الرأسي مع وضع الكتابة - Chen Hui Jing
  • خاصية وضع الكتابة في MDN

الكتلة والأبعاد المضمنة

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

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

نظرًا لأن عناصر الكتلة والعناصر المضمنة تتعلق بوضع الكتابة في وثيقتنا ، فإن البعد المضمّن يكون أفقيًا فقط إذا كنا في وضع كتابة أفقي. لا يتعلق الأمر بالعرض ، ولكن بدلاً من ذلك يتعلق بالحجم المضمّن. يكون بُعد الكتلة عموديًا فقط عندما يكون في وضع الكتابة الأفقي. لذلك لا يتعلق الأمر بالارتفاع ، بل بالحجم.

الخصائص المنطقية ذات الصلة بالتدفق

تُستخدم هذه المصطلحات ، الحجم المضمّن وحجم الكتلة أيضًا كأسماء لخصائص CSS الجديدة المصممة لتعكس عالمنا الواعي لوضع الكتابة الجديد. إذا استخدمت الخاصية inline-size بدلاً من width في وضع الكتابة الأفقي ، فستعمل بنفس طريقة العرض تمامًا - حتى تقوم بتبديل وضع الكتابة للمكون الخاص بك. إذا كنت تستخدم width الذي سيكون دائمًا بُعدًا ماديًا ، فسيكون دائمًا حجم المكون أفقيًا. إذا كنت تستخدم inline-size ، فسيكون هذا هو الحجم في البعد المضمن ، كما يوضح المثال أدناه.

راجع القلم [العرض مقابل الحجم المضمن] (https://codepen.io/rachelandrew/pen/RXLLyd) بقلم راشيل أندرو.

شاهد عرض القلم مقابل الحجم المضمن بواسطة راشيل أندرو.

نفس الشيء صحيح بالنسبة height . ستكون خاصية height دائمًا هي الحجم عموديًا. يتعلق بمدى ارتفاع العنصر. ومع ذلك ، فإن خاصية block-size تعطي الحجم في بُعد الكتلة ، عموديًا إذا كنا في وضع كتابة أفقي وأفقي في وضع رأسي.

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

أوضاع الكتابة والشبكة و Flexbox

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

عندما بدأت في تقديم موضوع شبكة CSS لأول مرة ، كانت عروضي التقديمية المبكرة عبارة عن ملخص لجميع الخصائص في المواصفات. لقد ذكرت أنه يمكن استخدام خاصية grid-area لتعيين جميع الأسطر الأربعة لوضع عنصر الشبكة. ومع ذلك ، لم يكن ترتيب هذه السطور هو الأعلى ، واليمين ، والقاع ، واليسار المألوف الذي نستخدمه لتعيين الهوامش الأربعة. بدلاً من ذلك ، نحتاج إلى استخدام أعلى ، يسار ، أسفل ، يمين - عكس ذلك الترتيب! حتى فهمت العلاقة بين أوضاع الشبكة والكتابة ، بدا هذا قرارًا غريبًا للغاية. أدركت أن ما نقوم به هو تحديد كلا خطي البداية ، ثم كلا خط النهاية. استخدام أعلى ، اليمين ، الأسفل واليسار سيعمل بشكل جيد إذا كنا في وضع كتابة أفقي ، اقلب الشبكة على جانبها ولكن هذا لا معنى له. إذا استخدمنا grid-area: 1 / 2 / 3 / 5; كما هو الحال في القلم أدناه ، يتم تعيين الخطوط على النحو التالي:

  • grid-row-start: 1; - بداية منع
  • grid-column-start: 2 - بداية مضمنة
  • grid-row-end: 3 - نهاية الكتلة
  • grid-column-end: 5 - نهاية مضمنة

راجع القلم [منطقة الشبكة] (https://codepen.io/rachelandrew/pen/zgEEQW) بقلم راشيل أندرو.

انظر منطقة شبكة القلم بقلم راشيل أندرو.

صفوف وأعمدة Flexbox

إذا كنت تستخدم Flexbox وأضفت display: flex إلى حاوية ، فسيتم عرض عناصرك كصف حيث أن القيمة الأولية لخاصية flex-direction هي row . سيتبع الصف البعد المضمن لوضع الكتابة قيد الاستخدام. لذلك إذا كان وضع الكتابة لديك horizontal-tb تشغيل الصف أفقيًا. إذا كان اتجاه النص للنص الحالي من اليسار إلى اليمين ، فستصطف العناصر بدءًا من اليسار ، وإذا كانت من اليمين إلى اليسار ، فسوف تصطف بدءًا من اليمين.

ومع ذلك ، استخدم وضع كتابة رأسي ، مثل vertical-rl flex-direction: row في تخطيط العناصر عموديًا ، حيث يكون الاتجاه الداخلي عموديًا. في هذا CodePen التالي ، جميع الأمثلة لها flex-direction: row ، فقط وضع الكتابة أو الاتجاه قد تغير.

شاهد القلم [flex-direction: row] (https://codepen.io/rachelandrew/pen/XvezrE) بقلم راشيل أندرو.

انظر اتجاه القلم المرن: صف بواسطة راشيل أندرو.

أضف flex-direction: column ، وتخطيط العناصر في بُعد الكتلة في وضع الكتابة الخاص بك. في وضع الكتابة الأفقي ، يكون بُعد الكتلة من أعلى إلى أسفل ، وبالتالي يكون العمود رأسيًا. مع وضع الكتابة vertical-rl يكون العمود أفقيًا. كما هو الحال مع المثال السابق ، فإن الاختلاف الوحيد بين التنسيقات المرنة أدناه هو وضع الكتابة المستخدم.

راجع القلم [المرن الاتجاه: العمود] (https://codepen.io/rachelandrew/pen/RXLjbX) بقلم راشيل أندرو.

انظر اتجاه القلم المرن: عمود بقلم راشيل أندرو.

شبكة التنسيب التلقائي

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

راجع القلم [صف وضع الشبكة التلقائي] (https://codepen.io/rachelandrew/pen/eqGeYV) بقلم راشيل أندرو.

شاهد صف التنسيب التلقائي لشبكة Pen Grid بقلم راشيل أندرو.

حاول تغيير تدفق العناصر إلى column كما في المثال أدناه. ستتدفق العناصر الآن في بُعد الكتلة - عموديًا في وضع كتابة أفقي وأفقياً في وضع عمودي.

راجع القلم [عمود الموضع التلقائي للشبكة] (https://codepen.io/rachelandrew/pen/xvXPby) بقلم راشيل أندرو.

راجع عمود الوضع التلقائي لشبكة القلم بقلم راشيل أندرو.

وضع خط الشبكة

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

قم بتغيير وضع الكتابة إلى vertical-rl وسيكون العمود 1 في أعلى الشبكة ، ويمتد العنصر إلى مسارين عموديًا. لا يزال يمتد على عمودين ، ولكن الأعمدة تعمل الآن أفقيًا.

راجع القلم [الهوامش: الأشقاء المجاورون] (https://codepen.io/rachelandrew/pen/mNBqEy) بقلم راشيل أندرو.

انظر هوامش القلم: أشقاء متجاورون بقلم راشيل أندرو.

المحاذاة في الشبكة و Flexbox

واحدة من الأماكن الأولى التي يتعامل معها العديد من الأشخاص مع الطريقة التي تعامل بها Flexbox مع أوضاع الكتابة ، ستكون عند محاذاة العناصر في تخطيط مرن. إذا أخذنا flex-direction: row المثال أعلاه ، واستخدمنا الخاصية justify-content لمحاذاة جميع العناصر flex-end تتحرك العناصر إلى نهاية صفها. هذا يعني أنه في وضع الكتابة الأفقي مع توجيه من اليسار إلى اليمين ، تتحرك العناصر جميعها إلى اليمين ، حيث تكون نهاية هذا الصف على اليمين. إذا كان الاتجاه من اليمين إلى اليسار ، فإنهم جميعًا يتحركون إلى اليسار.

في وضع الكتابة العمودي ، ينتقلون إلى الأسفل ، بافتراض وجود مساحة لهم للقيام بذلك. لقد قمت بتعيين inline-size على المكونات في هذا المثال للتأكد من أن لدينا مساحة احتياطية في حاوياتنا المرنة لرؤية المحاذاة أثناء العمل.

المحاذاة أسهل قليلاً للفهم في تخطيط الشبكة ، حيث لدينا دائمًا محورين للعب بهما. الشبكة ثنائية الأبعاد ، وهذان البعدان عبارة عن كتلة ومضمنة. لذلك ، يمكنك تذكر قاعدة واحدة إذا كنت تريد معرفة ما إذا كنت تريد استخدام الخصائص التي تبدأ align- أو تلك التي تبدأ justify- . في تخطيط الشبكة ، يتم استخدام خصائص align- : - align-content ، align-items ، align-self للقيام بمحاذاة محور الكتلة. في وضع الكتابة الأفقي يعني عموديًا ، وفي وضع الكتابة الرأسي أفقيًا.

مرة أخرى ، لا نستخدم اليسار واليمين أو أعلى وأسفل ، لأننا نريد أن يعمل تخطيط الشبكة بنفس الطريقة تمامًا بغض النظر عن وضع الكتابة. لذلك نقوم بالمحاذاة باستخدام start end . إذا قمنا بالمحاذاة start من بعد الكتلة ، فسيكون ذلك في top عندما يكون في الوضع horizontal-tb ، ولكن سيكون right عندما يكون في الوضع vertical-rl . ألق نظرة في المثال أدناه ، قيم المحاذاة متطابقة في كلتا الشبكتين ، والفرق الوحيد هو وضع الكتابة المستخدم.

راجع القلم [الهوامش: الأشقاء المجاورون] (https://codepen.io/rachelandrew/pen/jgGaML) بقلم راشيل أندرو.

انظر هوامش القلم: أشقاء متجاورون بقلم راشيل أندرو.

يتم دائمًا استخدام الخصائص justify-content و justify-items و justify-self للمحاذاة المضمنة في تخطيط الشبكة. سيكون ذلك أفقيًا في وضع كتابة أفقي وعموديًا في وضع كتابة رأسي.

راجع القلم [الهوامش: الأشقاء المجاورون] (https://codepen.io/rachelandrew/pen/RXLjpP) بقلم راشيل أندرو.

انظر هوامش القلم: أشقاء متجاورون بقلم راشيل أندرو.

تعد محاذاة Flexbox معقدة إلى حد ما بسبب حقيقة أنه يمكن تبديل المحور الرئيسي من صف إلى عمود. لذلك ، في Flexbox ، نحتاج إلى التفكير في طريقة المحاذاة باعتبارها المحور الرئيسي مقابل المحور المتقاطع. يتم استخدام خصائص align- على المحور المتقاطع. على المحور الرئيسي ، كل ما لديك هو justify-content لأننا نتعامل مع العناصر كمجموعة في Flexbox. على المحور العرضي ، يمكنك استخدام align-content في الحالات التي يكون لديك فيها عدة خطوط مرنة ومساحة في الحاوية المرنة لتباعدها. يمكنك أيضًا استخدام align-items align-self لتحريك العناصر المرنة على المحور المتقاطع فيما يتعلق ببعضها البعض والخط المرن الخاص بهم.

راجع القلم [محاذاة Flexbox] (https://codepen.io/rachelandrew/pen/YmrExP) بقلم راشيل أندرو.

انظر محاذاة Pen Flexbox بواسطة Rachel Andrew.

لمزيد من المعلومات حول المحاذاة في تخطيط CSS ، راجع مقالاتي السابقة في مجلة Smashing:

  • كيفية محاذاة الأشياء في CSS
  • كل ما تحتاج لمعرفته حول المحاذاة في Flexbox

الوعي بوضع الكتابة وأقدم CSS

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

راجع القلم [Multicol ووضع الكتابة] (https://codepen.io/rachelandrew/pen/pMWdLL) بقلم راشيل أندرو.

شاهد القلم Multicol ووضع الكتابة بقلم راشيل أندرو.

كما ترى ، تدعم أوضاع الكتابة الكثير مما نقوم به في CSS ، حتى لو لم نستخدم وضع كتابة بخلاف الوضع horizontal-tb .

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