Menu

CSS clamp(): גודל גופן גמיש, min() ו-max()

clamp(MIN, PREFERRED, MAX) מחזיר את הערך המועדף, אבל אף פעם לא פחות מ-MIN או יותר מ-MAX. למדו איך הוא הופך גדלי גופן ומרווחים לגמישים בלי media queries, איך מחשבים את הערך האמצעי, ואיך min() ו-max() קשורים אליו.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

מה clamp() עושה

clamp(MIN, PREFERRED, MAX) מקבל שלושה ערכים ומחזיר את האמצעי, כל עוד הוא נשאר בין שני האחרים. השימוש הקלאסי הוא כותרת שגדלה עם המסך אבל נעצרת בגבולות הגיוניים, בלי media query:

הערך המועדף הוא 1rem + 3vw: 16px ועוד 3% מהרוחב. בתצוגה מקדימה ברוחב 800px זה 16 + 24 = 40px, שנמצא בין 24px (1.5rem) ל-48px (3rem), ולכן הכותרת היא 40px. בטלפון ברוחב 320px הערך המועדף הוא 25.6px. מעבר ל-1067px הוא היה עובר את 48px, ולכן הוא נעצר ב-48px. שנו את גודל החלון כדי לראות את המספר משתנה; vw כאן הוא אחוז מהרוחב של מסגרת התצוגה המקדימה.

לראות את זה בלי לשנות את גודל החלון

vw עוקב אחרי ה-viewport, שקשה לשנות בזמן קריאה. יחידות של container query עוקבות אחרי מכל במקום: cqi הוא 1% מרוחב המכל. גררו את המחוון כדי לשנות את התיבה, ואותו סוג של clamp() מגיב:

החליקו להתחלה והכותרת נעצרת ב-20px (ה-MIN). החליקו לסוף והיא נעצרת ב-40px (ה-MAX). ביניהם היא עוקבת אחרי 0.5rem + 6cqi. זה אותו מנגנון כמו בגרסת ה-vw, עם סרגל קטן יותר.

שלושת הארגומנטים

font-size: clamp(1rem, 0.8rem + 1vw, 1.5rem);
/*               MIN   PREFERRED     MAX    */
ארגומנטתפקידיחידה טיפוסית
MINהערך הקטן ביותר שמותרrem
PREFERREDהערך שמשתנה עם המסךrem + vw (או cqi)
MAXהערך הגדול ביותר שמותרrem

חישובים עובדים בתוך כל ארגומנט בלי לכתוב calc(): 1rem + 2vw תקין כמו שהוא. ל-+ ול-- צריך רווח משני הצדדים, אחרת כל ההצהרה לא תקינה.

אם MIN גדול מ-MAX, MIN מנצח: clamp(3rem, 5vw, 2rem) הוא תמיד 3rem.

חישוב הערך האמצעי

כדי להגדיל גופן מ-16px במסך של 320px ל-24px במסך של 1280px:

  1. שיפוע: (24 − 16) ÷ (1280 − 320) = 8 ÷ 960 = 0.00833, שזה 0.833vw (vw הוא לכל 100px).
  2. נקודת התחלה: 16px − 0.00833 × 320px = 13.33px, שזה 0.833rem.
  3. שימו את הגבולות מסביב:
font-size: clamp(1rem, 0.833rem + 0.833vw, 1.5rem);

ברוחב 320px זה נותן 13.33 + 2.67 = 16px, ברוחב 1280px זה נותן 13.33 + 10.67 = 24px, ומחוץ לטווח הזה הוא נשאר בגבולות. "מחשבוני clamp" ברשת עושים בדיוק את החשבון הזה.

min() ו-max()

clamp() הוא שילוב של שתי פונקציות פשוטות יותר:

  • min(a, b) מחזיר את הערך הקטן יותר, ולכן הוא קובע גבול עליון.
  • max(a, b) מחזיר את הערך הגדול יותר, ולכן הוא קובע גבול תחתון.
  • clamp(MIN, VAL, MAX) זהה ל-max(MIN, min(VAL, MAX)).

השמות נראים הפוכים בהתחלה: כדי לומר "לכל היותר 600px", משתמשים ב-min().

