الانتقالات بين المستندات

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

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

1. الموافقة على ميزة "انتقالات العرض بين المستندات"

يجب أن تفعّل كل من الصفحتَين المصدر والوجهة ميزة "انتقالات العرض" لكي يشغّلها المتصفّح عند التنقّل.

/* Respect user's preference for reduced motion */
@media (prefers-reduced-motion: no-preference) {
  /* Add to a global stylesheet shared by both pages */
  @view-transition {
    /* Enables transitions for same-origin navigations */
    navigation: auto;
  }
}

2. تخصيص الصور المتحركة للانتقال (اختياري)

يمكنك استهداف الحالتَين القديمة والجديدة للانتقال باستخدام عناصر زائفة لإنشاء تأثيرات مثل الشرائح أو الكشف.

/* Customizing the outgoing page animation */
::view-transition-old(root) {
  /* Move the old page out to the left */
  animation: 0.4s ease-in both slide-out;
}

/* Customizing the incoming page animation */
::view-transition-new(root) {
  /* Move the new page in from the right */
  animation: 0.4s ease-out both slide-in;
}

@keyframes slide-out {
  to { transform: translateX(-20%); opacity: 0; }
}

@keyframes slide-in {
  from { transform: translateX(100%); }
}

3- إنشاء انتقالات اتجاهية (اختياري)

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

إذا كانت الصفحة التي تنتقل إليها ستتضمّن دائمًا نوع الانتقال نفسه، بغض النظر عن كيفية الوصول إلى الصفحة، يمكنك تحديده باستخدام types في القاعدة @view-transition.

@media (prefers-reduced-motion: no-preference) {
  @view-transition {
    navigation: auto;
    /* Specify the types of view transitions that will always be used on this page. */
    types: previous;
  }
}

يمكنك أيضًا تحديد أنواع الانتقال بشكل مشروط داخل متتبِّع الأحداث لـ pagereveal.

window.addEventListener("pagereveal", async (e) => {
  if (e.viewTransition && window.navigation?.activation) {
    // Use application-specific logic to compute a transition type
     const transitionType = yourTransitionTypeLogic(navigation.activation.from, navigation.activation.entry);
    e.viewTransition.types.add(transitionType);
  }
});

بعد ذلك، استخدِم أداة الاختيار الزائفة :active-view-transition-type() لتطبيق الصور المتحركة المختلفة لكل نوع.

:active-view-transition-type(next) {
  &::view-transition-old(root) {
    animation-name: slide-out-next;
  }

  &::view-transition-new(root) {
    animation-name: slide-in-next;
  }
}
:active-view-transition-type(previous) {
  &::view-transition-old(root) {
    animation-name: slide-out-previous;
  }

  &::view-transition-new(root) {
    animation-name: slide-in-previous;
  }
}

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

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

للتحقّق من توفّر الدعم في JavaScript:

if ('onpagereveal' in window) {
  // Browser supports cross-document view transitions
}

إذا كان المتصفّح لا يتيح Navigation API، لن تتمكّن من استخدامها لتحديد نوع الانتقال. استخدِم طريقة بديلة لتحديد نوع الانتقال، أو قدِّم نوع انتقال احتياطيًا. وإلا، سينفّذ المتصفّح عملية تنقّل عادية في الصفحة الفورية.

للتحقّق من توفّر الدعم في JavaScript:

if (window.navigation?.activation) {
  // Browser supports the Navigation API
}