איך box-shadow עובד
box-shadow צובע צל סביב תיבת הגבול של אלמנט. הוא עוקב אחרי border-radius, לא תופס מקום בפריסה, וצריך לפחות שני ערכים: כמה להזיז אותו אופקית וכמה אנכית.
התחביר
box-shadow: [inset] <offset-x> <offset-y> [<blur>] [<spread>] [<color>];
| ערך | משמעות | ברירת מחדל |
|---|---|---|
inset | מצייר את הצל בתוך התיבה, כמו אזור שקוע | בחוץ |
| offset-x | חיובי מזיז ימינה, שלילי שמאלה | חובה |
| offset-y | חיובי מזיז למטה, שלילי למעלה | חובה |
| blur | כמה רך הקצה; לא יכול להיות שלילי | 0 (קצה חד) |
| spread | מגדיל (חיובי) או מקטין (שלילי) את הצל | 0 |
| color | כל צבע; שחור חצי שקוף נראה בדרך כלל הכי טוב | צבע הטקסט |
מספר האורכים קובע את המשמעות שלהם: שניים הם ההיסטים, שלושה מוסיפים blur, ארבעה מוסיפים spread. נסו:
נסו 0 0 0 4px #f59e0b (טבעת), inset 0 0 12px #2563eb, ו--8px -8px 0 #16a34a.
Spread: טבעות וצללים בצד אחד
Spread משנה את גודל הצל לפני הטשטוש. יוצאים ממנו שני דפוסים:
- טבעת: בלי היסט, בלי blur, רק spread. בניגוד לגבול, היא לא משנה את גודל האלמנט, ולכן היא מחוון פוקוס טוב (
:focus-visible { box-shadow: 0 0 0 3px #2563eb; }). - טבעת עם רווח: ערמו spread לבן מתחת ל-spread צבעוני וגדול יותר.
- צד אחד בלבד: הזיזו את הצל למטה וכווצו אותו עם spread שלילי, כך שהוא מציץ רק מלמטה.
צללים בשכבות לעומק מציאותי
לצללים אמיתיים יש חלק כהה וחד קרוב לאובייקט, וחלק רך וחלש רחוק יותר. שתיים או שלוש שכבות מחקות את זה הרבה יותר טוב מ-blur גדול אחד:
הצל הראשון ברשימה נצבע למעלה. שמרו על צבעי צל של שחור חצי שקוף או גוון כהה של הרקע, אף פעם לא אפור מלא, כדי שהם יכהו את מה שמתחתם.
צללי inset
inset מצייר את הצל בתוך תיבת ה-padding, כאילו המשטח שקוע פנימה. זה מתאים לשדות טקסט, לאזורים שקועים ולכפתורים לחוצים:
input {
box-shadow: inset 0 1px 3px rgb(0 0 0 / 20%);
}
button:active {
box-shadow: inset 0 3px 6px rgb(0 0 0 / 30%);
}
צל inset מצויר מעל הרקע אבל מתחת לתוכן. צללים שעוקבים אחרי צורות האותיות במקום אחרי התיבה הם text-shadow.
טעויות נפוצות
- צללים בשחור מלא ואטום. הם נראים כמו קו מתאר כהה. השתמשו באלפא של 10% עד 30%.
- blur ענק אחד בשביל עומק. שלבו צל קטן וחד עם צל גדול ורך.
- צל שנחתך בקצה. אב קדמון עם
overflow: hiddenחותך אותו; הוסיפו padding לאב הקדמון או העבירו את כלל ה-overflow. - blur שלילי. הוא לא תקין, וכל ההצהרה נזרקת.
- הנפשה של
box-shadowעל הרבה אלמנטים. הוא צובע מחדש בכל פריים. בעמודים כבדים, הנפישו במקום זאת את ה-opacityשל פסאודו-אלמנט שנושא את הצל הגדול יותר.
שאלות נפוצות
מה התחביר של box-shadow?
box-shadow: offset-x offset-y blur spread color;, למשל box-shadow: 0 4px 12px 0 rgb(0 0 0 / 15%);. רק שני ההיסטים הם חובה; הוסיפו inset כדי לצייר את הצל בתוך התיבה.
מה עושה spread ב-box-shadow?
הוא מגדיל (ערך חיובי) או מקטין (ערך שלילי) את הצל לפני הטשטוש. צל בלי היסט, בלי blur ועם spread של 3px הוא טבעת מלאה של 3px סביב האלמנט.
איך שמים צל רק למטה?
מזיזים אותו למטה ומכווצים אותו עם spread שלילי כך שהצדדים נעלמים: box-shadow: 0 8px 6px -6px rgb(0 0 0 / 40%);.
האם box-shadow משפיע על הפריסה?
לא. צל לא תופס מקום ולא מזיז אלמנטים אחרים, ולכן הוא דרך טובה להוסיף טבעת פוקוס או הרמה ב-hover בלי תזוזה בפריסה. הוא יכול להיחתך על ידי overflow: hidden של אב קדמון.
אפשר להגדיר כמה box shadows?
כן, מפרידים ביניהם בפסיקים. הצל הראשון מצויר למעלה. שכבה של צל קטן וחד יחד עם צל גדול ורך נראית טבעית יותר מצל גדול אחד.