آخر الأخبار حول CSS وواجهة مستخدم الويب: ملخّص مؤتمر I/O لعام 2024

تتضمّن منصة الويب الكثير من الابتكارات، وتتصدّر ميزات CSS وواجهة مستخدم الويب هذا التطور المثير. نحن نعيش عصرًا ذهبيًا لواجهات المستخدم على الويب، حيث تتوفر ميزات CSS جديدة على جميع المتصفحات بوتيرة لم نشهدها من قبل، ما يفتح عالمًا من الإمكانيات لإنشاء تجارب ويب جميلة وجذابة. ستتناول مشاركة المدونة هذه بالتفصيل الحالة الحالية للغة CSS، وستستكشف بعضًا من أهم الميزات الجديدة التي تغيّر طريقة إنشاء تطبيقات الويب، والتي تم عرضها مباشرةً في مؤتمر Google I/O لعام 2024.

تجارب تفاعلية جديدة

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

الصور المتحركة المستندة إلى التمرير

Browser Support

  • Chrome: 115.
  • Edge: 115.
  • Firefox: behind a flag.
  • Safari: 26.

Source

كما يوحي الاسم، تتيح واجهة برمجة التطبيقات الخاصة بالحركات المستندة إلى التمرير إنشاء حركات ديناميكية مستندة إلى التمرير بدون الاعتماد على أدوات مراقبة التمرير أو نصوص برمجية أخرى معقّدة.

إنشاء صور متحركة مستندة إلى التمرير

على غرار طريقة عمل الصور المتحركة المستندة إلى الوقت على المنصة، يمكنك الآن استخدام مستوى تقدّم التمرير في أداة التمرير لبدء صورة متحركة وإيقافها مؤقتًا وعكسها. وبالتالي، أثناء التنقّل للأمام، سيظهر لك تقدّم الحركة، وعند التنقّل للخلف، ستسير الحركة في الاتجاه المعاكس. يتيح لك ذلك إنشاء صور مرئية جزئية أو كاملة للصفحة مع عناصر متحركة داخل إطار العرض، ويُعرف ذلك أيضًا باسم scrollytelling، للحصول على تأثير مرئي ديناميكي.

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

العناصر المرئية للصور المتحركة المستندة إلى التمرير

عرض توضيحي مباشر

@keyframes appear {
  from {
    opacity: 0;
    scale: 0.8;
  }
  to {
    opacity: 1;
    scale: 1;
  }
}

img {
  animation: appear linear;
  animation-timeline: view();
  animation-range: entry 25% cover 50%;
}

يحدّد الرمز السابق رسمًا متحركًا بسيطًا يظهر في إطار العرض من خلال تغيير مستوى التعتيم وحجم الصورة. يتم تشغيل الصورة المتحركة حسب موضع التمرير. لإنشاء هذا التأثير، عليك أولاً إعداد الصورة المتحركة CSS، ثم ضبط animation-timeline. في هذه الحالة، تتتبّع الدالة view() مع قيمها التلقائية الصورة بالنسبة إلى نافذة التمرير (وهي أيضًا نافذة العرض في هذه الحالة).

من المهم مراعاة توافق المتصفح والخيارات المفضّلة لدى المستخدمين، خاصةً فيما يتعلق باحتياجات تسهيل الاستخدام. لذلك، استخدِم القاعدة @supports للتحقّق مما إذا كان المتصفّح يتيح استخدام الرسوم المتحركة المستندة إلى التمرير، ثمّ ضع الرسوم المتحركة المستندة إلى التمرير في طلب بحث عن الإعدادات المفضّلة للمستخدم، مثل @media (prefers-reduced-motion: no-preference)، لمراعاة الإعدادات المفضّلة للمستخدمين بشأن الحركة. بعد إجراء عمليات التحقّق هذه، ستعرف أنّ الأنماط ستعمل وأنّ الحركة ليست مشكلة بالنسبة إلى المستخدم.

@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    /* Apply scroll-driven animations here */
  }
}

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

العناصر المرئية للصور المتحركة المستندة إلى التمرير

عرض توضيحي مباشر

@keyframes shrink-name {
  from {
    font-size: 2em;
  }
  to {
    font-size: 1.5em;
  }
}

@keyframes add-shadow {
  from {
    box-shadow: none;
  }
  to {
    box-shadow: 0 4px 2px -2px gray;
  }
}

header {
  animation: add-shadow linear both;
}

h2 {
  animation: shrink-name linear both;
}

header, h2 {
  animation-timeline: scroll();
  animation-range: 0 150px;
}

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

مزايا الأداء التي توفّرها الصور المتحركة المستندة إلى التمرير

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

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

تتيح الصور المتحركة المستندة إلى التمرير التنقّل في شريط المنتجات هذا على Tokopedia أثناء التمرير للأسفل.

"تمكّنّا من تقليل عدد أسطر الرمز البرمجي بنسبة تصل إلى% 80 مقارنةً باستخدام أحداث التمرير التقليدية في JavaScript، ولاحظنا أنّ متوسط استخدام وحدة المعالجة المركزية انخفض من% 50 إلى% 2 أثناء التمرير. - "آندي ويهاليم، كبير مهندسي البرامج، Tokopedia"

مستقبل تأثيرات التمرير

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

وسنطرح المزيد من ميزات التمرير في المتصفحات في المستقبل. يعرض العرض التوضيحي التالي مجموعة من هذه الميزات المستقبلية. يستخدم CSS scroll-start-target لضبط التاريخ والوقت الأوليين ضمن أدوات الاختيار، وحدث JavaScript scrollsnapchange لتعديل تاريخ العنوان، ما يسهّل مزامنة البيانات مع الحدث الذي تم التقاطه.

الاطّلاع على عرض توضيحي مباشر على Codepen

يمكنك أيضًا الاستفادة من ذلك لتعديل أداة اختيار في الوقت الفعلي باستخدام حدث JavaScript scrollsnapchanging.

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

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

