The CSS Podcast - 005: Inheritance
لنفترض أنّك كتبت بعض رموز CSS لجعل العناصر تبدو كزر.
<a href="http://example.com" class="my-button">I am a button link</a>
.my-button {
display: inline-block;
padding: 1rem 2rem;
text-decoration: none;
background: pink;
font: inherit;
text-align: center;
}
بعد ذلك، أضِف عنصر رابط إلى مقالة محتوى، مع قيمة class
تساوي .my-button
. ومع ذلك، هناك مشكلة، فالنص ليس باللون الذي توقعته. كيف حدث ذلك؟
ترث بعض خصائص CSS إذا لم تحدّد لها قيمة.
في حالة هذا الزرّ، تمّت وراثة color
من خدمة CSS هذه:
article a {
color: maroon;
}
في هذا الدرس، ستتعرّف على سبب حدوث ذلك وكيفية الاستفادة من ميزة التوريث القوية لمساعدتك في كتابة عدد أقل من تعليمات CSS البرمجية.
مسار الاكتساب
إليك مثالاً على كيفية عمل الميراث باستخدام مقتطف HTML هذا:
<html>
<body>
<article>
<p>Lorem ipsum dolor sit amet.</p>
</article>
</body>
</html>
لن يرث العنصر الجذر (<html>
) أي شيء لأنّه العنصر الأول في المستند.
أضِف بعض CSS إلى عنصر HTML،
وسيبدأ في التتالي إلى أسفل المستند.
html {
color: lightslategray;
}
يتم تلقائيًا اكتساب سمة color
من قِبل عناصر أخرى.
يحتوي العنصر html
على color: lightslategray
،
لذلك ستتضمّن جميع العناصر التي يمكنها اكتساب اللون الآن اللون lightslategray
.
body {
font-size: 1.2em;
}
p {
font-style: italic;
}
سيتضمّن <p>
نصًا مائلاً فقط لأنّه العنصر المتداخل الأعمق.
لا تنتقل السمة الموروثة إلا إلى الأسفل، وليس إلى العناصر الأصلية.
ما هي الخصائص التي يتمّ اكتسابها تلقائيًا؟
لا يتم تلقائيًا اكتساب جميع خصائص CSS، ولكن هناك العديد من الخصائص التي يتم اكتسابها. للعلم، إليك القائمة الكاملة بالخصائص التي يتم توريثها تلقائيًا، وهي مأخوذة من مرجع W3 لجميع خصائص CSS:
- السمت
- border-collapse
- border-spacing
- caption-side
- color
- cursor
- الاتجاه
- empty-cells
- font-family
- font-size
- font-style
- font-variant
- font-weight
- الخط
- letter-spacing
- line-height
- list-style-image
- list-style-position
- list-style-type
- list-style
- الأيتام
- عروض أسعار تقديرية
- text-align
- text-indent
- text-transform
- visibility
- white-space
- widows
- word-spacing
طريقة عمل الميراث
يحتوي كل عنصر HTML على كل خاصية CSS محدّدة تلقائيًا بقيمة أولية. القيمة الأولية هي خاصية غير موروثة وتظهر كقيمة تلقائية إذا تعذّر على التتالي حساب قيمة لهذا العنصر.
تتتالى الخصائص التي يمكن أن يتم توريثها نزولاً،
وستحصل العناصر الفرعية على قيمة محسوبة تمثّل قيمة العنصر الرئيسي.
هذا يعني أنّه إذا تم ضبط font-weight
على bold
في العنصر الرئيسي، ستظهر جميع العناصر الثانوية بخط عريض، ما لم يتم ضبط font-weight
على قيمة مختلفة، أو إذا كان لورقة الأنماط الخاصة بوكيل المستخدم قيمة font-weight
لهذا العنصر.
كيفية تحديد الإرث والتحكّم فيه بشكل صريح
يمكن أن يؤثر التوريث في العناصر بطرق غير متوقعة، لذا توفّر CSS أدوات للمساعدة في ذلك.
الكلمة الرئيسية inherit
يمكنك جعل أي سمة ترث القيمة المحسوبة الخاصة بسمتها الرئيسية باستخدام الكلمة الرئيسية inherit
.
من الطرق المفيدة لاستخدام هذه الكلمة الرئيسية إنشاء استثناءات.
strong {
font-weight: 900;
}
يضبط مقتطف CSS هذا جميع عناصر <strong>
على أن يكون لها قيمة font-weight
تساوي 900
،
بدلاً من القيمة التلقائية bold
، والتي ستكون معادلة للقيمة font-weight: 700
.
.my-component {
font-weight: 500;
}
تضبط الفئة .my-component
قيمة font-weight
على 500
بدلاً من ذلك.
لجعل عناصر <strong>
داخل .my-component
أيضًا font-weight: 500
، أضِف:
.my-component strong {
font-weight: inherit;
}
الآن، ستحتوي عناصر <strong>
داخل .my-component
على قيمة font-weight
تساوي 500
.
يمكنك ضبط هذه القيمة بشكل صريح، ولكن إذا كنت تستخدم inherit
وتغيّر CSS الخاص بـ .my-component
في المستقبل، يمكنك ضمان أنّ <strong>
سيظل محدّثًا تلقائيًا.
الكلمة الرئيسية initial
يمكن أن يتسبّب التوريث في حدوث مشاكل في العناصر، وتوفّر لك initial
خيار إعادة ضبط فعّال.
لقد تعلّمت سابقًا أنّ كل خاصية لها قيمة تلقائية في CSS.
تعيد الكلمة الرئيسية initial
ضبط إحدى السمات على القيمة التلقائية الأولية.
aside strong {
font-weight: initial;
}
ستؤدي هذه المقتطفة إلى إزالة سمة "الخط العريض" من جميع عناصر <strong>
داخل عنصر <aside>
،
واستبدالها بسمة "الخط العادي"، وهي القيمة الأولية.
الكلمة الرئيسية unset
يختلف سلوك السمة unset
حسب ما إذا كانت السمة موروثة تلقائيًا أم لا.
إذا كانت إحدى السمات موروثة تلقائيًا، ستكون الكلمة الرئيسية unset
هي نفسها inherit
.
إذا لم يتم اكتساب السمة تلقائيًا، تكون الكلمة الرئيسية unset
مساوية initial
.
قد يكون من الصعب تذكُّر خصائص CSS التي يتمّ توريثها تلقائيًا،
unset
يمكن أن يكون مفيدًا في هذا السياق.
على سبيل المثال، يتم تلقائيًا اكتساب قيمة color
،
ولكن لا يتم اكتساب قيمة margin
، لذا يمكنك كتابة ما يلي:
/* Global color styles for paragraph in authored CSS */
p {
margin-top: 2em;
color: goldenrod;
}
/* The p needs to be reset in asides, so you can use unset */
aside p {
margin: unset;
color: unset;
}
الآن، تمت إزالة margin
وعادت color
إلى القيمة المحسوبة المكتسَبة.
يمكنك أيضًا استخدام القيمة unset
مع السمة all
.
بالعودة إلى المثال السابق، ماذا يحدث إذا أضيفت بضع خصائص إضافية إلى أنماط p
العامة؟
سيتم تطبيق القاعدة التي تم ضبطها على margin
وcolor
فقط.
/* Global color styles for paragraph in authored CSS */
p {
margin-top: 2em;
color: goldenrod;
padding: 2em;
border: 1px solid;
}
/* Not all properties are accounted for anymore */
aside p {
margin: unset;
color: unset;
}
إذا غيّرت القاعدة aside p
إلى all: unset
بدلاً من ذلك،
لن يهمّ ما هي الأنماط العامة التي سيتم تطبيقها على p
في المستقبل،
لأنّها ستتم إزالتها دائمًا.
aside p {
margin: unset;
color: unset;
all: unset;
}
الكلمة الرئيسية revert
كما تعلّمت في الدرس حول النمط المتتالي، تأتي الأنماط من مصادر مختلفة، مثل الأنماط الأساسية لوكيل المستخدم، وأنماط إعدادات المستخدم المفضّلة، والأنماط التي أنشأتها. تعمل الكلمة الرئيسية revert
على إلغاء الأنماط التي تم ضبطها في المصدر نفسه الذي يتم فيه استخدام الكلمة الرئيسية revert
.
يكون ذلك مفيدًا عندما تكون قد ضبطت نمطًا، ولكنّك لا تريد تطبيقه في بعض الحالات. في حين تحدّد inherit
وinitial
وunset
كيفية احتساب قيمة نمط معيّن، تحدّد revert
فقط أنّ الأنماط الأخرى التي كتبتها لا تنطبق.
p {
padding: 2em;
}
aside p {
padding: revert;
}
يمنح هذا المقتطف عناصر <p>
مساحة متروكة، ولكن عندما يكون العنصر <p>
داخل <aside>
، لا يحدّد padding
على الإطلاق. بدلاً من ذلك، يعود إلى نمط تفضيلات المستخدم (إذا تم ضبط نمط) أو الأنماط الأساسية لوكيل المستخدم.
الكلمة الرئيسية revert-layer
توفّر الطبقات المتتالية طريقة مفيدة لتنظيم الأنماط وتحديد أولوياتها ضمن مصدر المؤلف في الطبقة المتتالية. تشبه الكلمة الرئيسية revert-layer
الكلمة الرئيسية revert
، ولكن بدلاً من تحديد أنّه يجب عدم تطبيق أي من أنماط المؤلف على إحدى السمات، فإنّها تتراجع فقط عن الأنماط في الطبقة الحالية.
إذا كنت تستخدم مكتبة واجهة مستخدم تابعة لجهة خارجية، يمكنك اتّباع نمط مفيد وهو استيرادها إلى إحدى الطبقات، وإضافة أي عمليات إلغاء إلى طبقة ذات أولوية أعلى. بعد ذلك، يمكنك إزالة عملية إلغاء باستخدام revert-layer
، وسيتم استخدام الإعدادات التلقائية لمكتبة واجهة المستخدم بدلاً من ذلك.
إذا لم تحدّد أي طبقات أخرى قيمة للسمة، ستسلك السمة سلوك revert
، وستستخدم قيمة من مصدر سابق.
التحقّق من فهمك
اختبار معلوماتك عن الوراثة
أيّ من الخصائص التالية يتمّ توريثها تلقائيًا؟
animation
font-size
color
text-align
line-height
أيّ قيمة تتصرف مثل inherit
ما لم يكن هناك ما يمكن توريثه، ثم تتصرف مثل initial
؟
reset
unset
superset