מה transform עושה
transform משנה את האופן שבו אלמנט מצויר: מוזז, משנה גודל, מסובב או מוטה. קווי המתאר המקווקווים למטה מראים איפה כל קופסה הייתה בלי ה-transform שלה:
translate(20px, 10px) מזיז את הקופסה הכחולה 20px לאורך השורה ו-10px למטה. scale(1.3) מגדיל את הירוקה ב-30% סביב המרכז שלה. rotate(20deg) מסובב את הענברית עם כיוון השעון, ו-skewX(-20deg) מטה את הכהה. בכל המקרים, המקום המקווקו, שהוא המקום שהאלמנט תופס בפריסה, נשאר בדיוק איפה שהיה.
פונקציות transform
| פונקציה | עושה | דוגמה |
|---|---|---|
translate(x, y) | מזיזה | translate(20px, -10px), translate(-50%, -50%) |
translateX(x) / translateY(y) | מזיזה על ציר אחד | translateY(-4px) |
scale(s) / scale(x, y) | משנה גודל (1 = מקורי, 0.5 = חצי, שלילי משקף) | scale(1.1), scale(-1, 1) |
scaleX(s) / scaleY(s) | משנה גודל על ציר אחד | scaleX(0.5) |
rotate(angle) | מסובבת עם כיוון השעון (שלילי = נגד כיוון השעון) | rotate(45deg), rotate(0.25turn) |
skew(x, y) / skewX(a) / skewY(a) | מטה | skewX(-15deg) |
matrix(a, b, c, d, e, f) | כל מה שלמעלה במטריצה אחת, בעיקר מה שהדפדפן מחזיר | |
none | בלי transform |
אחוזים ב-translate() הם ביחס לגודל של האלמנט עצמו, לא של ההורה שלו. לסיבוב יש דף משלו עם מעלות, סיבובים מלאים וסחרור: CSS rotate.
מגרש משחקים ל-transform
הזיזו את המחוונים. השורה הראשונה היא ערך ה-transform שבניתם; השנייה היא המטריצה שהדפדפן חישב ממנו, וזה מה ש-getComputedStyle מחזיר לכל transform:
transforms לא מזיזים את הפריסה
אלמנט עם transform מצויר במקום אחר, אבל הדף נפרס כאילו אין לו transform. השכנים שלו שומרים על המיקום שלהם. זה מה שהופך transforms לטובים לאפקטי hover ולאנימציה: שום דבר סביבם לא מחושב מחדש.
שתי הקופסאות האמצעיות נראות גדולות פי 1.5. זו עם scale חופפת את השכנים שלה ו-C נשארת במקום; זו שהוגדלה עם width ו-height דוחפת את C עוד 40px הלאה.
כמה transforms והסדר שלהם
שימו כמה פונקציות ב-transform אחד, מופרדות ברווחים. הסדר משנה את התוצאה, כי בקריאה משמאל לימין, כל פונקציה פועלת במערכת הצירים שהשאירו הפונקציות שלפניה:
הקופסה הכחולה זזה 120px ישר לאורך השורה ואז הסתובבה במקום. הקופסה הירוקה הסתובבה קודם, ולכן "ציר ה-x" שלה מצביע באלכסון, ו-translateX(120px) מזיז אותה במורד האלכסון. אותן פונקציות, מקום אחר.
המלכודת השנייה: הצהרת transform שנייה מחליפה את הראשונה. אם לכרטיס יש transform: rotate(-2deg) וכלל ה-hover שלו אומר transform: scale(1.05), הסיבוב נעלם ב-hover. חזרו על שניהם (rotate(-2deg) scale(1.05)), או השתמשו במאפיינים הנפרדים שלמטה.
transform-origin
שינוי גודל, סיבוב והטיה קורים סביב נקודה קבועה, נקודת המוצא של ה-transform, שהיא המרכז כברירת מחדל. משנים אותה עם מילות מפתח, אורכים או אחוזים:
שלוש הקופסאות מסתובבות ב-25 מעלות. הראשונה מסתובבת סביב האמצע שלה, השנייה שומרת את הפינה השמאלית העליונה שלה צמודה לפינת המקום, והשלישית את הפינה הימנית התחתונה. תפריט נפתח שגדל מתוך הכפתור שלו משתמש ב-transform-origin: top עם scale().
המאפיינים translate, scale ו-rotate
לדפדפנים מודרניים יש גם שלושה מאפיינים נפרדים שעושים אותו דבר כמו הפונקציות, אבל אפשר להגדיר ולהנפיש אותם בנפרד:
.card {
rotate: -2deg;
transition: scale 0.2s ease-out;
}
.card:hover {
scale: 1.05; /* the rotation stays, because it is a different property */
}
הם תמיד משתלבים כאילו נכתבו transform: translate(...) rotate(...) scale(...) לפני כל ערך transform, בכל סדר שבו מצהירים עליהם. שימו לב לתחביר: translate: 10px 20px ו-scale: 1.2 מקבלים ערכים בלי הסוגריים של הפונקציה.
מרכוז עם translate(-50%, -50%)
מכיוון שהאחוזים ב-translate() מתייחסים לגודל של האלמנט עצמו, top: 50%; left: 50%; transform: translate(-50%, -50%) ממרכז אלמנט עם מיקום absolute בכל גודל בתוך ההורה שלו. הדף על מרכוז div משווה את זה ל-flexbox ול-grid.
טעויות נפוצות
- שתי הצהרות
transform. המאוחרת מנצחת לגמרי. שלבו את הפונקציות, או השתמשו במאפייניםrotate,scaleו-translate. - transform על אלמנט inline.
<span>או<a>פשוטים מתעלמים מ-transform. הפכו אותם ל-inline-block. - לצפות שהשכנים יזוזו. transforms אף פעם לא משנים את הפריסה. כדי לפנות מקום, שנו
width,marginאוgap. - סדר פונקציות שגוי.
rotate()לפניtranslate()מזיז לאורך הציר המסובב. - הפתעות עם ילדים עם
position: fixed. אלמנט עם transform הופך לבלוק המכיל של צאצאים עם מיקום fixed, כך שכותרת fixed בתוכו נגללת יחד איתו. הוא גם יוצר stacking context חדש עבורz-index.
שאלות נפוצות
מה transform עושה ב-CSS?
הוא משנה את האופן שבו אלמנט מצויר: מוזז (translate), משנה גודל (scale), מסובב (rotate) או מוטה (skew). האלמנט שומר על המקום המקורי שלו בפריסה, כך שהאלמנטים שסביבו לא זזים.
איך מחילים כמה transforms ב-CSS?
כתבו אותם בערך transform אחד, מופרדים ברווחים: transform: translateX(50px) rotate(20deg) scale(1.2);. כתיבת הצהרת transform שנייה מחליפה את הראשונה במקום להוסיף עליה.
האם הסדר של פונקציות transform חשוב?
כן. בקריאה משמאל לימין, כל פונקציה פועלת בצירים שהפונקציות הקודמות השאירו, ולכן rotate(45deg) translateX(100px) מזיז את האלמנט לאורך ציר מסובב, בעוד ש-translateX(100px) rotate(45deg) מזיז אותו ישר ואז מסובב אותו.
מה זה transform-origin?
הנקודה הקבועה שסביבה קורים שינוי הגודל, הסיבוב וההטיה. ברירת המחדל היא המרכז (50% 50%). transform-origin: top left גורם לאלמנט לגדול מהפינה השמאלית העליונה שלו, או להסתובב סביבה.
למה transform לא עובד על ה-span שלי?
transforms לא חלים על אלמנטים inline רגילים כמו <span> או <a> פשוטים. תנו לאלמנט display: inline-block או block וה-transform יעבוד.