Menu

CSS Hover: אפקט :hover, :active וצבעי קישורים

הפסאודו-קלאס :hover מעצב אלמנט כל עוד סמן העכבר נמצא מעליו. למדו אפקטי hover לכפתורים ולכרטיסים, מעברים חלקים, צבעי קישורים עם :link, :visited, :hover ו-:active בסדר הנכון, ו-hover במסכי מגע.

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

איך :hover עובד

:hover הוא פסאודו-קלאס שתואם אלמנט כל עוד סמן העכבר נמצא מעליו. הוסיפו אותו לכל סלקטור וכתבו את הסגנונות של מצב ה-hover:

רק ההצהרות שבכלל :hover משתנות; כל השאר נשאר כמו ב-.btn. כשהסמן יוצא, האלמנט חוזר לסגנונות הרגילים שלו.

אפקטי hover חלקים עם transition

שינוי ב-hover הוא מיידי, אלא אם מוסיפים transition לכלל הרגיל (לא לכלל :hover), וכך השינוי מונפש גם בכניסה וגם ביציאה:

transform ו-opacity הם המאפיינים הזולים ביותר להנפשה; הם לא מזיזים את האלמנטים שמסביבם. הנפשה של width, height או margin גורמת לדף לחשב מחדש את הפריסה בכל פריים. משכי זמן, השהיות ועקומות האצה מופיעים בדף של transition ב-CSS.

לקישורים יש ארבעה מצבים קלאסיים, ועוד פוקוס מקלדת, וסדר הכללים חשוב:

פסאודו-קלאסחל כאשר
:linkהקישור עוד לא בוקר
:visitedהכתובת נמצאת בהיסטוריית הדפדפן
:hoverהסמן נמצא מעליו
:activeלוחצים עליו כרגע
:focus-visibleיש עליו פוקוס מקלדת

לכולם אותה ספציפיות, ולכן כששניים תואמים, הכלל המאוחר מנצח. קישור שבוקר ונמצא במצב hover תואם גם את :visited וגם את :hover; אם :visited מופיע אחרון, צבע ה-hover לעולם לא יוצג. הסדר הבטוח הוא Link, Visited, Hover, Active (LVHA):

הדפדפנים מגבילים את מה ש-:visited יכול לשנות, כדי שדפים לא יוכלו לקרוא את ההיסטוריה שלכם. רק מאפיינים שקשורים לצבע (color, background-color, border-color, outline-color ועוד כמה) משפיעים, וסקריפטים תמיד רואים את הערך של קישור שלא בוקר.

:active: המצב הלחוץ

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

hover על הורה כדי לעצב ילד

מצב ה-hover שייך לאלמנט שמתחת לסמן ולכל האבות שלו. לכן .card:hover .title מעצב את הכותרת בכל פעם שחלק כלשהו של הכרטיס נמצא במצב hover, ואותו רעיון חושף אלמנטים מוסתרים:

השורה של :focus-within חשובה: בלעדיה, משתמש מקלדת שמגיע ב-Tab לכפתור Delete היה לוחץ על כפתור בלתי נראה. צרפו לכל חשיפה ב-hover גם כלל של פוקוס.

hover במסכי מגע

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

  • לעולם אל תשימו מאחורי :hover את הדרך היחידה להגיע לתוכן. תפריט שנפתח ב-hover צריך להיפתח גם בלחיצה.
  • עטפו אפקטי hover דקורטיביים בלבד ב-media query שבודקת אם יש מכשיר עם hover אמיתי:
@media (hover: hover) {
  .card:hover { transform: translateY(-4px); }
}

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

  • רווח לפני הנקודתיים. .btn :hover פירושו "אלמנט במצב hover בתוך .btn". כתבו .btn:hover.
  • transition רק בכלל :hover. אז השינוי מונפש בכניסה אבל קופץ חזרה ביציאה. שימו אותו בכלל הרגיל.
  • סדר קישורים שגוי. שמרו על :link, :visited, :hover, :active בסדר הזה.
  • hover בלי סגנון פוקוס. משתמשי מקלדת אף פעם לא מפעילים :hover; תנו לאלמנטים אינטראקטיביים גם סגנון :focus-visible.
  • hover על אלמנט שמכוסה באלמנט אחר. שכבה בלתי נראית מעליו (לרוב פסאודו-אלמנט עם מיקום absolute) עלולה לתפוס את הסמן. pointer-events: none על השכבה פותר את זה.

שאלות נפוצות

איך מוסיפים אפקט hover ב-CSS?

כתבו כלל עם :hover אחרי הסלקטור: .btn:hover { background: #1d4ed8; }. ההצהרות חלות כל עוד הסמן נמצא מעל האלמנט. הוסיפו transition: background 0.2s; לכלל הרגיל כדי להנפיש את השינוי.

מה ההבדל בין :hover ל-:active?

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

באיזה סדר צריך לכתוב את הפסאודו-קלאסים של קישורים?

:link, :visited, :hover, :active (זכרו LVHA, או "LoVe HAte" באנגלית). לכולם אותה ספציפיות, ולכן הכלל המאוחר מנצח; בכל סדר אחר, סגנון של קישור שבוקר או של hover עלול להסתיר את סגנון ה-hover או ה-active.

איך משנים את צבע הקישורים ב-CSS?

עצבו את האלמנט a: a { color: #2563eb; }, ואחר כך a:visited { color: #7c3aed; } ו-a:hover { color: #1d4ed8; } לשאר המצבים. הגדרת color על a חלה גם על קישורים שלא בוקרו וגם על קישורים שבוקרו.

האם hover עובד בנייד?

במסכי מגע אין סמן שנשאר מעל אלמנט. רוב הדפדפנים בנייד מפעילים :hover בהקשה ומשאירים אותו עד שמקישים במקום אחר, וכך סגנון hover עלול להיתקע. עטפו אפקטים שהם hover בלבד ב-@media (hover: hover) ולעולם אל תסתירו תוכן חיוני מאחורי hover.

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

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

להתחיל