عمليات نقل العرض

لقد تحدّثنا للتو عن ميزة جديدة وفعّالة تتيح إنشاء صور متحركة داخل صفحات الويب، ولكن هناك أيضًا ميزة جديدة وفعّالة أخرى تُعرف باسم "عمليات الانتقال بين طرق العرض" تتيح إنشاء صور متحركة بين مشاهدات الصفحات لإنشاء تجربة سلسة للمستخدم. توفّر ميزة "انتقالات العرض" مستوى جديدًا من السلاسة على الويب، ما يتيح لك إنشاء انتقالات سلسة بين طرق العرض المختلفة ضمن صفحة واحدة، أو حتى بين صفحات مختلفة.

Browser Support

  • Chrome: 111.
  • Edge: 111.
  • Firefox: 144.
  • Safari: 18.

Source

تُعدّ Airbnb إحدى الشركات التي تجرّب حاليًا دمج عمليات انتقال العرض في واجهة المستخدم لتوفير تجربة تصفّح سلسة ومتكاملة على الويب. ويشمل ذلك الشريط الجانبي لأداة تعديل بيانات المكان، والانتقال مباشرةً إلى تعديل الصور وإضافة وسائل الراحة، كل ذلك ضمن تجربة سلسة للمستخدم.

انتقال عرض المستند نفسه كما يظهر على Airbnb
محفظة ماكسويل بارفيان التي تعرض انتقالات العرض بين طرق العرض

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

يمكنك تفعيل انتقالات العرض بسرعة في تطبيقك ذي الصفحة الواحدة من خلال تضمين تفاعل باستخدام document.startViewTransition، والتأكّد من أنّ كل عنصر ينتقل يتضمّن view-transition-name أو يتم إنشاؤه بشكل مضمّن أو ديناميكي باستخدام JavaScript أثناء إنشاء عُقد DOM.

العرض المرئي التوضيحي

عرض توضيحي مباشر

document.querySelectorAll('.delete-btn').forEach(btn => {
  btn.addEventListener('click', () => {
    document.startViewTransition(() => {
      btn.closest('.card').remove();
    });
  })
});
/* Styles for the transition animation */
::view-transition-old(.card):only-child {
  animation: fade-out ease-out 0.5s;
}

عرض فئات الانتقال

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

Browser Support

  • Chrome: 125.
  • Edge: 125.
  • Firefox: 144.
  • Safari: 18.2.

Source

عرض أنواع عمليات النقل

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

Browser Support

  • Chrome: 125.
  • Edge: 125.
  • Firefox: 144.
  • Safari: 18.

Source

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

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

يمكنك إعداد أنواع ضمن الدالة document.startViewTransition، التي تقبل الآن عنصرًا. ‫update هي دالة ردّ الاتصال التي تعدّل DOM، وtypes هي مصفوفة تحتوي على الأنواع.

document.startViewTransition({
  update: myUpdate,
  types: ['slide', 'forwards']
})

عمليات الانتقال بين الصفحات المتعددة

إنّ ما يجعل الويب قويًا هو مدى اتساعه، فالعديد من التطبيقات ليست مجرد صفحة واحدة، بل هي نسيج قوي يحتوي على صفحات متعددة. لهذا السبب، يسرّنا الإعلان عن أنّنا سنوفّر إمكانية استخدام عمليات الانتقال بين طرق العرض في المستندات للتطبيقات المتعددة الصفحات في الإصدار 126 من Chromium.

Browser Support

  • Chrome: 126.
  • Edge: 126.
  • Firefox: not supported.
  • Safari: 18.2.

Source

تتضمّن مجموعة الميزات الجديدة هذه تجارب على الويب تقع ضمن المصدر نفسه، مثل الانتقال من web.dev إلى web.dev/blog، ولكنّها لا تشمل الانتقال من مصادر مختلفة، مثل الانتقال من web.dev إلى blog.web.dev أو إلى نطاق آخر مثل google.com.

أحد الاختلافات الرئيسية في عمليات الانتقال بين طرق العرض في المستند نفسه هو أنّك لست بحاجة إلى تضمين عملية الانتقال في document.startViewTransition(). بدلاً من ذلك، يمكنك تفعيل ميزة "الانتقال بين طرق العرض" في كلتا الصفحتَين المعنيّتَين باستخدام قاعدة CSS @view-transition.

@view-transition {
  navigation: auto;
}

للحصول على تأثير أكثر تخصيصًا، يمكنك ربط JavaScript باستخدام أدوات معالجة الأحداث الجديدة pageswap أو pagereveal، والتي تتيح لك الوصول إلى عنصر انتقال العرض.

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

window.addEventListener('pageswap', async (e) => {
    // ...
});

window.addEventListener('pagereveal', async (e) => {
    // ...
});
عرض انتقالات العرض في تطبيق متعدّد الصفحات. يمكنك الاطّلاع على رابط العرض التوضيحي.

في المستقبل، نخطّط لتوسيع نطاق ميزة "انتقالات العرض"، بما في ذلك:

  • عمليات الانتقال المحدودة النطاق: تتيح لك حصر عملية الانتقال في شجرة فرعية من نموذج المستند (DOM)، ما يتيح لبقية الصفحة مواصلة التفاعل، ويتيح تنفيذ عمليات انتقال متعددة للعرض في الوقت نفسه.
  • انتقالات العرض المستندة إلى الإيماءات: استخدِم إيماءات السحب أو التمرير السريع لتفعيل انتقال العرض بين المستندات للحصول على تجارب أكثر سلاسة على الويب.
  • مطابقة عناصر التنقّل في CSS: يمكنك تخصيص انتقال العرض بين المستندات مباشرةً في CSS كبديل لاستخدام الحدثَين pageswap وpagereveal في JavaScript. لمزيد من المعلومات حول عمليات انتقال العرض في التطبيقات المتعددة الصفحات، بما في ذلك كيفية إعدادها بأفضل أداء باستخدام العرض المسبق، يمكنك الاطّلاع على المحاضرة التالية التي قدّمها Bramus Van Damme:

