كيف يعمل :hover
:hover فئة زائفة تطابق العنصر ما دام مؤشر الفأرة فوقه. أضفها إلى أي محدد واكتب أنماط حالة التمرير:
تتغير التصريحات الموجودة في قاعدة :hover فقط؛ وكل ما عداها يُنقل من .btn. حين يغادر المؤشر يعود العنصر إلى أنماطه العادية.
تأثيرات تمرير سلسة مع transition
تغيير hover فوري ما لم تضف transition إلى القاعدة العادية (لا إلى قاعدة :hover)، فيتحرك التغيير عند الدخول والخروج معًا:
transform وopacity هما أرخص الخصائص تحريكًا؛ فهما لا تحرّكان العناصر المحيطة. تحريك width أو height أو margin يجعل الصفحة تعيد حساب التخطيط في كل إطار. المدد والتأخيرات ومنحنيات التسارع موجودة في صفحة transition في CSS.
ألوان الروابط: :link و:visited و:hover و:active
للروابط أربع حالات كلاسيكية، إضافةً إلى تركيز لوحة المفاتيح، وترتيب القواعد مهم:
| الفئة الزائفة | تنطبق حين |
|---|---|
:link | لم تُزر الرابط بعد |
:visited | يكون العنوان في سجل المتصفح |
:hover | يكون المؤشر فوقه |
:active | يكون قيد الضغط |
:focus-visible | يكون عليه تركيز لوحة المفاتيح |
لكل هذه الفئات الخصوصية نفسها، لذلك تفوز القاعدة اللاحقة حين تتطابق اثنتان. الرابط المزار الذي يمر فوقه المؤشر يطابق :visited و:hover معًا؛ فإن جاءت :visited أخيرًا لا يظهر لون hover أبدًا. الترتيب الآمن هو Link ثم Visited ثم Hover ثم Active (LVHA):
تقيّد المتصفحات ما يمكن لـ :visited تغييره، كي لا تتمكن الصفحات من قراءة سجل تصفحك. الخصائص المتعلقة باللون فقط (color وbackground-color وborder-color وoutline-color وبضع خصائص أخرى) هي التي تعمل، والسكربتات ترى دائمًا القيمة غير المزارة.
:active: حالة الضغط
تطابق :active العنصر أثناء الضغط عليه. حركة صغيرة تجعل الزر يبدو ملموسًا:
التمرير فوق الأب لتنسيق الابن
حالة التمرير تخص العنصر الذي تحت المؤشر وكل أسلافه. لذلك تنسق .card:hover .title العنوان كلما مرّ المؤشر فوق أي جزء من البطاقة، والفكرة نفسها تُظهر العناصر المخفية:
سطر :focus-within مهم: من دونه سيضغط مستخدم لوحة المفاتيح الذي ينتقل بـ Tab إلى زر الحذف على زر غير مرئي. اقرن كل إظهار بالتمرير بقاعدة للتركيز.
hover على الشاشات اللمسية
الهواتف والأجهزة اللوحية لا تملك مؤشرًا يستقر فوق العنصر. معظم متصفحات الهاتف تطبّق :hover عند النقرة الأولى وتبقيه حتى تنقر في مكان آخر، فقد يبدو نمط hover عالقًا. قاعدتان تبقيان هذا تحت السيطرة:
- لا تجعل
:hoverأبدًا الطريقة الوحيدة للوصول إلى محتوى. القائمة التي تنفتح بالتمرير يجب أن تنفتح بالنقر أيضًا. - أحط تأثيرات التمرير الزخرفية البحتة باستعلام وسائط يتحقق من وجود جهاز تمرير حقيقي:
@media (hover: hover) {
.card:hover { transform: translateY(-4px); }
}
أخطاء شائعة
- مسافة قبل النقطتين.
.btn :hoverتعني «عنصر ممرَّر فوقه داخل.btn». اكتب.btn:hover. transitionعلى قاعدة:hoverوحدها. عندها يتحرك التغيير عند الدخول لكنه يرتد فجأة عند الخروج. ضعها على القاعدة العادية.- ترتيب خاطئ للروابط. أبقِ
:linkو:visitedو:hoverو:activeبهذا الترتيب. - hover من دون نمط تركيز. مستخدمو لوحة المفاتيح لا يفعّلون
:hoverأبدًا؛ أعطِ العناصر التفاعلية نمط:focus-visibleأيضًا. - hover على عنصر يغطيه عنصر آخر. طبقة غير مرئية (غالبًا عنصر زائف بموضع مطلق) قد تلتقط المؤشر.
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 أو active.
كيف أغيّر لون الرابط في CSS؟
نسّق العنصر a: a { color: #2563eb; }، ثم a:visited { color: #7c3aed; } وa:hover { color: #1d4ed8; } للحالات الأخرى. ضبط color على a يغطي الروابط المزارة وغير المزارة معًا.
هل يعمل hover على الهاتف؟
الشاشات اللمسية لا تملك مؤشرًا يستقر فوق العنصر. معظم متصفحات الهاتف تطبّق :hover عند النقر وتبقيه حتى تنقر في مكان آخر، مما قد يترك نمط hover عالقًا. أحط التأثيرات الخاصة بالتمرير بـ @media (hover: hover) ولا تخفِ أبدًا محتوى أساسيًا خلف hover.