انتقال‌های بین‌سندی

انتقال‌های نمای بین‌سندی به شما امکان می‌دهند انتقال‌های روان و شبیه به برنامه بین صفحه‌های مختلف یک «برنامه چندصفحه‌ای» (MPA) ایجاد کنید. به‌طور پیش‌فرض، مرورگر محو تدریجی متقاطع انجام می‌دهد، اما می‌توانید این را برای مطابقت با زیبایی‌شناسی سایتتان سفارشی‌سازی کنید.

مراحل پیاده‌سازی

۱. موافقت کردن با «انتقال‌های نمای بین‌سندی»

هر دو صفحه مبدأ و مقصد باید برای مشاهده گذارها موافقت کنند تا مرورگر بتواند آن‌ها را در پیمایش فعال کند.

/* 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;
  }
}

۲. سفارشی‌سازی پویانمایی‌های گذار (اختیاری)

می‌توانید حالت‌های قدیمی و جدید انتقال را بااستفاده از شبه‌عناصر هدف‌یابی کنید تا جلوه‌هایی مانند اسلاید یا آشکارسازی ایجاد کنید.

/* 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%); }
}

۳. ایجاد انتقال‌های جهت‌دار (اختیاری)

بسته به صفحه‌هایی که بین آن‌ها پیمایش می‌کنید، ممکن است جلوه‌های انتقال متفاوتی بخواهید. برای مثال، هنگام پیمایش از صفحه اصلی به صفحه تماس، ممکن است بخواهید جلوه محتوای جدید از سمت راست وارد شود. وقتی به صفحه اصلی برمی‌گردید، منطقی نیست که همان جلوه را داشته باشید.

اگر صفحه‌ای که به آن پیمایش می‌کنید همیشه نوع انتقال یکسانی داشته باشد، صرف‌نظر از اینکه چگونه به صفحه می‌رسید، می‌توانید آن را با 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;
  }
}

راهبردهای جایگزین

اگر مرورگری از گذار نمای یا گذار نمای بین‌سندی پشتیبانی نکند، ناوبری صفحه فوری استاندارد را انجام خواهد داد. انتقال‌های نمای بین‌سندی یک ارتقای پیش‌رو است؛ عملکرد اصلی سایت تحت تأثیر قرار نمی‌گیرد.

برای بررسی پشتیبانی در جاوا اسکریپت:

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

اگر مرورگری از Navigation API پشتیبانی نکند، نمی‌توانید از آن برای تعیین نوع انتقال استفاده کنید. از روش جایگزینی برای تعیین نوع انتقال استفاده کنید یا نوع انتقال بازگشتی ارائه دهید. درغیراین‌صورت، مرورگر پیمایش صفحه فوری استاندارد را انجام خواهد داد.

برای بررسی پشتیبانی در جاوا اسکریپت:

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