בתצוגה המקדימה הרחבה הכרטיס הראשון נעצר ב-420px. בתוך ההורה של 260px, 100% הוא הערך הקטן יותר, ולכן הכרטיס השני הוא 260px. max(12px, 3%) נותן לכרטיס הראשון 3% מרוחב ההורה שלו (ה-body: בערך 23.5px בתצוגה מקדימה של 800px), ולשני 12px, כי 3% מ-260px (7.8px) נמצא מתחת לרצפה.

width: min(100%, 420px) מחליף את הזוג הישן width: 100%; max-width: 420px; בהצהרה אחת.

מעבר לגדלי גופן: מרווחים ורוחבים

clamp() עובד בכל מאפיין שמקבל אורך. אחוזים בערך האמצעי הופכים רכיב לגמיש ביחס להורה שלו במקום ל-viewport:

בהורה של 300px הכרטיס ברוחב 240px (80%) עם 15px של padding (5% מ-300px). בהורה של 760px, 80% היה 608px, ולכן הכרטיס נעצר במקסימום של 520px, ו-5% מ-760px הם 38px, ולכן ה-padding נעצר ב-32px.

נגישות: השאירו rem בערך האמצעי

גודל גופן שבנוי רק מ-vw, כמו font-size: 5vw, לא גדל כשהקורא מגדיל את גודל הגופן ברירת המחדל בהגדרות הדפדפן, והוא גם לא גדל עם זום בדפדפן, כי זום הופך את ה-viewport לצר יותר בפיקסלים של CSS. הוספה של חלק rem (1rem + 2vw) וגבולות ב-rem שומרת את הטקסט קשור להגדרה של הקורא. עמוד היחידות מסביר את rem ו-vw בפירוט.

טעויות נפוצות

  • שימוש ב-min() בשביל מינימום. min() בוחר את הערך הקטן יותר, וזה גבול עליון. בשביל "לפחות 12px", השתמשו ב-max(12px, ...).
  • אין רווחים סביב + או -. clamp(1rem, 1rem+2vw, 3rem) לא תקין, והמאפיין חוזר לערך הקודם שלו.
  • רק vw באמצע. הטקסט מתעלם אז מהגדרת גודל הגופן של הקורא. הוסיפו איבר rem.
  • MIN גדול מ-MAX. התוצאה היא תמיד MIN, וזה כמעט אף פעם לא מה שהתכוונו.
  • גבולות ב-px לגדלי גופן. הם מגבילים את הטקסט גם לקוראים שצריכים אותו גדול יותר. השתמשו ב-rem.

שאלות נפוצות

מה clamp() עושה ב-CSS?

clamp(MIN, PREFERRED, MAX) משתמש בערך המועדף כל עוד הוא נשאר בין שני הגבולות, ובגבול הקרוב ביותר אחרת. font-size: clamp(1rem, 4vw, 2rem) עוקב אחרי 4% מרוחב ה-viewport, אבל אף פעם לא יורד מתחת ל-1rem או עולה מעל 2rem.

איך יוצרים גודל גופן רספונסיבי עם clamp?

שמים ערך שמבוסס על ה-viewport באמצע וגבולות קבועים בצדדים, ומשלבים rem בערך האמצעי כדי שהטקסט עדיין יעקוב אחרי הגדרת גודל הגופן של הקורא: font-size: clamp(1.5rem, 1rem + 2vw, 3rem);.

מה קורה אם המינימום גדול מהמקסימום ב-clamp()?

המינימום מנצח. clamp(3rem, 5vw, 2rem) תמיד מחושב ל-3rem, כי clamp() מחיל את המינימום אחרי המקסימום.

מה ההבדל בין min() ל-max() ב-CSS?

min() מחזיר את הקטן מבין הערכים שלו, ולכן הוא פועל כגבול עליון: width: min(100%, 600px) אף פעם לא רחב מ-600px. max() מחזיר את הגדול, ולכן הוא פועל כגבול תחתון: font-size: max(1rem, 2vw) אף פעם לא קטן מ-1rem.

האם clamp() נתמך בכל הדפדפנים?

כן, clamp(), min() ו-max() עובדים בכל הגרסאות הנוכחיות של Chrome, Edge, Firefox ו-Safari, ואפשר להשתמש בהם בכל מאפיין שמקבל אורך, מספר, אחוז או זווית.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל