الخلاصة

  • وصفت مسودة W3C في نوفمبر 2018 :has() لاختيار عنصر بحسب ابن أو شقيق يأتي بعده، لكنها استثنتها من ملف مطابقة CSS الحية في تلك النسخة.
  • حذفت مسودة مايو 2022 تقسيم الملفات وجعلت :has() اختيارية ومعرّضة للمراجعة؛ وقيدت نسخة نوفمبر تداخل :has() والعناصر الزائفة داخل وسيطها.

في واجهة صحيفة رقمية، تحمل بعض البطاقات صوراً وتكتفي بطاقات أخرى بعنوان وفقرة قصيرة. البطاقة المصورة تحتاج مساحة مختلفة. يستطيع CSS الوصول من إطار البطاقة إلى الصورة بسهولة، كأن الأب يختار معطف الطفل. أما تغيير الإطار لأنه يحتوي صورة، فكان يحتاج مرسالاً: صنفاً إضافياً في الصفحة، أو سكريبت يفحص الداخل، أو معلومة مكررة في القالب. الصورة واقفة وسط الغرفة، وإطار الغرفة ينتظر ورقة رسمية تثبت حضورها.

جاءت مسودة W3C المؤرخة في 21 نوفمبر 2018 بصيغة السؤال. المثال a:has(> img) يختار رابطاً له صورة ابنة مباشرة. الرابط هو المختار؛ الصورة دليل الشرط. ويعرض النص dt:has(+ dt) أيضاً: اختيار مصطلح تعريف يليه مصطلح آخر مباشرة. هنا يتضح ضيق لقب «محدد الأب». فالاختبار ينظر كذلك إلى الشقيق المجاور. :has() يسأل عن علاقة من نقطة انطلاق العنصر الذي يريد الموقع اختياره.

لكن الوثيقة ذاتها أبقت السؤال خارج جلسة التصميم الحية. قسمت المحددات إلى ملف حي ملائم لمطابقة CSS المستمرة في المتصفح، وملف لقطة ملائم لفحص شجرة مستند ساكنة في لحظة معينة؛ وذكرت querySelector() مثالاً. أدرجت :has() في ملف اللقطة واستبعدتها من الملف الحي. يستطيع المفتش الاستعلام عما داخل البطاقة، فيما تُحرم صفحة الأنماط من السؤال بحسب قواعد ذلك المشروع. دعت الوثيقة المنفذين إلى مراجعة هذا الفصل. كان عنوان منزل الأب معروفاً، لكن البريد لم يُسمح له بالدخول.

غيّرت مسودة 7 مايو 2022 نظام البريد. يذكر سجل تعديلاتها حذف تقسيم الملفات، وتصنيف :has() وظيفة اختيارية ومعرّضة للمراجعة. اختفى الحاجز الذي فصل استعلام اللقطة عن مطابقة CSS الحية. بقي قرار دعم الوظيفة لدى كل تنفيذ وفق تلك المسودة. وُضعت الرسالة في صندوق البريد الجديد، وعلى كل متصفح أن يقرر فتحه.

تعمل الصيغة من العنصر المطلوب اختياره. في a:has(> img) تعني > ابناً مباشراً؛ وفي dt:has(+ dt) تعني + الشقيق التالي بلا فاصل. قد يطلب محرر من بطاقة تضم صورة أن تترك للصورة هواءً، أو من مصطلح يتبعه مصطلح أن يظهر الاثنان كقطعة واحدة. يحتفظ المستند بعناصره في أماكنها. الذي يتغير هو طريقة عرض العنصر بعد أن يفحص علاقته بالموجودين حوله.

تضع مسودة مايو 2022 لغزاً يستحق قلم مدقق اللغة. section:not(:has(h1, h2, h3, h4, h5, h6)) يبحث عن قسم بلا عناوين في نسله. أما section:has(:not(h1, h2, h3, h4, h5, h6)) فيبحث عن قسم يضم شيئاً غير عنوان. يكفي وجود فقرة عادية ليصدق السؤال الثاني، حتى إن كان للقسم عنوان واضح. انتقلت الأقواس خطوة، وانتقل القرار إلى قضية أخرى. في هذه الغرفة الصغيرة، علامات الترقيم رئيسة التحرير.

أضافت مراجعة 11 نوفمبر 2022 حدوداً للسؤال. منعت وضع :has() داخل :has() أخرى، واستبعدت غالبية العناصر الزائفة من الوسيط. تشرح المسودة أن وجود بعض تلك العناصر يعتمد على نمط الأسلاف؛ ولو قرر السلف نمطه بناء على عنصر ينشأ من ذلك النمط، دارت الحجة حول نفسها. من حق الأب سماع الخبر، لكن اجتماع الأسرة لا يحتاج اجتماعاً جديداً داخل كل جملة.

يرتب سجل نشر W3C نسخ 2018 و2022. وبينها يتغير موضع السلطة التقنية: محرك المحددات يفحص العلاقة المشتركة في شجرة المستند؛ والناشر يقرر متى تستحق تلك العلاقة تغييراً يراه القارئ. قد تتسع بطاقة لأن صورتها تحتاج مكاناً، أو يتغير عرض مصطلحين متتابعين. لا تحتاج الحقيقة الموجودة في الصفحة إلى بطاقة حضور ثانية تُلصق على الإطار.

قرأ الأب الرسالة أخيراً. وكانت المفاجأة أن الجار أرسل واحدة أيضاً.