ماذا تفعل opacity
تضبط opacity مدى شفافية العنصر: 1 معتم (الافتراضي)، و0 غير مرئي، وأي قيمة بينهما تترك الخلفية تظهر عبره. تقع الصناديق أدناه على خلفية مخططة كي تراها:
الصندوق الأخير ما زال موجودًا: يشغل خانته البالغة 90px في الصف، لكنه لا يرسم شيئًا. لاحظ أن الأرقام البيضاء تبهت مع صناديقها. تنطبق opacity على العنصر وكل ما بداخله.
خلفية شفافة ونص معتم
لأن الشفافية تبهت الأبناء أيضًا، فهي الأداة الخاطئة لـ «خلفية شفافة خلف نص مقروء». استخدم لون خلفية بقناة ألفا بدلًا من ذلك:
كلتا اللوحتين البيضاوين تُظهر الخطوط بالمقدار نفسه. في الأولى يبهت النص مع اللوحة. وفي الثانية لون الخلفية وحده شفاف (rgb(255 255 255 / 0.6)، وهو نفسه rgba(255, 255, 255, 0.6))، فيبقى النص معتمًا وسهل القراءة. الألوان بقناة ألفا مشروحة في صفحة الألوان.
لا يستطيع الابن الإفلات من شفافية أبيه: opacity: 1 على الابن لا تفعل شيئًا، لأن الأب يُرسم كطبقة واحدة باهتة والابن بداخلها أصلًا.
القيم
| القيمة | النتيجة |
|---|---|
1 أو 100% | معتم تمامًا (الافتراضي) |
0.5 أو 50% | نصف شفاف |
0 أو 0% | شفاف تمامًا، ما زال في التخطيط ويمكن النقر عليه |
1.5، -1 | تُحصر إلى 1 و0 |
الشفافية تُورَّث بصريًا لا كخاصية: تبقى قيمة opacity المحسوبة للابن 1، بينما يُرسم داخل أب باهت.
opacity: 0 مقابل visibility: hidden مقابل display: none
الثلاث تجعل العنصر يختفي، لكنها تختلف في كل شيء آخر:
opacity: 0 | visibility: hidden | display: none | |
|---|---|---|---|
| يشغل مساحة | نعم | نعم | لا |
| يستقبل النقرات والتركيز | نعم | لا | لا |
| تقرؤه قارئات الشاشة | نعم | لا | لا |
| يمكن تحريكه بانتقال | نعم، بسلاسة | يتبدل عند أحد الطرفين، بلا تلاشٍ | لا |
الفرق الذي يفاجئ هو الصف الثاني. الزر ذو opacity: 0 ما زال يمكن النقر عليه والوصول إليه بـ Tab:
تسأل القراءة المتصفح عن العنصر الموجود تحت نقطة داخل كل زر مخفي. زر opacity: 0 يجيب «قابل للنقر»؛ وزر visibility: hidden لا يجيب. ويبدأ الزر Visible بعد خانتين فارغتين بعرض 150px، لأن زر display: none هو الوحيد الذي أعاد مساحته. لإخفاء شيء بالتلاشي ثم إزالته، حرّك opacity واضبط visibility: hidden في النهاية.
التلاشي عند التمرير
opacity من أرخص الخصائص تحريكًا، لذلك هي الطريقة المعتادة لإظهار الأشياء وإخفائها بالتلاشي. وصف يظهر فوق صورة:
تُظهر :focus-within الوصف لمستخدمي لوحة المفاتيح أيضًا. وتذكّر الجدول أعلاه: أثناء اختفاء الوصف ما زالت قارئات الشاشة تقرؤه، وهذا ما تريده لوصف صورة.
سهولة الوصول: النص الباهت يفقد تباينه
خفض الشفافية يخفض التباين. النص الرمادي على الأبيض مع opacity: 0.5 قد ينزل كثيرًا تحت نسبة 4.5:1 التي يحتاجها نص الجسم. للنص الثانوي اختر لونًا يجتاز فحص التباين بدل إبهات لون داكن. ولعناصر التحكم المعطلة، الشفافية المنخفضة إشارة شائعة، لكن اقرنها بالسمة disabled كي يصبح العنصر أيضًا غير قابل للوصول بلوحة المفاتيح ويُعلن عنه كمعطل.
أثر جانبي: سياق التراكب
أي opacity أقل من 1 تنشئ سياق تراكب جديدًا، كما تفعل transform. الأبناء ذوو z-index المرتفعة يتراكبون عندها داخل العنصر الباهت فقط ولا يستطيعون الارتفاع فوق عناصر خارجه. إن انزلقت قائمة منسدلة داخل لوحة باهتة تحت عنصر آخر، فهذا هو السبب (تشرح صفحة z-index التراكب).
أخطاء شائعة
- إبهات بطاقة لجعل خلفيتها شفافة. يبهت النص أيضًا. استخدم
rgb(... / 0.5)على الخلفية. - محاولة جعل الابن معتمًا من جديد. شفافية الأب تحد كل ابن.
- الإخفاء بـ
opacity: 0وحدها. ما زال العنصر يستقبل النقرات والتركيز. أضفvisibility: hidden، أو استخدمdisplay: none(توقفpointer-events: noneالنقرات لكن لا توقف تركيز لوحة المفاتيح). - كتابة
opacity: 50. الشفافية من 0 إلى 1؛ و50تُحصر إلى1. اكتب0.5أو50%. - نص منخفض التباين بسبب الشفافية. افحص تباين النتيجة، لا تباين اللون الأصلي.
الأسئلة الشائعة
ماذا تفعل opacity في CSS؟
تضبط مدى شفافية العنصر، من 0 (شفاف تمامًا) إلى 1 (معتم تمامًا). تنطبق على العنصر كله، بنصه وحده وصوره وكل أبنائه، كطبقة واحدة مدمجة.
كيف أجعل الخلفية وحدها شفافة من دون النص؟
اترك opacity كما هي وأعطِ الخلفية لونًا بقناة ألفا: background-color: rgb(37 99 235 / 0.5); أو rgba(37, 99, 235, 0.5). يبقى النص والأبناء معتمين تمامًا.
هل يمكن أن يكون الابن أكثر عتامة من أبيه؟
لا. شفافية الأب تنطبق على المجموعة كلها، فلا تستطيع opacity: 1 على الابن إلغاءها. ابن الأب ذي القيمة 0.5 يُرسم بنصف العتامة على الأكثر. انقل الشفافية إلى لون خلفية الأب بدلًا من ذلك.
ما الفرق بين opacity: 0 وvisibility: hidden وdisplay: none؟
تخفي opacity: 0 العنصر لكنه ما زال يشغل مساحة، ويمكن النقر عليه، وتقرؤه قارئات الشاشة. وتحفظ visibility: hidden المساحة لكنه لا يُنقر ولا يُقرأ. أما display: none فتزيله من التخطيط تمامًا.
هل يمكن أن تكون opacity نسبة مئوية؟
نعم. opacity: 50% هي نفسها opacity: 0.5 في كل المتصفحات الحالية. والقيم تحت 0 أو فوق 1 تُحصر في هذا النطاق.