الانتقالات الاتجاهية للتنقّل

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

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

خطوات التنفيذ

  1. رصد اتجاه التنقّل: يمكنك تحديد ما إذا كان المستخدم يتنقّل "للأمام" أو "للخلف" في مسار التطبيق. تعتمد طريقة رصد الاتجاه على حالة الاستخدام.
  2. تفعيل الانتقال باستخدام الأنواع: يمكنك تمرير الاتجاه في مصفوفة types إلى document.startViewTransition() لتصنيف الانتقال.
  3. تحديد الصور المتحركة الاتجاهية باستخدام CSS: استخدِم الفئة الزائفة :active-view-transition-type() لتطبيق صور متحركة معيّنة استنادًا إلى نوع التنقّل.

تعريف الإطارات الرئيسية

حدِّد حركات الانزلاق من كل اتجاه وإليه. للحصول على أفضل أداء، يمكنك تحريك تغييرات الموضع باستخدام السمة transform أو سمات التحويل الفردية، scale وrotate وtranslate. opacity بشكل عام، ولكن تجنَّب تحريك خصائص CSS الأخرى بدون التحقّق أولاً من أنّها لا تؤدي إلى تشغيل التنسيق أو الرسم.

/* Slide an element out to the left */
@keyframes slide-to-left {
  /* Mandatory: animate `transform` instead of inset properties for better performance. */
  to { transform: translateX(-100%); }
}

/* Slide an element in from the right */
@keyframes slide-from-right {
  from { transform: translateX(100%); }
}

/* Slide an element out to the right */
@keyframes slide-to-right {
  to { transform: translateX(100%); }
}

/* Slide an element in from the left */
@keyframes slide-from-left {
  from { transform: translateX(-100%); }
}

إعداد إعدادات الصور المتحركة المشتركة

استخدِم أداة الاختيار ::view-transition-group(root) لتطبيق إعدادات الحركة التي تتم مشاركتها في جميع الانتقالات.

::view-transition-group(root){
  animation: 0.4s ease-in-out both;
}

تطبيق الصور المتحركة الاتجاهية

استخدِم الفئة الزائفة active-view-transition-type لاستهداف طرق عرض الانتقال تحديدًا عندما يكون النوع "forward" أو "backward" نشطًا.

/* MANDATORY: Apply forward animations when the 'forward' type is active */
html:active-view-transition-type(forward)::view-transition-old(root) {
  animation-name: slide-to-left;
}
html:active-view-transition-type(forward)::view-transition-new(root) {
  animation-name: slide-from-right;
}

/* MANDATORY: Apply backward animations when the 'backward' type is active */
html:active-view-transition-type(backward)::view-transition-old(root) {
  animation-name: slide-to-right;
}
html:active-view-transition-type(backward)::view-transition-new(root) {
  animation-name: slide-from-left;
}

بدء عملية النقل

عند التنقّل، مرِّر النوع المناسب إلى الإجراء startViewTransition.

const transitionType = yourTransitionTypeLogic();
const updateDOM = yourUpdateDOMLogic();

document.startViewTransition({
  update: updateDOM,
  types: [transitionType] // Matches the CSS :active-view-transition-type() selectors
});

تسهيل الاستخدام

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

@media (prefers-reduced-motion: reduce) {
  ::view-transition-group(root) {
    animation: none !important;
  }
}

استراتيجيات احتياطية

تُعدّ View Transitions API تحسينًا متدرّجًا. في المتصفّحات غير المتوافقة، سيتم undefined "document.startViewTransition". يجب تضمين منطق التنقّل في عملية التحقّق من رصد الميزات لضمان استمرار تحديث نموذج DOM على الفور بدون تأثيرات متحركة، كما هو موضّح في هذه الدالة المساعِدة.

/**
 * Navigates to a new view with a directional transition.
 * @param {Function} updateDOM - Callback to update the DOM state.
 * @param {string} direction - Either 'forward' or 'backward'.
 */
function navigate(updateDOM, direction) {
  // Feature detect for browsers that do not support View Transitions
  if (!document.startViewTransition) {
    updateDOM();
    return;
  }

  // Start transition with the specific navigation type
  document.startViewTransition({
    update: updateDOM,
    types: [direction] // Matches the CSS :active-view-transition-type() selectors
  });
}