مكوّنات واجهة المستخدم المتوافقة مع المحرّك: تبسيط التفاعلات المعقّدة

إنّ إنشاء تطبيقات ويب معقّدة ليس بالأمر السهل، ولكنّ لغتَي CSS وHTML تتطوّران لجعل هذه العملية أسهل بكثير. تساهم الميزات والتحسينات الجديدة في تبسيط عملية إنشاء عناصر واجهة المستخدِم، ما يتيح لك التركيز على تقديم تجارب رائعة. ويتم ذلك من خلال جهد تعاوني يشمل العديد من هيئات المعايير الرئيسية ومجموعات المنتدى، بما في ذلك CSS Working Group وOpen UI community Group وWHATWG (مجموعة عمل تكنولوجيا تطبيقات النص الفائق على الويب).

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

عنصر اختيار مع قائمة بيانات تتضمّن خيارات، وزر تشغيل، وسهم مؤشر، وخيار محدّد
تقسيم أجزاء عبارة select

تتألف القائمة المنسدلة من عدة أجزاء وتتضمّن العديد من الحالات التي يجب أخذها في الاعتبار، مثل:

  • عمليات ربط المفاتيح (للدخول إلى التفاعل أو الخروج منه)
  • النقر خارج النافذة لإغلاقها
  • إدارة النوافذ المنبثقة النشطة (إغلاق النوافذ المنبثقة الأخرى عند فتح إحداها)
  • إدارة التركيز على علامات التبويب
  • تصوُّر قيمة الخيار المحدّد
  • أسلوب التفاعل مع السهم
  • إدارة الحالة (فتح/إغلاق)

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

The Popover API

أولاً، أطلقنا سمة عامة باسم popover، ويسرّني أن أعلن أنّها أصبحت متاحة حديثًا في Baseline قبل بضعة أسابيع.

Browser Support

  • Chrome: 114.
  • Edge: 114.
  • Firefox: 125.
  • Safari: 17.

Source

يتم إخفاء عناصر Popover باستخدام display: none إلى أن يتم فتحها باستخدام عنصر استدعاء، مثل زر أو باستخدام JavaScript. لإنشاء عنصر popover أساسي، اضبط سمة popover على العنصر، واربط المعرّف الخاص به بزر باستخدام popovertarget. والآن، أصبح الزر هو المشغّل،

العرض المرئي التوضيحي

عرض توضيحي مباشر

<button popovertarget="my-popover">Open Popover</button>

<div id="my-popover" popover>
  <p>I am a popover with more information.</p>
</div>

بعد تفعيل السمة popover، يتعامل المتصفّح مع العديد من السلوكيات الرئيسية بدون أي نصوص برمجية إضافية، بما في ذلك:

  • الترقية إلى الطبقة العليا: طبقة منفصلة فوق بقية الصفحة، لذا لن تحتاج إلى التعامل مع z-index.
  • وظيفة الإغلاق السريع: سيؤدي النقر خارج منطقة النافذة المنبثقة إلى إغلاقها وإعادة التركيز.
  • الإدارة التلقائية لتركيز علامات التبويب: يؤدي فتح النافذة المنبثقة إلى إيقاف علامة التبويب التالية داخل النافذة المنبثقة.
  • اختصارات لوحة المفاتيح المضمّنة: سيؤدي الضغط على المفتاح esc أو التبديل المزدوج إلى إغلاق النافذة المنبثقة وإعادة التركيز.
  • عمليات الربط التلقائية للمكوّنات: : يربط المتصفّح بشكل دلالي بين لوحة العرض المنبثقة وعنصر التشغيل.
الشاشة الرئيسية في GitHub
قائمة في الصفحة الرئيسية GitHub

قد تستخدم واجهة برمجة التطبيقات هذه اليوم بدون أن تدرك ذلك. استخدمت GitHub النافذة المنبثقة في قائمة "جديد" على صفحتها الرئيسية وفي نظرة عامة على مراجعة طلبات السحب. وقد تم تحسين هذه الميزة تدريجيًا باستخدام popover polyfill، الذي أنشأته شركة Oddbird بدعم كبير من Keith Cirkel من GitHub، وذلك لتكون متوافقة مع المتصفحات القديمة.

"تمكّنا من إيقاف آلاف أسطر الرموز البرمجية نهائيًا من خلال نقلها إلى النافذة المنبثقة. تساعدنا Popover في التخلص من الحاجة إلى التعامل مع أرقام z-index السحرية... كما أنّ توفّر علاقة صحيحة في شجرة تسهيل الاستخدام مع سلوك الأزرار التوضيحي وسلوكيات التركيز المضمّنة يسهّل بشكل كبير على "نظام التصميم" تنفيذ الأنماط بالطريقة الصحيحة.-كيث سيركل، مهندس برمجيات، GitHub"

إنشاء حركات للدخول والخروج

عندما يكون لديك عناصر منبثقة، من المحتمل أنّك تريد إضافة بعض التفاعل. تم طرح أربع ميزات تفاعلية جديدة خلال العام الماضي لدعم تحريك النوافذ المنبثقة. ومن بينها:

إمكانية تحريك display وcontent-visibility على مخطط زمني للإطارات الرئيسية

الخاصية transition-behavior مع الكلمة الرئيسية allow-discrete لتفعيل عمليات الانتقال بين الخصائص المنفصلة، مثل display

Browser Support

  • Chrome: 117.
  • Edge: 117.
  • Firefox: 129.
  • Safari: 17.4.

Source

قاعدة @starting-style لتحريك تأثيرات الدخول من display: none إلى الطبقة العلوية

Browser Support

  • Chrome: 117.
  • Edge: 117.
  • Firefox: 129.
  • Safari: 17.5.

