دروس CSS هوديني

يوم جيد يا اصدقاء!

ما هو هوديني؟


Houdini ( Houdini ) - مجموعة من واجهات برمجة تطبيقات المتصفح التي تحسن بشكل كبير عملية تطوير الويب ، بما في ذلك تطوير معايير CSS. سيتمكن المطورون من توسيع CSS باستخدام JavaScript ، والتأثير على عرض CSS وإخبار المتصفح بكيفية تطبيق الأنماط. سيوفر ذلك زيادة كبيرة في الأداء والاستقرار مقارنة باستخدام المواد المتعددة.

يتكون هوديني من مجموعتين من واجهات برمجة التطبيقات - واجهات برمجة التطبيقات عالية المستوى وواجهات برمجة تطبيقات منخفضة المستوى.

ترتبط واجهات برمجة التطبيقات عالية المستوى بعملية العرض (النمط - التخطيط - الرسم - التكوين). تشمل هذه المجموعة:

  • Paint API - يسمح لك بتوسيع CSS في الخطوة (بمعنى مرحلة العرض) لعرض العناصر المرئية (اللون والخلفية والحدود وما إلى ذلك).
  • Layout API - يسمح لك بتوسيع CSS في خطوة تحديد حجم العناصر وموضعها ومواءمتها.
  • Animation API - "نقطة الامتداد" في خطوة عرض وتحريك العناصر.

واجهات برمجة التطبيقات ذات المستوى المنخفض هي الأساس لواجهات برمجة التطبيقات ذات المستوى الأعلى وتشمل:

  • واجهة برمجة تطبيقات نموذج الكائن المكتوب
  • خصائص وقيم API مخصصة
  • واجهة برمجة تطبيقات مقاييس الخط
  • Worklets

مستقبل CSS


Houdini ، على عكس CSS العادية ، يسمح للمطورين بتوسيع CSS بطريقة أكثر طبيعية. هل يعني هذا أن مواصفات CSS ستتوقف عن التطور وتبني معايير جديدة؟ لا على الاطلاق. هدف هوديني هو المساعدة في تطوير ميزات CSS الجديدة من خلال إنشاء نماذج أولية يمكن توحيدها بسهولة.

بالإضافة إلى ذلك ، يمكن للمطورين بسهولة مشاركة محطات عمل CSS المفتوحة دون القلق بشأن التوافق.

واجهة برمجة تطبيقات نموذج الكائن المكتوب (TOM)


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

selectedElement.style.fontSize = newFontSize + 'px' // newFontSize = 20
console.log(selectedElement.style.fontSize) // 20px

يمنح TOM خصائص CSS معنى أكثر دلالة من خلال تمثيلها ككائنات JS المكتوبة. هذا يحسن بشكل كبير الأداء والاستقرار ويسهل دعم التعليمات البرمجية. يتم تمثيل قيم CSS بواجهة CSSUnitValue ، والتي تتكون من القيمة وخاصية "وحدة القياس".

{
  value: 20,
  unit: 'px'
}

يمكن استخدام هذه الواجهة مع الميزات الجديدة التالية:

  • computedStyleMap (): لتحليل الأنماط المحسوبة (غير المضمنة). يتم استدعاء هذه الطريقة قبل التحليل أو استخدام طرق أخرى.
  • attribStyleMap: لتحليل وتعديل الأنماط المضمنة. هذه خاصية عنصر.

//       ( )
selectedElement.computedStyleMap().get('font-size') // { value: 20, unit: 'px' }

//   
selectedElement.attributeStyleMap.set('font-size', CSS.em(2))
selectedElement. attributeStyleMap.set('color', 'blue')

//    
selectedElement.computedStyleMap().get('font-size') // { value: 20, unit: 'px' }

//    
selectedElement.attributeStyleMap.get('font-size') // { value: 2, unit: 'em' }

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

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

  • واضح: يزيل جميع الأنماط المضمنة
  • delete: لحذف خاصية CSS محددة وقيمتها
  • has: تقوم بإرجاع true / false بناءً على توفر الخاصية المحددة
  • إلحاق: يضيف قيمة إضافية إلى خاصية تدعم قيمًا متعددة

كشف


let selectedElement = document.getElementById('example')

if(selectedElement.attributeStyleMap){
  // ...
}

if(selectedElement.computedStyleMap){
  // ...
}

حالة المواصفات


مسودة العمل : تم نشرها لمناقشة المجتمع.

