Kodokon kodokon.com

طبقات التتالي (@layer) و@scope

أتقن معياري التتالي الجديدين - الطبقات وقرب النطاق - لهندسة أنماطك دون حروب خصوصية.

10 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

يحسم التتالي التعارض بين التصريحات باستخدام معايير مرتّبة: الأصل والأهمية، ثم السياق، ثم أنماط سمة style، ثم الطبقات (@layer)، ثم الخصوصية، ثم ترتيب الظهور. النقطة الحاسمة: تُقيَّم الطبقات قبل الخصوصية. لذا فإن قاعدة .button في طبقة ذات أولوية أعلى تتغلب على #nav div.menu a.button في طبقة ذات أولوية أدنى - فخصوصيتها البالغة (1,2,2) لا تساوي شيئًا أمام ترتيب الطبقات. هذا ما يجعل @layer قويًا جدًا في هندسة نظام تصميم: تُعلَن الأولوية مرة واحدة، بنيويًا، بدلًا من التنازع عليها محددًا تلو الآخر.

CSS
@layer reset, base, components, utilities;

@layer components {
  .button { background: rebeccapurple; }
}

@layer base {
  button { background: gray; }
}
يُثبِّت الإعلان المسبق الترتيب: components يتغلب على base، بصرف النظر عن ترتيب الكتل في الملف.

دقيقتان في المواصفة عليك معرفتهما حتمًا. الأولى: الأنماط الموجودة خارج أي طبقة تتغلب على الأنماط المُطبَّقة داخل طبقات (بالنسبة إلى التصريحات العادية) - فهي تشكّل طبقة ضمنية توضع في الأخير. لذا تتغلب تجاوزاتك المحلية دائمًا على المكتبة المُطبَّقة داخل طبقات. الثانية: مع !important، ينقلب الترتيب بالكامل. تفوز الطبقات المُعلَنة أولًا، ويتغلب !important داخل طبقة على !important خارج أي طبقة. فتصريح !important في طبقة reset لديك يصبح شبه لا يُقهَر.

CSS
@layer base, theme;

@layer base {
  a { color: black !important; }
}

@layer theme {
  a { color: purple !important; }
}
مع !important، ينقلب الترتيب: يفوز الأسود لأن base مُعلَنة أولًا.

يحدّ @scope مجموعة من القواعد بين جذر النطاق وحد سفلي اختياري: يستهدف @scope (.card) to (.card__content) العناصر التي هي أحفاد لـ .card لكنها خارج .card__content - وهو نطاق الكعكة (donut scope) الشهير، المثالي لتنسيق إطار مكوّن دون التسرب إلى محتواه المحقون. وفي الداخل، يشير :scope إلى الجذر نفسه. ويُدخِل @scope معيار تتالٍ جديدًا تمامًا: القرب. فعند تساوي الخصوصية، تفوز القاعدة التي يكون جذر نطاقها الأقرب إلى العنصر - شيء لم يكن بمقدور BEM ولا المُركِّبات أن يعبّرا عنه قط.

CSS
@scope (.card) to (.card__content) {
  :scope {
    padding: 1rem;
    border: 1px solid oklch(0.85 0.02 260);
  }
  img { border-radius: 8px; }
}
تُستهدف عناصر img في إطار .card؛ أما تلك المحقونة في .card__content فهي خارج النطاق.

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. مع @layer a, b; وتصريحين عاديين متساويي الخصوصية، أحدهما في a والآخر في b، أيهما يُطبَّق؟
    • الذي في الطبقة a، المُعلَنة أولًا
    • الذي في الطبقة b، لأن آخر طبقة مُعلَنة تفوز
    • الذي يظهر أخيرًا في الملف، مع تجاهل الطبقات
  2. تصريح عادي خارج أي طبقة يواجه تصريحًا عاديًا موضوعًا داخل طبقة. النتيجة؟
    • التصريح المُطبَّق داخل طبقة يفوز دائمًا
    • التصريح غير المُطبَّق داخل طبقة يفوز
    • خصوصية المحدد هي التي تحسم
    • يبلّغ المتصفح عن تعارض
  3. في @scope (.card) to (.card__content)، أي عناصر يمكن للقواعد الداخلية استهدافها؟
    • كل أحفاد .card بلا استثناء
    • أحفاد .card الواقعون خارج .card__content (نطاق الكعكة)
    • فقط .card__content وأبناؤه