Source

خاصية التراكب للتحكّم في سلوك الطبقة العلوية أثناء الحركة

Browser Support

  • Chrome: 117.
  • Edge: 117.
  • Firefox: not supported.
  • Safari: not supported.

Source

تعمل هذه السمات مع أي عنصر تحرّكه إلى الطبقة العلوية، سواء كان عنصرًا منبثقًا أو مربّع حوار. في ما يلي الشكل الكامل لمربّع حوار يتضمّن خلفية:

العرض المرئي التوضيحي

عرض توضيحي مباشر

dialog, ::backdrop{
  opacity: 0;
  transition: opacity 1s, display 1s allow-discrete, overlay 1s allow-discrete;
}

[open], [open]::backdrop {
  opacity: 1;
}

@starting-style {
  [open], [open]::backdrop {
    opacity: 0;
  }
}

أولاً، اضبط السمة @starting-style لكي يعرف المتصفّح الأنماط التي يجب تحريك هذا العنصر بها في DOM. يتم ذلك لكلّ من مربع الحوار والخلفية. بعد ذلك، صمِّم الحالة المفتوحة لكلّ من مربّع الحوار والخلفية. بالنسبة إلى مربّع الحوار، يتم استخدام السمة open، وبالنسبة إلى النافذة المنبثقة، يتم استخدام العنصر الزائف ::popover-open. أخيرًا، حرِّك opacity وdisplay وoverlay باستخدام الكلمة الرئيسية allow-discrete لتفعيل وضع الحركة حيث يمكن أن تنتقل الخصائص المنفصلة.

موضع التثبيت

كانت ميزة Popover مجرد بداية القصة. من الأخبار السارّة أنّ ميزة تحديد موضع العنصر الثابت أصبحت متاحة الآن في الإصدار 125 من Chrome.

Browser Support

  • Chrome: 125.
  • Edge: 125.
  • Firefox: 147.
  • Safari: 26.

Source

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

العرض المرئي التوضيحي

عرض توضيحي مباشر

يمكنك إعداد علاقة تحديد موضع الإرساء في CSS باستخدام السمة anchor-name في عنصر الإرساء (الزر في هذه الحالة)، والسمة position-anchor في العنصر الذي تم تحديد موضعه (تلميح الأدوات في هذه الحالة). بعد ذلك، طبِّق تحديد الموضع المطلق أو الثابت بالنسبة إلى نقطة الارتكاز باستخدام الدالة anchor(). يضع الرمز التالي أعلى تلميح الأدوات في أسفل الزر.

.anchor {
  anchor-name: --my-anchor;
}

.positioned {
  position: absolute;
  position-anchor: --my-anchor;
}

يمكنك بدلاً من ذلك استخدام anchor-name مباشرةً في دالة anchor، وتخطّي السمة position-anchor. يمكن أن يكون ذلك مفيدًا عند الربط بعناصر متعددة.

.anchor {
  anchor-name: --my-anchor;
}

.positioned {
  position: absolute;
  top: anchor(--my-anchor bottom);
}

أخيرًا، استخدِم الكلمة الرئيسية anchor-center الجديدة للسمتَين justify وalign لتوسيط العنصر الذي تمّ تحديد موضعه في نقطة الارتكاز.

.anchor {
  anchor-name: --my-anchor;
}

.positioned {
  position: absolute;
  top: anchor(--my-anchor bottom);
  justify-self: anchor-center;
}

على الرغم من أنّ استخدام ميزة تحديد موضع العنصر الثابت مع العنصر المنبثق أمر مناسب جدًا، إلا أنّ العنصر المنبثق ليس شرطًا لاستخدام ميزة تحديد موضع العنصر الثابت. يمكن استخدام تحديد موضع عنصر ثابت مع أي عنصرَين (أو أكثر) لإنشاء علاقة مرئية. في الواقع، يعرض العرض التوضيحي التالي، المستوحى من مقالة من Roman Komarov، نمط تسطير يتم ربطه بعناصر القائمة أثناء التمرير فوقها أو الانتقال إليها باستخدام المفتاح Tab.

العرض المرئي التوضيحي

عرض توضيحي مباشر

يستخدم هذا المثال وظيفة التثبيت لضبط موضع التثبيت باستخدام الخصائص الفيزيائية left وright وbottom. عندما تمرّر مؤشر الماوس فوق أحد الروابط، يتغيّر العنصر المستهدف، ويغيّر المتصفّح موضع العنصر المستهدف لتطبيق تحديد الموضع، كما يتم تحريك اللون في الوقت نفسه لإنشاء تأثير أنيق.

ul::before {
  content: "";
  position: absolute;
  left:   anchor(var(--target) left);
  right:  anchor(var(--target) right);
  bottom: anchor(var(--target) bottom);
  ...
}

li:nth-child(1) { --anchor: --item-1 }
ul:has(:nth-child(1) a:is(:hover, :focus-visible)) {
  --target: --item-1;
  --color: red;
}

inset-area تحديد موضع الإعلان

بالإضافة إلى تحديد الموضع المطلق الاتجاهي التلقائي الذي سبق لك استخدامه على الأرجح، هناك آلية تخطيط جديدة مضمّنة تم إطلاقها كجزء من واجهة برمجة التطبيقات لتحديد موضع العنصر الثابت، وهي ما يُعرف باسم "منطقة الإدراج". تسهّل منطقة الإدراج وضع العناصر المحدّدة موضعًا بالنسبة إلى عناصر الارتساء الخاصة بها، وتعمل على شبكة من 9 خلايا مع عنصر الارتساء في المنتصف. على سبيل المثال، يضع inset-area: top العنصر الموضّع في الأعلى، بينما يضع inset-area: bottom العنصر الموضّع في الأسفل.

يبدو الإصدار المبسّط من العرض التوضيحي الأول لـ "الرسائل المثبّتة" على النحو التالي مع inset-area:

