أوراق أنماط قابلة للبناء

أنماط قابلة لإعادة الاستخدام بسلاسة

Jason Miller
Jason Miller

جداول الأنماط القابلة للإنشاء هي طريقة لإنشاء أنماط قابلة لإعادة الاستخدام وتوزيعها عند استخدام Shadow DOM.

توافق المتصفّح

  • Chrome: 73
  • ‫Edge: 79
  • Firefox: 101.
  • ‫Safari: 16.4

المصدر

كان من الممكن دائمًا إنشاء أوراق أسلوب باستخدام JavaScript. ومع ذلك، كانت العملية في السابق هي إنشاء عنصر <style> باستخدام document.createElement('style')، ثم الوصول إلى خاصية ورقة البيانات للحصول على إشارة إلى مثيل CSSStyleSheet الأساسي. يمكن أن تؤدي هذه الطريقة إلى إنشاء رمز CSS مكرّر وزيادة حجمه، ويؤدي إرفاقه إلى ظهور محتوى غير منسق سواء كان هناك زيادة في حجمه أم لا. واجهة CSSStyleSheet هي الجذر لمجموعة من واجهات تمثيل CSS التي يُشار إليها باسم CSSOM، والتي تقدّم طريقة آلية لتعديل أوراق الأنماط بالإضافة إلى إزالة الصعوبات المرتبطة بالطريقة القديمة.

مخطّط بياني يعرض تحضير CSS وتطبيقه

تتيح جداول الأنماط القابلة للإنشاء تحديد أنماط CSS المشترَكة وإعدادها، ثم تطبيق هذه الأنماط على عدّة جذور ظلّ أو على المستند بسهولة وبدون تكرار. يتم تطبيق التعديلات على CSSStyleSheet مشترَكة على جميع الجذور التي تم اعتمادها فيها، واعتماد جدول تنسيق يكون سريعًا ومتزامنًا بعد تحميل جدولالتنسيق.

إنّ ��ملية الربط التي تنشئها أوراق الأنماط القابلة للإنشاء تناسب بشكلٍ جيد عددًا من التطبيقات المختلفة. ويمكن استخدامه لتوفير مظهر مركزي يستخدِمه العديد من المكوّنات: يمكن أن يكون المظهر مثيلًا CSSStyleSheet يتم تمريره إلى المكوّنات، مع نشر التعديلات على المظهر إلى المكوّنات تلقائيًا. ويمكن استخدامه لتوزيع قيم سمة CSS المخصّصة على أشجار فرعية معيّنة من DOM بدون الاعتماد على التسلسل. ويمكن أيضًا استخدامه كواجهة مباشرة لأداة تحليل CSS في المتصفّح، ما يسهّل تحميل جداول الأنماط مسبقًا بدون حقنها في نموذج DOM.

إنشاء ورقة أنماط

بدلاً من تقديم واجهة برمجة تطبيقات جديدة لتحقيق ذلك، تتيح مواصفات StyleSheets القابلة للإنشاء إنشاء أوراق أسلوب بشكل إلزامي من خلال استدعاء سازند CSSStyleSheet(). يحتوي عنصر CSSStyleSheet الناتج على طريقتَين جديدتَين تسهِّلان إضافة قواعد أوراق الأنماط وتعديلها بدون التسبب في وميض المحتوى الذي لم يتم تنسيقه (FOUC). تستبدل كلّ من الطريقتَين replace() و replaceSync() جدول الأنماط بسلسلة من CSS، وتعرض replace() وعدًا. وفي كلتا الحالتَين، لا تتم معالجة مراجع ملفّات الأنماط الخارجية، ويتم تجاهل أيّ قواعد @import وسيتم عرض تحذير.

const sheet = new CSSStyleSheet();

// replace all styles synchronously:
sheet.replaceSync('a { color: red; }');

// replace all styles:
sheet.replace('a { color: blue; }')
  .then(() => {
    console.log('Styles replaced');
  })
  .catch(err => {
    console.error('Failed to replace styles:', err);
  });

// Any @import rules are ignored.
// Both of these still apply the a{} style:
sheet.replaceSync('@import url("styles.css"); a { color: red; }');
sheet.replace('@import url("styles.css"); a { color: red; }');
// Console warning: "@import rules are not allowed here..."

استخدام أوراق الأنماط التي تم إنشاؤها

الميزة الجديدة الثانية التي تقدّمها أوراق الأنماط القابلة للإنشاء هي سمة adoptedStyleSheets المتوفّرة في Shadow Roots وDocuments. يتيح لنا ذلك تطبيق الأنماط المحدّدة بواسطة CSSStyleSheet على شجرة فرعية معيّنة في DOM بوضوح. لإجراء ذلك، نضبط السمة على مصفوفة من جدول تنسيقات صفحات ويب واحد أو أكثر لتطبيقه على هذا العنصر.

// Create our shared stylesheet:
const sheet = new CSSStyleSheet();
sheet.replaceSync('a { color: red; }');

// Apply the stylesheet to a document:
document.adoptedStyleSheets.push(sheet);

// Apply the stylesheet to a Shadow Root:
const node = document.createElement('div');
const shadow = node.attachShadow({ mode: 'open' });
shadow.adoptedStyleSheets.push(sheet);

خلاصة ما سبق ذكره

باستخدام أوراق الأنماط القابلة للإنشاء، أصبح لدى مطوّري الويب الآن حلّ واضح ل إنشاء أوراق أنماط CSS وتطبيقها على أشجار DOM. لدينا واجهة برمجة تطبيقات جديدة تستند إلى وعد لتحميل أوراق الأنماط من سلسلة مصدر CSS تستخدِم المحلِّل المدمج في المتصفّح ودلالات التحميل. أخيرًا، لدينا آلية لتطبيق تعديلات ملفّ التنسيق على جميع استخدامات ملفّ التنسيق، ما يسهّل إجراء تغييرات على المظهر والإعدادات المفضّلة للألوان.

الاطّلاع على العرض التوضيحي

نظرة مستقبلية

تم شحن الإصدار الأول من التنسيقات القابلة للإنشاء مع واجهة برمجة التطبيقات описанة هنا، ولكن يتم حاليًا العمل على تسهيل استخدامها. هناك اقتراح لتوسيع adoptedStyleSheets FrozenArray باستخدام طرق مخصّصة لإدراج أوراق الأنماط وإزالتها، ما سيؤدي إلى عدم الحاجة إلى استنساخ الصفيف وتجنُّب الإشارات المحتملة المكرّرة لأوراق الأنماط.

مزيد من المعلومات