الدعم


كرومحافةالأوبراثعلب النارسفاري
مدعوم منمدعوم منمدعوم منغير مدعومدعم جزئي

خصائص وقيم API مخصصة


تسمح واجهة برمجة التطبيقات هذه للمطورين بتوسيع متغيرات CSS من خلال تحديد النوع والقيمة الأولية والوراثة. لتحديد خاصية مخصصة ، من الضروري تسجيلها باستخدام طريقة registerProperty. تحدد هذه الطريقة كيفية تطبيق المستعرضات للملكية ومعالجة الأخطاء.

CSS.registerProperty({
  name: '--colorPrimary',
  syntax: '<color>',
  inherits: false,
  initialValue: 'blue',
})

يتم تمرير كائن بالخصائص التالية إلى هذه الطريقة كوسيطة:

  • الاسم: اسم الخاصية المخصصة
  • بناء الجملة: تعليمات للتحليل. القيم المحددة مسبقًا هي: <color> ، <integer> ، <number> ، <length> ، <percentage> ، إلخ.
  • الأولي القيمة: القيمة الافتراضية (قبل التجاوز وكذلك عند حدوث الأخطاء)

في المثال أعلاه ، تم تعريف خاصية مخصصة من النوع <color>. سيتم استخدام هذه الخاصية لتحديد التدرج. لا يدعم CSS العادي انتقالات التدرج. لاحظ كيفية استخدام الخاصية المخصصة لتحديد الانتقال.

.gradient-box {
  background: linear-gradient(45deg, rgba(255, 255, 255, 1) 0% var(--colorPrimary) 60%);
  transition: --colorPrimary 0.5s ease;
  ...
}

.gradient-box:hover {
  --colorPrimary: red;
  ...
}

لا يعرف المتصفح كيفية إجراء الانتقال للتدرج ، ولكنه يعرف كيفية القيام بذلك للون. هذا هو السبب في أننا حددنا نوع الخاصية على أنه <color>. في متصفح يدعم هوديني ، سيحدث تغيير في التدرج عند التمرير. يمكن أيضًا تغيير موضع التدرج ، المُقاس بالنسبة المئوية ، باستخدام خاصية CSS المخصصة (مسجلة على أنها <percentage>).

ربما في المستقبل سيكون من الممكن تسجيل خاصية مخصصة مباشرة في CSS.

@property --colorPrimary {
  syntax: '<color>';
  inherits: false;
  initial-value: blue;
}

مثال


يوضح هذا المثال البسيط كيف يمكنك تغيير اللون ونقاط التحكم في التدرج باستخدام خصائص CSS المخصصة. يمكن العثور على رمز مثال هنا .



كشف


if(CSS.registeredProperty) {
  // ...
}

حالة المواصفات


مسودة العمل : تم نشرها لمناقشة المجتمع.

الدعم


كرومحافةالأوبراثعلب النارسفاري
مدعوم منمدعوم منمدعوم منغير مدعومغير مدعوم

واجهة برمجة تطبيقات مقاييس الخط


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

حالة المواصفات


مجموعة من الأفكار : لم يتم نشر المسودة.

المتصفحات غير مدعومة.

Vorkleta


قبل الانتقال إلى واجهات برمجة التطبيقات التالية ، تحتاج إلى فهم مفهوم محطات العمل. Vorklets هي برامج نصية يتم تشغيلها أثناء التقديم وهي مستقلة عن كود JS الأساسي. إنها توسع قدرات محرك العرض ، وهي مصممة للتنفيذ المتوازي (حالتان أو أكثر) ، ولا تحجب الخيط الرئيسي ، ولديها وصول محدود إلى النطاق العالمي ويطلق عليها المحرك عند الضرورة. لا يمكن تشغيل Vorklets إلا من خلال HTTPS (في الإنتاج) أو من خلال المضيف المحلي (لأغراض التطوير والاختبار).

يشمل هوديني محطات العمل التالية التي تعمل على تمديد محرك عرض المتصفح:

  • Paint Worklet - الرسام API
  • مجموعة الرسوم المتحركة - Animation API
  • مجموعة عمل التخطيط - واجهة برمجة تطبيقات التخطيط

الرسام API


