תכונות לוגיות

The CSS Podcast - 012: מאפיינים לוגיים

תבנית נפוצה מאוד בממשק המשתמש היא תווית טקסט עם סמל בתוך השורה.

הסמל מופיע משמאל לטקסט עם רווח קטן בין השניים, שסופק על ידי margin-right על הסמל. עם זאת, יש בעיה, מכיוון שהדבר פועל רק כאשר כיוון הטקסט הוא משמאל לימין. אם כיוון הטקסט השתנה מימין לשמאל - כך תקרא ערבית - הסמל ימוקם מול הטקסט.

איך השירותים האלה מתייחסים לשירות ה-CSS? מאפיינים לוגיים מאפשרים לפתור את המצבים האלה. בין שאר היתרונות, הם מספקים תמיכה אוטומטית בחינם להתאמה לשוק הבינלאומי. הם עוזרים ליצור ממשק קצה עמיד יותר שמעודד את קבלת האחר.

טרמינולוגיה

המאפיינים הפיזיים של החלק העליון, הימני, התחתון והשמאלי מתייחסים לממדים הפיזיים של אזור התצוגה. אפשר לחשוב עליהם כעל שושנת רוח על מפה. מצד שני, מאפיינים לוגיים מתייחסים לקצוות של תיבה בהקשר של זרימת התוכן. לכן הם עשויים להשתנות אם כיוון הטקסט או מצב הכתיבה משתנים. זהו שינוי גדול מסגנונות כיווניים, והוא מאפשר לנו הרבה יותר גמישות בעיצוב הממשקים.

חסימת התהליך

תהליך החסימה הוא הכיוון שבו ממוקמים בלוקי התוכן. לדוגמה, אם יש שתי פסקאות, רצף החסימה הוא המקום שבו תתבצע הפסקה השנייה. במסמך באנגלית, זרימת החסימה היא מלמעלה למטה. חשבו על כך בהקשר של פסקאות טקסט שעוקבות זו אחר זו, מלמעלה למטה.

שלושה בלוקים, רכיבי div, עם חץ למטה, בשם 'block פרופיל'

זרימה בתוך שורה

הזרימה המוטבעת היא האופן שבו הטקסט עובר במשפט. במסמך באנגלית, הזרימה המוטבעת משמאל לימין. אם משנים את שפת המסמך לערבית (<html lang="ar">), הזרימה בתוך המסמך תהיה מימין לשמאל.

שלוש מילים: &#39;היא מוכרת צדפים&#39;, עם חץ מימין לשמאל, שנקראת &#39;זרימה ישירה&#39;

הטקסט מועבר בכיוון שנקבע בהתאם למצב הכתיבה של המסמך. באפשרותך לשנות את כיוון הפריסה של הטקסט בעזרת המאפיין writing-mode. אפשר להחיל את ההגדרה הזו על כל המסמך או על רכיבים ספציפיים.

זרימה יחסית

בעבר, ב-CSS, הצלחנו להחיל רק מאפיינים כמו שוליים ביחס לכיווניות שלהם. לדוגמה, הפקודה margin-top מוחלת על החלק העליון הפיזי של הרכיב. עם מאפיינים לוגיים, margin-top הופך ל-margin-block-start. כלומר, ללא קשר לשפה ולכיוון הטקסט, לתהליך החסימה יש כללים מתאימים של שוליים.

תרשים שמציג את כל הגדלים השונים של קופסה ומראה איפה כל קטע של מידות מתחיל ומסתיים

התאמת גודל

כדי שרכיב לא יחרוג מרוחב או מגובה מסוימים, צריך לכתוב כלל כזה:

.my-element {
  max-width: 150px;
  max-height: 100px;
}

המקבילים היחסיים לזרימה הם max-inline-size ו-max-block-size. אפשר גם להשתמש ב-min-block-size וב-min-inline-size במקום ב-min-height וב-min-width.

בעזרת מאפיינים לוגיים, הכלל המקסימלי של רוחב וגובה ייראה כך:

.my-element {
  max-inline-size: 150px;
  max-block-size: 100px;
}

התחלה וסיום

במקום להשתמש במסלול כמו החלק העליון, החלק הימני, התחתון והשמאלי, השתמשו בהתחלה ובסוף. כך ניתן לחסום התחלה, סיום מוטבע, סיום כולל והתחלה מוטבעת. הם מאפשרים להחיל מאפייני CSS שמגיבים לשינויים במצב הכתיבה.

לדוגמה, כדי ליישר טקסט לימין, אפשר להשתמש ב-CSS הבא:

p {
  text-align: right;
}

אם המטרה שלכם היא לא ליישר קו לימין הפיזי, אלא בתחילת כיוון הקריאה, לא תוכלו להיעזר בזה. עם ערכים לוגיים אפשר למצוא ערכים מועילים יותר של start ו-end שממופים לכיוון הטקסט. כלל יישור הטקסט נראה עכשיו כך:

p {
  text-align: end;
}

ריווח ומיקום

המאפיינים הלוגיים של margin, padding ו-inset מאפשרים לרכיבי מיקום וקובעים את האינטראקציה בין הרכיבים האלה במצבי כתיבה לקלים ויעילים יותר. המאפיינים שקשורים לשוליים ולמרווח הפנימי עדיין נחשבים למיפויים ישירים לכיוונים, אבל ההבדל העיקרי הוא שכאשר מצב הכתיבה משתנה, הם משתנים יחד איתו.

.my-element {
  padding-top: 2em;
  padding-bottom: 2em;
  margin-left: 2em;
  position: relative;
  top: 0.2em;
}

