การเปลี่ยนข้ามเอกสาร

ฟีเจอร์บนเว็บ: View transitions Cross-document view transitions Navigation API

การเปลี่ยนมุมมองข้ามเอกสารช่วยให้คุณสร้างการเปลี่ยนภาพที่ราบรื่นเหมือนแอปได้ระหว่างหน้าต่างๆ ของแอปพลิเคชันแบบหลายหน้า (MPA) โดยค่าเริ่มต้น เบราว์เซอร์จะทำการเฟดแบบไขว้ แต่คุณสามารถปรับแต่งให้เข้ากับความสวยงามของเว็บไซต์ได้

ขั้นตอนการติดตั้งใช้งาน

1. เลือกใช้การเปลี่ยนมุมมองข้ามเอกสาร

ทั้งหน้าต้นทางและปลายทางต้องเลือกใช้ View Transitions เพื่อให้เบราว์เซอร์ทริกเกอร์การเปลี่ยนมุมมองในการนําทาง

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

นอกจากนี้ คุณยังระบุประเภทการเปลี่ยนภาพแบบมีเงื่อนไขภายใน Listener เหตุการณ์สำหรับ 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;
  }
}

กลยุทธ์สำรอง

หากเบราว์เซอร์ไม่รองรับ View Transition หรือ View Transition ข้ามเอกสาร เบราว์เซอร์จะทำการนำทางหน้าเว็บแบบมาตรฐานทันที การเปลี่ยนมุมมองข้ามเอกสารเป็นการเพิ่มประสิทธิภาพแบบต่อเนื่อง โดยฟังก์ชันหลักของเว็บไซต์จะไม่ได้รับผลกระทบ

วิธีตรวจสอบการรองรับใน JavaScript

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

หากเบราว์เซอร์ไม่รองรับ Navigation API คุณจะใช้ API นี้เพื่อระบุประเภทการเปลี่ยนผ่านไม่ได้ ใช้วิธีอื่นในการกำหนดประเภทการเปลี่ยนผ่าน หรือระบุประเภทการเปลี่ยนผ่านสำรอง มิฉะนั้น เบราว์เซอร์จะทำการนำทางหน้าเว็บแบบมาตรฐานทันที

วิธีตรวจสอบการรองรับใน JavaScript

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