تتيح واجهة برمجة تطبيقات الرسام للمطورين استخدام وظائف JS لرسم خلفية عنصر أو حدوده أو محتوياته باستخدام 2D Rendering Context ، وهو مجموعة فرعية من HTML5 Canvas API. يستخدم الرسام API عمل الرسام لرسم صورة تعتمد على التغييرات في CSS (مثل التغييرات على متغيرات CSS). سيشعر أولئك المطلعون على Canvas API بأنهم في المنزل مع Paint API.

يتكون تكوين Work Worklet من عدة خطوات:

  1. كتابة وتسجيل مجموعة عمل باستخدام وظيفة registerPaint
  2. قم باستدعاء مجموعة عمل بتنسيق HTML أو JS باستخدام CSS.paintWorklet.addModule
  3. استخدم طريقة الطلاء () في CSS جنبًا إلى جنب مع اسم vorklet والوسيطات التي تم تمريرها

دعنا نلقي نظرة على وظيفة registerPaint ، والتي تستخدم للتسجيل وتحديد وظائف Paint Worklet.

registerPaint('paintWorkletExample', class {
  static get inputProperties() { return ['--myVariable']; }
  static get inputArguments() { return ['<color>']; }
  static get contextOptions() { return {alpha: true} }

  paint(ctx, size, properties, args) {
    // ...
  }
})

تتكون وظيفة registerPaint من الأجزاء التالية:

  • inputProperties: صفيف من خصائص CSS المخصصة التي يلاحظها مجموعة العمل. يمثل هذا الصفيف تبعيات مجموعة العمل.
  • inputArguments: مجموعة من الوسيطات التي يمكن أن تنتقل من دالة إلى CSS خارجية
  • contextOptions: شفافية الألوان. إذا كانت خاطئة ، فستكون كل الألوان معتمة تمامًا
  • الطلاء: الوظيفة الرئيسية مع الأخذ بالحجج التالية:

    • ctx: سياق رسم ثنائي الأبعاد يتطابق تقريبًا مع سياق الرسم الثنائي الأبعاد لـ Canvas API
    • الحجم: كائن بعرض العنصر وارتفاعه. تعتمد القيم على عملية عرض التخطيط. حجم اللوحة هو نفس حجم العنصر الفعلي
    • الخصائص: المتغيرات المضمنة في خصائص الإدخال
    • args: مجموعة من الوسيطات التي تم تمريرها إلى وظيفة الطلاء

بعد تسجيل مجموعة العمل ، يجب استدعاؤها بتنسيق HTML ، مشيرة إلى المسار إلى الملف.

CSS.paintWorklet.addModule('path/to/worklet/file.js')

يمكن إضافة Vorklets من أي مصدر خارجي (على سبيل المثال ، من CDN) ، مما يجعلها وحدات وقابلة لإعادة الاستخدام.

CSS.paintWorklet.addModule('https://url/to/worklet/file.js')

بعد استدعاء مجموعة العمل ، يمكن استخدامها في CSS باستخدام وظيفة "الطلاء". هذه الوظيفة ، كمعلمة أولى ، تأخذ الاسم المسجل لـ vorklet وجميع الوسائط المحددة في inputArguments. من هذه اللحظة ، يعرف المستعرض وقت استدعاء مجموعة العمل وما هي إجراءات المستخدم التي تؤدي إلى تغيير قيم معينة لخصائص CSS المخصصة.

.example-element {
  // paintWorkletExample -  
  // blue - ,  
  background: paint(paintWorkletExample, blue);
}

مثال


يوضح المثال التالي استخدام واجهة برمجة تطبيقات Paint (Paint API) ، بالإضافة إلى وحدات العمل وإعادة استخدامها. يستخدم مجموعة العمل المتتالية من مستودع Google Chrome Labs . انظر رمز المثال هنا .



كشف


if(‘paintWorklet’ in CSS){
  // …
}

@supports(background: paint(paintWorkletExample)){
  // …
}

حالة المواصفات


توصية : مسودة عمل مستقرة ، جاهزة للاستخدام.

الدعم


كرومحافةالأوبراثعلب النارسفاري
مدعوم منمدعوم منمدعوم منغير مدعومغير مدعوم

الرسوم المتحركة API


تعمل واجهة برمجة التطبيقات هذه على توسيع الرسوم المتحركة على الويب من خلال معالجة الأحداث المختلفة (التمرير ، التمرير ، النقر ، إلخ.) وتحسين الأداء من خلال إطلاق الرسوم المتحركة في التدفق الخاص بها من خلال مجموعة الرسوم المتحركة.