הפעולה הזו מוסיפה אנכי בתוך החלל באמצעות padding ודוחפת אותו החוצה משמאל באמצעות margin. המאפיין top גם מזיז אותו למטה. עם שווי ערך של מאפיינים לוגיים, הטקסט ייראה כך:

.my-element {
  padding-block-start: 2em;
  padding-block-end: 2em;
  margin-inline-start: 2em;
  position: relative;
  inset-block-start: 0.2em;
}

הפעולה הזו מוסיפה קטע שקושר בתוך החלל באמצעות padding, ודוחפת אותו החוצה מ-margin מההתחלה. הנכס inset-block מעביר אותו פנימה מבלוק ההתחלה.

הנכס inset-block הוא לא אפשרות הקיצור היחידה עם מאפיינים לוגיים. אפשר לדחוס את הכלל הזה עוד יותר, באמצעות גרסאות מקוצרות של מאפייני השוליים והמרווח הפנימי.

.my-element {
  padding-block: 2em;
  margin-inline: 2em 0;
  position: relative;
  inset-block: 0.2em 0;
}

גבולות

אפשר להוסיף את border ו-border-radius גם באמצעות מאפיינים לוגיים. כדי להוסיף גבול בצד ימין ולמטה, עם רדיוס מימין, ניתן לכתוב כלל כך:

.my-element {
  border-bottom: 1px solid red;
  border-right: 1px solid red;
  border-bottom-right-radius: 1em;
}

לחלופין, אפשר להשתמש במאפיינים לוגיים כמו:

.my-element {
  border-block-end: 1px solid red;
  border-inline-end: 1px solid red;
  border-end-end-radius: 1em;
}

ה-end-end ב-border-end-end-radius הוא סוף הבלוק וגם הסיום המוטבע.

יחידות

מאפיינים לוגיים מביאים שתי יחידות חדשות: vi ו-vb. יחידת vi מהווה 1% מגודל אזור התצוגה בכיוון השורה. הפונקציה המקבילה למאפיין שאינו לוגי היא vw. היחידה vb מהווה 1% מאזור התצוגה בכיוון הבלוק. הפונקציה המקבילה למאפיין שאינו לוגי היא vh.

היחידות האלה תמיד ימופו לכיוון הקריאה. לדוגמה, אם רוצים שרכיב יתפוס 80% מהשטח הזמין ברצף של אזור תצוגה, שימוש ביחידה vi יגרום לכך שהגודל הזה ישתנה באופן אוטומטי מלמעלה למטה כאשר מצב הכתיבה אנכי.

שימוש במאפיינים לוגיים באופן פרגמטי

התכונות הלוגיות ומצבי הכתיבה לא מיועדים רק לבינלאומיות. תוכלו להשתמש בהם כדי ליצור ממשק משתמש מגוון יותר.

אם יש לך תרשים עם תוויות על ציר ה-X וציר ה-Y, ייתכן שתרצה שהטקסט בתווית Y יהיה אנכי.

מכיוון שלתווית של ציר Y בהדגמה יש writing-mode של vertical-rl, תוכלו להשתמש באותם ערכי margin בשתי התוויות. הערך margin-block-start חל על שתי התוויות כי התחלת החסימה נמצאת בצד ימין של ציר ה-Y ובחלק העליון של ציר ה-X. בצידי הבלוק-start יש גבול אדום, כך שתוכל לראות אותם.

פתרון הבעיה לגבי הסמל

אחרי שהסברנו מאפיינים לוגיים, אפשר ליישם את הידע הזה בבעיית העיצוב שאיתה התחלנו.

p {
  display: inline-flex;
  align-items: center;
}

p svg {
  width: 1.2em;
  height: 1.2em;
  margin-right: 0.5em;
  flex: none;
}

השוליים הוחלו מימין לרכיב הסמל. כדי שהמרווח בין הסמל לטקסט יתמוך בכל כיוון הקריאה, צריך להשתמש במקום זאת במאפיין margin-inline-end.

p {
  display: inline-flex;
  align-items: center;
}

p svg {
  width: 1.2em;
  height: 1.2em;
  margin-inline-end: 0.5em;
  flex: none;
}

עכשיו, ללא קשר לכיוון ההקראה, הסמל ימקם את עצמו וירווח את עצמו בהתאם.

בדיקת ההבנה

בחינת הידע שלכם במאפיינים לוגיים

כשכותבים ביד, פרק כף היד נע לאורך ציר לוגי?

inline
המילים זורמות ברציפות, כך שכף היד צריכה לזרום בזמן הכתיבה.
block
התוכן עובר כבלוקים ופרק כף היד נע לאורך ציר זה כאשר סוג תוכן אחד מסתיים ומתחיל סוג תוכן אחר.

בודקים את כל הביצועים שמניבים מאפיינים לוגיים

צבעים
הצבע לא משתנה במצב הכתיבה במסמך.
alignment
דוגמאות: flex-start, block-end וגם inline-start
צללים
האזורים הכהים לא משתנים במצב כתיבה של מסמך.
צדי הקופסה
דוגמאות: block-start ו-inline.
גדלים
דוגמאות: inline-size ו-max-block-size.
פינות קופסה
דוגמאות: border-end-end-radius

איזה צד לוגי של מילה מסומן בקו תחתון?

הפעלה מוטבעת
פעולה זו תוסיף קו תחתון משמאל למילה באנגלית.
סוף שורה
פעולה זו תוסיף קו תחתון מימין למילה באנגלית.
התחלת חסימה
פעולה זו תוסיף קו תחתון מעל מילה באנגלית.
סוף הבלוק
טוב מאוד ש-CSS עושה את המיצוב הזה בשבילך.