.anchor {
  anchor-name: --my-anchor;
}

.positioned {
  position: absolute;
  position-anchor: --my-anchor;
  inset-area: bottom;
}

يمكنك الجمع بين قيم المواضع هذه والكلمات الرئيسية التي تتضمّن مدى لتحديد موضع البدء في المنتصف، ثم تحديد مدى إلى اليسار أو اليمين أو تحديد مدى الكل لاستخدام المجموعة الكاملة من الأعمدة أو الصفوف المتاحة. يمكنك أيضًا استخدام الخصائص المنطقية. لتسهيل عرض آلية التنسيق هذه وفهمها، يمكنك الاطّلاع على هذه الأداة في الإصدار 125 من Chrome والإصدارات الأحدث:

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

العرض المرئي التوضيحي

عرض توضيحي مباشر

مواضع المرساة الديناميكية مع position-try-options

أصبحت قوائم التنقّل والقوائم الفرعية أسهل بكثير في الإنشاء باستخدام مزيج من عناصر العرض المنبثقة وتحديد موضع العنصر الثابت. وعندما تصل إلى حافة إطار العرض باستخدام العنصر الثابت، يمكنك السماح للمتصفّح بالتعامل مع تغيير الموضع نيابةً عنك أيضًا. يمكنك إجراء ذلك ببضع طرق. الخيار الأول هو إنشاء قواعد تحديد المواقع الخاصة بك. في هذه الحالة، يتم وضع القائمة الفرعية في البداية على يسار الزر "واجهة المتجر". ولكن يمكنك إنشاء حظر @position-try عندما لا تتوفّر مساحة كافية على يسار القائمة، مع منحها معرّفًا مخصّصًا هو --bottom. بعد ذلك، يمكنك ربط هذا المربّع @position-try بنقطة الارتكاز باستخدام position-try-options.

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

العرض المرئي التوضيحي

عرض توضيحي مباشر

#submenu {
  position-anchor: --submenu;
  top: anchor(top);
  left: anchor(right);
  margin-left: var(--padding);

  position-try-options: --bottom;

  transition: top 0.25s, left 0.25s;
  width: max-content;
}

@position-try --bottom {
  top: anchor(left);
  left: anchor(bottom);
  margin-left: var(--padding);
}

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

position-try-options: flip-block, flip-inline;

للحصول على تجربة بسيطة في قلب الكلمات الرئيسية، يمكنك الاستفادة من قيم الكلمات الرئيسية هذه وتخطّي كتابة تعريف position-try بالكامل. يمكنك الآن الحصول على عنصر ثابت سريع الاستجابة للموقع الجغرافي ويعمل بكامل طاقته باستخدام بضعة أسطر فقط من CSS.

العرض المرئي التوضيحي

عرض توضيحي مباشر

.tooltip {
  inset-area: top;
  position-try-options: flip-block;
}

مزيد من المعلومات عن استخدام ميزة "تحديد موضع الإعلان الثابت"

مستقبل واجهة المستخدم ذات الطبقات

نرى تجارب مرتبطة في كل مكان، ومجموعة الميزات الموضّحة في هذه المشاركة هي بداية ممتازة لإطلاق العنان للإبداع والتحكّم بشكل أفضل في العناصر ذات المواضع الثابتة والواجهات الطبقية. لا تشكل هذه الخطوة إلا البداية. على سبيل المثال، لا تعمل popover حاليًا إلا مع الأزرار كعنصر استدعاء أو مع JavaScript. بالنسبة إلى معاينات بأسلوب Wikipedia، وهو نمط شائع في جميع أنحاء منصة الويب، يجب أن يكون من الممكن التفاعل معها، كما يجب أن يكون من الممكن تشغيل نافذة منبثقة من رابط ومن المستخدم الذي يُبدي اهتمامًا بدون النقر بالضرورة، مثل التمرير أو التركيز على علامة التبويب.

كخطوة تالية في Popover API، نعمل على interesttarget لتلبية هذه الاحتياجات وتسهيل إعادة إنشاء هذه التجارب باستخدام أدوات تسهيل الاستخدام المناسبة المضمّنة. هذه مشكلة كبيرة في إمكانية الوصول، وهناك الكثير من الأسئلة المفتوحة حول السلوكيات المثالية، ولكن من شأن حلّ هذه المشكلة وتوحيد هذه الوظيفة على مستوى النظام الأساسي أن يحسّن هذه التجارب للجميع.

<a interesttarget="my-tooltip">Hover/Focus to show the tooltip</a>

<span popover=hint id="my-toolip">This is the tooltip</span>

بالإضافة إلى ذلك، يتوفّر منشّط عام آخر (invoketarget) يمكن تجربته في Canary بفضل جهود مطوّرَين خارجيَين، هما "كيث سيركل" و"لوك وارلو". تتيح invoketarget تجربة المطوّرين التعريفية التي توفّرها popovertarget، وهي تجربة موحّدة لجميع العناصر التفاعلية، بما في ذلك <dialog> و<details> و<video> و<input type="file"> وغير ذلك.

<button invoketarget="my-dialog">
  Open Dialog
</button>

<dialog id="my-dialog">
  Hello world!
</dialog>

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

قائمة اختيار قابلة للتصميم

باستخدام popover وanchor معًا، أحرز الفريق تقدمًا في إتاحة قائمة منسدلة قابلة للتخصيص. والخبر السار هو أنّنا أحرزنا تقدّمًا كبيرًا. الخبر السيئ هو أنّ واجهة برمجة التطبيقات هذه لا تزال في مرحلة تجريبية في الوقت الحالي. مع ذلك، يسرّني أن أشارك بعض العروض التوضيحية المباشرة وآخر الأخبار حول تقدّمنا، وآمل أن أتلقّى بعض ملاحظاتك. أولاً، تم إحراز تقدّم في كيفية منح المستخدمين خيار تفعيل تجربة "الاختيار والتخصيص" الجديدة. الطريقة الحالية التي لا تزال قيد التطوير لتنفيذ ذلك هي استخدام خاصية المظهر في CSS، وضبطها على appearance: base-select. بعد ضبط المظهر، سيتم تفعيل تجربة اختيار جديدة قابلة للتخصيص.