مثل أي مجموعة عمل أخرى ، يجب تسجيل الرسوم المتحركة للتمرين أولاً.

registerAnimation(‘animationWorkletExample’, class {
  constructor(options){
    // …
  }
  animate(currentTime, effect){
    // …
  }
})

يتضمن هذا الفصل وظيفتين:

  • مُنشئ: يسمى عند إنشاء مثيل جديد. تستخدم للإعداد العام.
  • animate: الوظيفة الرئيسية التي تحتوي على منطق الرسوم المتحركة. يتم قبول المعلمات التالية:

    • currentTime: الطوابع الزمنية على مخطط زمني محدد
    • تأثير: مجموعة من التأثيرات المستخدمة في الرسوم المتحركة

بعد التسجيل ، يتم تضمين مجموعة العمل في ملف JS الرئيسي ، وتتم إضافة الرسوم المتحركة (العنصر والإطارات والإعدادات) وإرفاقها بالجدول الزمني. يوجد مفهوم علامات الخط الزمني وأساسيات الرسوم المتحركة على الويب في القسم التالي.

//   
await CSS.animationWorklet.addModule(‘path/to/worklet/file.js’)

//    
const elementExample = document.getElementById(‘element-example’)

//  
const effectExample = new KeyframeEffect(
  elementExample, //  
  [ // … ], //  
  { // … } //  - , ,    ..
)

//        
new WorkletAnimation(
  ‘animationWorkletExample’ //  
  effectExample, //  
  document.timeline, //  
  {},  //   
).play()

طوابع زمنية


تستند الرسوم المتحركة على الويب إلى الطوابع الزمنية - معالم للتأثيرات على المخطط الزمني للرسوم المتحركة. على سبيل المثال ، نقوم بتحليل الرسوم المتحركة الخطية المتكررة ، والتي تتكون من ثلاثة إطارات (البداية ، الوسط ، النهاية) ، وتبدأ ثانية واحدة بعد تحميل الصفحة بالكامل (تأخير) وتستمر 4 ثوانٍ.

ستبدو الطوابع الزمنية للتأثيرات على هذا النحو (للحصول على رسوم متحركة تدوم 4 ثوانٍ ودون تأخير):

طوابع زمنيةإطار الرسوم المتحركة
0 مللي ثانيةالإطار الأول - بداية الرسوم المتحركة
2000 مللي ثانيةالإطار الثاني - منتصف الرسم المتحرك
4000 مللي ثانيةالإطار الأخير - نهاية الرسوم المتحركة أو إعادة تعيينه إلى الإطار الأول

Effect.localTime بقيمة 3000 مللي ثانية (نظرا لتأخير 1000 مللي ثانية) يربط الرسم المتحرك بالإطار المتوسط ​​على الخط الزمني (تأخير 1000 مللي ثانية + متوسط ​​2000 مللي ثانية). سيتم تحقيق نفس التأثير عند ضبط 7000 مللي ثانية و 11000 مللي ثانية ، حيث تتكرر الرسوم المتحركة كل 4000 مللي ثانية.

animate(currentTime, effect){
  effect.localTime = 3000 // 1000ms  + 2000ms  
}

مع تأثير ثابت للقيمة time.localTime ، سيتم قفل الرسم المتحرك على إطار معين. لذلك ، يجب تغيير قيمة Effect.localTime. يجب أن تكون هذه القيمة دالة مرتبطة بـ currentTime أو متغير آخر.

إليك ما يبدو عليه رمز الرسوم المتحركة الخطي:

animate(currentTime, effect){
  effect.localTime = currentTime // y = x  
}

الجدول الزمني (document.timeline)طابع زمنيالإطار
startTime + 0ms (الوقت المنقضي)startTime + 0msالأول
startTime + 1000ms (الوقت المنقضي)startTime + 1000ms (تأخير) + 0msالأول
startTime + 3000ms (الوقت المنقضي)وقت البدء + 1000 مللي ثانية (تأخير) + 2000 مللي ثانيةالأوسط
startTime + 5000ms (الوقت المنقضي)وقت البدء + 1000 مللي ثانية (تأخير) + 4000 مللي ثانيةآخر أولا
startTime + 7000ms (الوقت المنقضي)وقت البدء + 1000 مللي ثانية (تأخير) + 6000 مللي ثانيةالأوسط
startTime + 9000ms (الوقت المنقضي)وقت البدء + 1000 مللي ثانية (تأخير) + 8000 مللي ثانيةآخر أولا

لا تقتصر الطوابع الزمنية على 1: 1. تسمح واجهة برمجة التطبيقات للرسوم المتحركة للمطورين بمعالجة العلامات من خلال وظيفة التحريك ، باستخدام وظائف JS القياسية لإنشاء تأثيرات معقدة. يمكن أن تختلف الرسوم المتحركة أيضًا عند كل تكرار (مع الرسوم المتحركة المتكررة).

يمكن ربط الرسوم المتحركة ليس فقط بتحميل المستند ، ولكن أيضًا بإجراءات المستخدم. يمكن استخدام إجراء المستخدم مثل تمرير صفحة في الرسوم المتحركة من خلال كائن ScrollTimeline. على سبيل المثال ، يمكن أن تبدأ الرسوم المتحركة عند التمرير 200 بكسل وتنتهي عند التمرير 800 بكسل.

const scrollTimelineExample = new ScrollTimeline({
  scrollSource: scrollElement, // ,     
  orientation: ‘vertical’, //  
  startScrollOffset: ‘200px’, //  
  endScrollOffset: ‘800px’, //  
  timeRange: 1200, //  
  fill: ‘forwards’ //  
})

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

مثال


يوضح المثال التالي الرسوم المتحركة غير الخطية. يستخدم الدالة Gaussian مع دوران الوقت نفسه هناك والعودة. انظر رمز المثال هنا .



كشف


if(CSS.animationWorklet){
  // …
}

حالة المواصفات


مسودة العمل العام الأولى : جاهزة للمناقشة المجتمعية ، عرضة للتغيير في المستقبل.

الدعم


كرومحافةالأوبراثعلب النارسفاري
دعم جزئيدعم جزئيدعم جزئيغير مدعومغير مدعوم

واجهة برمجة تطبيقات التخطيط


تسمح واجهة برمجة تطبيقات Layout للمطورين بتمديد عملية عرض التخطيط من خلال تحديد وحدات جديدة للاستخدام في خاصية "عرض" CSS. يقدم هذا API مفاهيم جديدة ومعقدة للغاية ويقدم عددًا كبيرًا من الإعدادات لتطوير خوارزميات مخصصة للعمل مع تخطيط الصفحة.

أولاً وقبل كل شيء ، يجب تسجيل العمل.

registerLayout(‘exampleLayout’, class{
  static get inputProperties() { return [‘--example-variable’] }

  static get childrenInputProperties() { return [‘--exampleChildVariable’] }

  static get layoutOptions(){
    return {
      childDisplay: ‘normal’,
      sizing: ‘block-like’
    }
  }

  intrinsicSizes(children, edges, styleMap){
    // …
  }

  layout(children, edges, constraints, styleMap, breakToken){
    // …
  }
})

يتضمن تسجيل ورشة العمل الطرق التالية:

  • inputProperties: مجموعة من خصائص CSS المخصصة التي يلاحظها المصنف وتنتمي إلى الأصل ، وهو العنصر الذي تسبب في عرض التخطيط. يمثل هذا الصفيف تبعيات التخطيط
  • childrenInputProperties: مجموعة من خصائص CSS المخصصة التي يتم مراقبتها بواسطة عنصر واجهة المستخدم والتي تنتمي إلى السليل
  • layoutOptions: تحدد خصائص التخطيط التالية:

    • childDisplay: القيم المحددة مسبقًا كتلة وطبيعية. يحدد كيفية عرض العنصر (كتلة أو سطر)
    • تغيير الحجم: القيم المحددة مسبقًا تشبه الكتل ودليلًا. يحدد الحاجة إلى حساب أولي لأحجام العناصر (إذا لم يكن محددًا)
  • intrinsicSizes: يحدد كيفية عرض الحاوية أو محتوياتها في سياق التخطيط:

    • الأطفال: تابع العنصر الذي تسبب في عرض تخطيط الصفحة
    • الحواف: حدود الحاوية
    • styleMap: نموذج كائن نمط حاوية مكتوب
  • التخطيط: الوظيفة الرئيسية للعمل مع التخطيط:

    • الأطفال: عنصر تابع
    • الحواف: الحدود
    • القيود: القيود التي يفرضها التخطيط الأصلي
    • styleMap: نموذج كائن نمط حاوية مكتوب
    • breakToken: نقطة توقف لتقسيم الصفحات أو تقسيم تخطيط الطباعة

بعد ذلك ، تتم إضافة مجموعة العمل إلى ملف HTML أو JS.

CSS.layoutWorklet.addModule(‘path/to/worklet/file.js’)

نقوم بعمل رابط إلى مجموعة العمل في الملف باستخدام الأنماط.

.example-element {
  display: layout(exampleLayout)
}

كيفية عمل Layout API مع التخطيط


في المثال السابق ، حددنا exampleLayout.

يُسمى عنصر .example بالتخطيط الأصلي ، بما في ذلك المسافات البادئة والحدود وشريط التمرير. يتكون التخطيط الرئيسي من عناصر فرعية تسمى التخطيطات الحالية. التخطيطات الحالية هي عناصر مستهدفة يتم تخطيطاتها حسب الطلب باستخدام Layout API. على سبيل المثال ، عند استخدام "display: flex" ، تتم إعادة ترتيب أحفاد العنصر وفقًا للتخطيط المرن. يشبه هذا تشغيل واجهة برمجة تطبيقات التخطيط.

يتكون كل تخطيط حالي من تخطيطات فرعية تحتوي على خوارزميات لعرض تخطيط العنصر الفرعي - LayoutChild (بما في ذلك الفئات الزائفة :: قبل و :: بعد). LayoutChild - حاوية تم إنشاؤها بواسطة أدوات CSS تحتوي على بيانات حول الأنماط (بدون بيانات حول التخطيط). يتم إنشاء عناصر LayoutChild تلقائيًا بواسطة المستعرض في مرحلة تطبيق الأنماط. يمكن أن يقوم التخطيط الفرعي بإنشاء جزء يحتوي على تعليمات لعرض التخطيط.

مثال


يستخدم هذا المثال أيضًا مستودع Google Chrome Labs ، ولكن يتم استبدال النص بالصور. انظر رمز المثال هنا .



كشف


if(CSS.layoutWorklet){
  // …
}

حالة المواصفات


مسودة العمل العام الأولى : جاهزة للمناقشة المجتمعية ، عرضة للتغيير في المستقبل.

الدعم


كرومحافةالأوبراثعلب النارسفاري
دعم جزئيدعم جزئيدعم جزئيغير مدعومغير مدعوم

هوديني والتحسن التدريجي


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

قم دائمًا بتحديد الدعم لتجنب الأخطاء.


كل Houdini API و Worklet لديه طريقة سهلة للتحقق من إمكانية الوصول. هذا يتجنب مشاكل استخدام هوديني في المتصفحات التي لا تدعم هذه التقنية بعد.

استخدم هوديني لتحسين العرض والتصور.


يجب على المستخدمين الذين يستخدمون المتصفحات التي لا تدعم Houdini الوصول إلى المحتوى والوظائف الأساسية للموقع. لا يجب أن تعتمد تجربة المستخدم وعرض المحتوى على هوديني.

استخدم CSS القياسي كبديل


على سبيل المثال ، يمكن استخدام خصائص CSS المخصصة كبديل للخصائص والقيم API المخصصة.

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

استنتاج


يسمح Houdini للمطورين باستخدام كود JS للعمل مع الأنماط في عملية التقديم ، مما يزيد من أداء التطبيق واستقراره. تتيح لك القدرة على تضمين التعليمات البرمجية في عملية العرض إنشاء نسخ متعددة من CSS يسهل مشاركتها مع الآخرين ، وتطبيقها ، وربما تضمينها في المواصفات. بالإضافة إلى ذلك ، يسمح Houdini للمطورين والمصممين بأن يكونوا أقل اعتمادًا على قيود CSS عند العمل مع الأنماط والتنسيقات والرسوم المتحركة.

يمكن استخدام هوديني الآن ، ولكن فقط كتطور تدريجي. سيسمح هذا للمتصفحات التي لا تدعم Houdini بعرض الصفحات دون أخطاء ، مما يوفر تجربة مستخدم مثالية.

لا استطيع الانتظار حتى يتمكن مجتمع المطورين من التمتع الكامل بقدرات هوديني. هنا بضعة أمثلة:

CSS Houdini Expirements
مقدمة تفاعلية لأمثلة CSS Houdini Houdini
من Google Chrome Labs

المراجع


مسودات W3C الخاصة بمجموعة عمل الرسوم المتحركة Houdini
Houdini Specification (Chrome Dev Summit 2018)
- Google Developers

شكرًا لك على اهتمامك .

All Articles