select {
  appearance: base-select;
}

بالإضافة إلى appearance: base-select، هناك بعض التعديلات الجديدة على HTML. وتشمل هذه الميزات إمكانية تضمين الخيارات في datalist للتخصيص وإمكانية إضافة محتوى غير تفاعلي، مثل الصور، في الخيارات. سيتوفّر لك أيضًا عنصر جديد، وهو <selectedoption>، الذي سيعرض محتوى الخيارات فيه، ويمكنك بعد ذلك تخصيصه حسب احتياجاتك. هذا العنصر مفيد جدًا.

العرض المرئي التوضيحي

عرض توضيحي لرمز الإبلاغ

عرض توضيحي مباشر

<select>
  <button type=popover>
    <selectedoption></selectedoption>
  </button>
  <datalist>
    <option value="" hidden>
      <p>Select a country</p>
    </option>
    <option value="andorra">
      <img src="Flag_of_Andorra.svg" />
      <p>Andorra</p>
    </option>
    <option value="bolivia">
      <img src="Flag_of_Bolivia.svg" />
      <p>Bolivia</p>
    </option>
...
  </datalist>
</select>

يوضّح الرمز التالي كيفية تخصيص <selectedoption> في واجهة مستخدم Gmail، حيث يمثّل رمز مرئي نوع الردّ الذي تم اختياره لتوفير المساحة. يمكنك استخدام أنماط العرض الأساسية ضمن selectedoption للتمييز بين نمط الخيار ونمط المعاينة. في هذه الحالة، يمكن إخفاء النص المعروض في الخيار بصريًا في selectedoption.

العرض المرئي التوضيحي

عرض توضيحي لـ Gmail

عرض توضيحي مباشر

selectedoption .text {
  display: none;
}

إحدى أكبر مزايا إعادة استخدام العنصر <select> لواجهة برمجة التطبيقات هذه هي التوافق مع الأنظمة القديمة. في أداة اختيار البلد هذه، يمكنك الاطّلاع على واجهة مستخدم مخصّصة تتضمّن صور أعلام في الخيارات لتسهيل تحليل المحتوى على المستخدم. بما أنّ المتصفّحات غير المتوافقة ستتجاهل الأسطر التي لا تفهمها، مثل الزر المخصّص وقائمة البيانات وخيار selectedoption والصور داخل الخيارات، سيكون الخيار الاحتياطي مشابهًا لواجهة المستخدم الحالية التلقائية للاختيار.

يحصل المتصفّح غير المتوافق على تجربة التحديد الحالية.
صورة على اليمين تعرض المتصفّح المتوافق، وصورة على اليسار تعرض المتصفّح غير المتوافق.

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

العرض المرئي التوضيحي

عرض توضيحي مباشر

أكورديون حصري

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

Browser Support

  • Chrome: 120.
  • Edge: 120.
  • Firefox: 130.
  • Safari: 17.2.

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

عرض توضيحي حصري للأكورديون
<details name="learn-css" open>
  <summary>Welcome to Learn CSS!</summary>
</details>

<details name="learn-css">
  <summary>Box Model</summary>
  <p>...</p>
</details>

<details name="learn-css">
  <summary>Selectors</summary>
  <p>...</p>
</details>

:user-valid و:user-invalid

من التحسينات الأخرى على مكونات واجهة المستخدم الفئتان الصوريتان :user-valid و:user-invalid. تتوفّر الفئتان الزائفتان :user-valid و:user-invalid في جميع المتصفّحات مؤخرًا، وتعملان بشكل مشابه للفئتين الزائفتين :valid و:invalid، ولكنّهما تتطابقان مع عنصر تحكّم في النموذج فقط بعد أن يتفاعل المستخدم بشكل كبير مع الإدخال. وهذا يعني أنّنا نحتاج إلى قدر أقل بكثير من الرموز البرمجية لتحديد ما إذا تم التفاعل مع قيمة نموذج معيّن أو ما إذا أصبحت "غير صالحة"، وهو ما يمكن أن يكون مفيدًا جدًا لتقديم ملاحظات للمستخدمين، ويقلّل من الكثير من البرامج النصية التي كانت ضرورية لتنفيذ ذلك في السابق.

Browser Support

  • Chrome: 119.
  • Edge: 119.
  • Firefox: 88.
  • Safari: 16.5.

Source

عرض توضيحي باستخدام تطبيق Screencast

عرض توضيحي مباشر

input:user-valid,
select:user-valid,
textarea:user-valid {
    --state-color: green;
    --bg: linear-gradient(...);
}

input:user-invalid,
select:user-invalid,
textarea:user-invalid {
    --state-color: red;
    --bg: linear-gradient(...);
}

مزيد من المعلومات عن استخدام العناصر الزائفة للتحقّق من صحة النموذج user-*

field-sizing: content

من بين التحديثات المفيدة الأخرى التي تم طرحها مؤخرًا، field-sizing: content، والتي يمكن تطبيقها على عناصر التحكّم في النماذج، مثل حقول الإدخال ومساحات النصوص. يتيح ذلك زيادة (أو تقليل) حجم الإدخال استنادًا إلى محتواه. يمكن أن يكون field-sizing: content مفيدًا بشكل خاص لمربّعات النصوص، إذ لن تضطر بعد الآن إلى استخدام أحجام ثابتة قد تحتاج فيها إلى التمرير للأعلى للاطّلاع على ما كتبته في الأجزاء السابقة من طلبك في مربّع إدخال صغير جدًا.

Browser Support

  • Chrome: 123.
  • Edge: 123.
  • Firefox: not supported.
  • Safari: 26.2.

Source

عرض توضيحي باستخدام تطبيق Screencast

عرض توضيحي مباشر

textarea, select, input {
  field-sizing: content;
}

مزيد من المعلومات عن تغيير حجم الحقول

<hr> في <select>

تُعدّ إمكانية تفعيل <hr> أو عنصر القاعدة الأفقية في عمليات التحديد ميزة صغيرة ولكنها مفيدة. على الرغم من أنّ هذا العنصر لا يُستخدَم كثيرًا لأغراض دلالية، إلا أنّه يساعدك في فصل المحتوى بشكل جيد ضمن قائمة اختيار، لا سيما المحتوى الذي قد لا تريد بالضرورة تجميعه باستخدام optgroup، مثل قيمة العنصر النائب.

اختيار لقطة شاشة

لقطة شاشة لعنصر hr في أداة الاختيار مع مظهر فاتح ومظهر داكن في Chrome

اختَر "عرض توضيحي مباشر".

<select name="majors" id="major-select">
  <option value="">Select a major</option>
  <hr>
  <optgroup label="School of Fine Arts">
    <option value="arthist">
Art History
  </option>
  <option value="finearts">
    Fine Arts
  </option>
...
</select>

مزيد من المعلومات عن استخدام hr في select

تحسينات على تجربة المستخدم

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

الدمج مع البحث المسبق

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

Browser Support

  • Chrome: 120.
  • Edge: 120.
  • Firefox: 117.
  • Safari: 17.2.

Source

من الميزات المفضّلة لديّ في ميزة "التداخل في CSS" أنّها تتيح لك حظر المكوّنات بشكل مرئي، وتضمين الحالات والمعدّلات ضمن هذه المكوّنات، مثل طلبات البحث في الحاويات وطلبات البحث في الوسائط. في السابق، كنت أجمع كل طلبات البحث هذه في أسفل الملف لأغراض التحديد. يمكنك الآن كتابتها بطريقة منطقية بجانب بقية الرمز البرمجي

.card {
  /* card base styles */

  h2 {
    /* child element style */
  }

  &.highlight {
    /* modifier style */
  }

  &:hover, &:focus {
    /* state styles */
  }

  @container (width >= 300px) {
    /* container query styles */
  }
}

Align-content for block layout

التغيير الآخر الجيد هو إمكانية استخدام آليات التوسيط، مثل align-content في تخطيط الكتلة. وهذا يعني أنّه يمكنك الآن تنفيذ إجراءات مثل التوسيط العمودي داخل عنصر div بدون الحاجة إلى تطبيق تنسيق مرن أو شبكي، وبدون آثار جانبية مثل منع انهيار الهامش، وهو ما قد لا تريده من خوارزميات التنسيق هذه.

Browser Support

  • Chrome: 123.
  • Edge: 123.
  • Firefox: 125.
  • Safari: 17.4.

لقطة شاشة

عرض توضيحي مباشر

div {
  align-content: center;
}

Text-wrap: balance and pretty

في ما يتعلّق بالتنسيق، تم إدخال تحسينات رائعة على تنسيق النص من خلال إضافة text-wrap: balance وpretty. يتم استخدام text-wrap: balance للحصول على فقرة نصية أكثر اتساقًا، بينما يركّز text-wrap: pretty على تقليل الكلمات المنفردة في السطر الأخير من النص.

عرض توضيحي باستخدام تطبيق Screencast

عرض توضيحي مباشر

في العرض التوضيحي التالي، يمكنك إجراء مقارنة عن طريق سحب شريط التمرير، وتأثيرات balance وpretty على عنوان وفقرة. جرِّب ترجمة العرض التوضيحي إلى لغة أخرى.
h1 {
  text-wrap: balance;
}

مزيد من المعلومات حول text-wrap: balance

تعديلات على الطباعة الدولية

تلقّت تعديلات على التنسيق الطباعي لميزات النص باللغات الصينية واليابانية والكورية الكثير من التعديلات الرائعة خلال العام الماضي، مثل ميزة word-break: auto-phrase التي تلتف حول السطر عند حدود العبارة الطبيعية.

Browser Support

  • Chrome: 119.
  • Edge: 119.
  • Firefox: not supported.
  • Safari: not supported.

word-break: auto-phrase wraps the line at the natural phrase boundary.
مقارنة بين word-break: normal وword-break: auto-phrase

وtext-spacing-trim، الذي يطبّق تباعد الأحرف بين علامات الترقيم لتحسين سهولة قراءة النصوص الصينية واليابانية والكورية والحصول على نتائج أكثر جاذبية من الناحية المرئية.

Browser Support

  • Chrome: 123.
  • Edge: 123.
  • Firefox: not supported.
  • Safari: not supported.

Source

تتم إزالة النصف الأيمن من النقطة في لغات CJK باستخدام text-spacing-trim.
عند ظهور علامات ترقيم متتالية، يجب إزالة النصف الأيسر من النقطة في اللغات الصينية واليابانية والكورية.

بنية الألوان النسبية

في عالم تصميم الألوان، لاحظنا تحديثًا كبيرًا في ما يتعلق ببنية الألوان النسبية.

في هذا المثال، تستخدم الألوان هنا تصميمًا مستندًا إلى Oklch. عندما يتم تعديل قيمة اللون استنادًا إلى شريط التمرير، يتغيّر المظهر بأكمله. ويمكن تحقيق ذلك باستخدام بنية الألوان النسبية. تستخدِم الخلفية اللون الأساسي، استنادًا إلى درجة اللون، وتعدّل قنوات السطوع والصفاء ودرجة اللون لضبط قيمتها. ‫--i هو فهرس العنصر المجاور في القائمة لتدرّج القيم، ما يوضّح كيف يمكنك الجمع بين التدرّج والخصائص المخصّصة وبنية ألوان نسبية لإنشاء مظاهر.

عرض توضيحي باستخدام تطبيق Screencast

عرض توضيحي مباشر

في العرض التوضيحي التالي، يمكنك إجراء مقارنة عن طريق سحب شريط التمرير، وتأثيرات balance وpretty على عنوان وفقرة. جرِّب ترجمة العرض التوضيحي إلى لغة أخرى.
:root {
  --hue: 230;
  --primary: oklch(70% .2 var(--hue));
}

li {
  --_bg: oklch(from var(--primary)
    calc(l - (var(--i) * .05))
    calc(c - (var(--i) * .01))
    calc(h - (var(--i) + 5)));
}

دالة light-dark()

إلى جانب الدالة light-dark()، أصبحت عملية تطبيق السمات أكثر ديناميكية وبساطة.

Browser Support

  • Chrome: 123.
  • Edge: 123.
  • Firefox: 120.
  • Safari: 17.5.

Source

الدالة light-dark() هي تحسين مريح يسهّل خيارات ألوان المظهر حتى تتمكّن من كتابة أنماط المظهر بطريقة أكثر إيجازًا، كما هو موضّح بشكل جيد في هذا الرسم البياني المرئي من إعداد Adam Argyle. في السابق، كان عليك استخدام مجموعتَين مختلفتَين من الرموز البرمجية (المظهر التلقائي وطلب البحث عن الإعدادات المفضّلة للمستخدم) لإعداد خيارات المظهر. يمكنك الآن كتابة خيارات الأنماط هذه لكل من المظهرين الفاتح والداكن في سطر CSS نفسه باستخدام الدالة light-dark().

تمثيل مرئي لـ light-dark() اطّلِع على العرض التوضيحي لمعرفة المزيد.
html {
  color-scheme: light dark;
}

button {
    background-color: light-dark(lightblue, darkblue);
}

إذا اختار المستخدم مظهرًا فاتحًا، سيظهر الزر بخلفية زرقاء فاتحة. إذا اختار المستخدم مظهرًا داكنًا، سيظهر الزر بخلفية زرقاء داكنة.

أداة اختيار :has()

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

Browser Support

  • Chrome: 105.
  • Edge: 105.
  • Firefox: 121.
  • Safari: 15.4.

Source

يتيح لك أداة الاختيار :has() التحقّق مما إذا كان العنصر الثانوي يتضمّن عناصر ثانوية محدّدة، أو ما إذا كانت هذه العناصر الثانوية في حالة محدّدة، ويمكن أن تعمل بشكل أساسي كأداة اختيار للعنصر الرئيسي أيضًا.

عرض توضيحي لاستخدام has() لتصميم مربّعات المقارنة على Tokopedia.

لقد تبيّن أنّ :has() مفيد بشكل خاص للعديد من الشركات، بما في ذلك PolicyBazaar، التي تستخدم :has() لتصميم الكتل استنادًا إلى محتواها الداخلي، مثل قسم المقارنة، حيث يتم تعديل التصميم إذا كانت هناك خطة للمقارنة في الكتلة، أو إذا كانت فارغة.

"باستخدام أداة الاختيار ‎ :has()‎، تمكّنا من إلغاء عملية التحقّق المستندة إلى JavaScript من اختيار المستخدم واستبدالها بحلّ CSS يعمل بسلاسة بالنسبة إلينا ويقدّم تجربة مماثلة للتجربة السابقة. - "أمان سوني"، قائد الفريق الفني في PolicyBazaar"

طلبات الحاويات

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

Browser Support

  • Chrome: 105.
  • Edge: 105.
  • Firefox: 110.
  • Safari: 16.

Source

أطلقت Angular مؤخرًا موقعًا إلكترونيًا جديدًا وجميلاً للمستندات على angular.dev باستخدام طلبات البحث في الحاويات لتنسيق كتل العناوين استنادًا إلى المساحة المتاحة لها على الصفحة. وبالتالي، حتى إذا تغيّر التنسيق من تنسيق شريط جانبي متعدد الأعمدة إلى تنسيق عمود واحد، يمكن أن تتكيّف كتل العناوين تلقائيًا.

Angular.dev

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

عرض توضيحي باستخدام تطبيق Screencast

عرض توضيحي مباشر

إعادة إنشاء طلب البحث عن حاوية بطاقة العنوان في Angular

@property

وأخيرًا، نحن متحمّسون لإطلاق @property في Baseline قريبًا جدًا. هذه ميزة أساسية لتوفير معنى دلالي لخصائص CSS المخصّصة (المعروفة أيضًا باسم متغيرات CSS)، وتتيح مجموعة من ميزات التفاعل الجديدة. تتيح @property أيضًا المعنى السياقي والتحقّق من النوع والقيم التلقائية والقيم الاحتياطية في CSS. فتح الأبواب أمام ميزات أكثر فعالية، مثل طلبات البحث المتعلقة بنطاق الأنماط هذه ميزة لم تكن متاحة من قبل، وهي تتيح الآن فهمًا أعمق للغة CSS.

Browser Support

  • Chrome: 85.
  • Edge: 85.
  • Firefox: 128.
  • Safari: 16.4.

Source

عرض توضيحي باستخدام تطبيق Screencast

عرض توضيحي مباشر

@property --card-bg {
  syntax: "<color>";
  inherits: false;
  initial-value: #c0bae8;
}

الخاتمة

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

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

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

للاطّلاع على مزيد من المعلومات حول هذه الميزات الجديدة عند توفّرها، يمكنك متابعة developer.chrome.com وweb.dev، حيث يشارك فريقنا آخر الأخبار في تكنولوجيات الويب. ننصحك بتجربة الرسوم المتحركة المستندة إلى التمرير أو انتقالات العرض أو تحديد موضع العنصر الثابت أو حتى أداة الاختيار القابلة للتصميم، وإعلامنا برأيك. نحن في الخدمة.