ปฏิบัติจริงกับพอร์ทัล: ไปยังส่วนต่างๆ บนเว็บได้อย่างราบรื่น

ดูวิธีที่ Portals API นำเสนอจะช่วยปรับปรุง UX การนำทางของคุณ

การตรวจสอบว่าหน้าเว็บโหลดได้เร็วคือกุญแจสำคัญในการมอบประสบการณ์ที่ดีให้แก่ผู้ใช้ แต่สิ่งหนึ่งที่เรามักมองข้ามไปก็คือการเปลี่ยนหน้า ซึ่งผู้ใช้จะเห็น จะเลื่อนไปมาระหว่างหน้าต่างๆ

ข้อเสนอ API แพลตฟอร์มเว็บใหม่ที่ชื่อพอร์ทัลมีเป้าหมาย โดยจะช่วยปรับปรุงประสบการณ์ในขณะที่ผู้ใช้ไปยังส่วนต่างๆ ของ ของคุณ

ดูการทำงานของพอร์ทัล

การฝังและการนำทางที่ราบรื่นด้วยพอร์ทัล สร้างโดย Adam Argyle

พอร์ทัลใดที่เปิดใช้งาน

แอปพลิเคชันหน้าเว็บเดียว (SPA) ให้การเปลี่ยนผ่านได้ดี แต่มีค่าใช้จ่ายที่มีความซับซ้อนในการสร้างมากกว่า แอปพลิเคชันแบบหลายหน้า (MPA) สร้างได้ง่ายกว่าเดิมมาก แต่สุดท้ายแล้วคุณกลับมีหน้าจอว่างเปล่าระหว่างหน้า

พอร์ทัลนำเสนอสิ่งที่ดีที่สุดจากทั้ง 2 แพลตฟอร์ม ความซับซ้อนที่ต่ำของ MPA กับการเปลี่ยน SPA อย่างราบรื่น เปรียบเสมือน <iframe> ที่ช่วยให้สามารถฝัง แต่ต่างจาก <iframe> พวกเขายังมาพร้อมกับคุณลักษณะ ที่จะพาไปยังเนื้อหาของพวกเขาอีกด้วย

การมองเห็นคือความเชื่อ: โปรดดูสิ่งที่เรานำเสนอใน Chrome Dev Summit 2018 ก่อน

เมื่อใช้การนำทางแบบคลาสสิก ผู้ใช้ต้องรอหน้าจอว่างเปล่า จนกว่าเบราว์เซอร์จะแสดงผลปลายทางเสร็จ สำหรับพอร์ทัล ผู้ใช้จะได้สัมผัสกับภาพเคลื่อนไหว ขณะที่ <portal> แสดงผลเนื้อหาล่วงหน้าและสร้างประสบการณ์การนำทางที่ราบรื่น

ก่อนพอร์ทัล เราสามารถแสดงหน้าเว็บอื่นโดยใช้ <iframe> เราสามารถเพิ่มภาพเคลื่อนไหวเพื่อย้ายเฟรมรอบๆ หน้าได้ แต่ <iframe> จะไม่อนุญาตให้คุณไปยังเนื้อหา พอร์ทัลจะปิดช่องว่างนี้ ทำให้เกิด Use Case ที่น่าสนใจ

ลองใช้พอร์ทัล

การเปิดใช้ผ่าน about://flags

ลองใช้พอร์ทัลใน Chrome 85 และเวอร์ชันใหม่กว่าโดยพลิก Flag แบบทดลองดังนี้

  • เปิดใช้ Flag about://flags/#enable-portals สำหรับการนำทางจากต้นทางเดียวกัน
  • สำหรับการทดสอบการนำทางแบบข้ามต้นทาง ให้เปิดใช้ Flag about://flags/#enable-portals-cross-origin เพิ่มเติม

ในช่วงแรกของการทดสอบพอร์ทัล เราขอแนะนำให้คุณใช้ไดเรกทอรีข้อมูลผู้ใช้แยกต่างหากสำหรับการทดสอบของคุณ โดยการตั้งค่า --user-data-dir Flag บรรทัดคำสั่ง เมื่อเปิดใช้พอร์ทัลแล้ว ให้ยืนยันในเครื่องมือสำหรับนักพัฒนาเว็บว่าคุณมี HTMLPortalElement ใหม่

ภาพหน้าจอของคอนโซลเครื่องมือสำหรับนักพัฒนาเว็บที่แสดง HTMLPortalElement

ใช้งานพอร์ทัล

ลองดูตัวอย่างการใช้งานเบื้องต้น

// Create a portal with the wikipedia page, and embed it
// (like an iframe). You can also use the <portal> tag instead.
portal = document.createElement('portal');
portal.src = 'https://en.wikipedia.org/wiki/World_Wide_Web';
portal.style = '...';
document.body.appendChild(portal);

// When the user touches the preview (embedded portal):
// do fancy animation, e.g. expand …
// and finish by doing the actual transition.
// For the sake of simplicity, this snippet will navigate
// on the `onload` event of the Portals element.
portal.addEventListener('load', (evt) => {
   portal.activate();
});

ง่ายๆ เท่านี้เลย ลองใช้โค้ดนี้ในคอนโซลเครื่องมือสำหรับนักพัฒนาเว็บ หน้า Wikipedia จะเปิดขึ้น

GIF ของการสาธิตสไตล์พอร์ทัลตัวอย่าง

หากคุณต้องการสร้างสรรค์สิ่งที่เราแสดงไว้ในงาน Chrome Dev Summit ซึ่งมีการทำงานเหมือนกับการสาธิตข้างต้น ตัวอย่างวิดีโอที่คุณอาจสนใจ

// Adding some styles with transitions
const style = document.createElement('style');
style.innerHTML = `
  portal {
    position:fixed;
    width: 100%;
    height: 100%;
    opacity: 0;
    box-shadow: 0 0 20px 10px #999;
    transform: scale(0.4);
    transform-origin: bottom left;
    bottom: 20px;
    left: 20px;
    animation-name: fade-in;
    animation-duration: 1s;
    animation-delay: 2s;
    animation-fill-mode: forwards;
  }
  .portal-transition {
    transition: transform 0.4s;
  }
  @media (prefers-reduced-motion: reduce) {
    .portal-transition {
      transition: transform 0.001s;
    }
  }
  .portal-reveal {
    transform: scale(1.0) translateX(-20px) translateY(20px);
  }
  @keyframes fade-in {
    0%   { opacity: 0; }
    100% { opacity: 1; }
  }
`;
const portal = document.createElement('portal');
// Let's navigate into the WICG Portals spec page
portal.src = 'https://wicg.github.io/portals/';
// Add a class that defines the transition. Consider using
// `prefers-reduced-motion` media query to control the animation.
// https://developers.google.com/web/updates/2019/03/prefers-reduced-motion
portal.classList.add('portal-transition');
portal.addEventListener('click', (evt) => {
  // Animate the portal once user interacts
  portal.classList.add('portal-reveal');
});
portal.addEventListener('transitionend', (evt) => {
  if (evt.propertyName == 'transform') {
    // Activate the portal once the transition has completed
    portal.activate();
  }
});
document.body.append(style, portal);

นอกจากนี้ยังง่ายต่อการตรวจหาฟีเจอร์เพื่อปรับปรุงเว็บไซต์อย่างต่อเนื่องโดยใช้พอร์ทัล

if ('HTMLPortalElement' in window) {
  // If this is a platform that have Portals...
  const portal = document.createElement('portal');
  ...
}

หากคุณต้องการดูว่าพอร์ทัลมีลักษณะเป็นอย่างไร ให้ลองใช้ uskay-portals-demo.glitch.me. โปรดตรวจสอบว่าคุณเข้าถึงเครื่องมือดังกล่าวด้วย Chrome 85 ขึ้นไป และเปิดธงสถานะทดลอง

  1. ป้อน URL ที่ต้องการดูตัวอย่าง
  2. จากนั้นระบบจะฝังหน้าเว็บเป็นองค์ประกอบ <portal>
  3. คลิกตัวอย่าง
  4. โดยการแสดงตัวอย่างจะเปิดใช้งานหลังจากภาพเคลื่อนไหว

GIF แสดงการสาธิตข้อบกพร่องในการใช้พอร์ทัล

ดูข้อกำหนด

เรากำลังหารือเกี่ยวกับ ข้อกำหนดของพอร์ทัลใน Web Incubation Community Group (WICG) หากต้องการเร่งความเร็ว ให้ลองดูตัวอย่าง สถานการณ์ที่สำคัญ ฟีเจอร์สำคัญ 3 อย่างที่ต้องทำความคุ้นเคยกับมีดังนี้

  • องค์ประกอบ <portal>: องค์ประกอบ HTML เอง API ใช้ง่ายมาก ซึ่งประกอบด้วยแอตทริบิวต์ src ฟังก์ชัน activate และอินเทอร์เฟซสำหรับการรับส่งข้อความ (postMessage) activate จะรับอาร์กิวเมนต์ที่เลือกระบุได้เพื่อส่งต่อข้อมูลไปยัง <portal> เมื่อเปิดใช้งาน
  • อินเทอร์เฟซ portalHost: เพิ่มออบเจ็กต์ portalHost ลงในออบเจ็กต์ window วิธีนี้จะช่วยให้คุณตรวจสอบว่าหน้าเว็บฝังเป็นองค์ประกอบ <portal> หรือไม่ นอกจากนี้ยังมีอินเทอร์เฟซสำหรับการรับส่งข้อความ (postMessage) กลับไปยังโฮสต์ด้วย
  • อินเทอร์เฟซ PortalActivateEvent: เหตุการณ์ที่เริ่มทำงานเมื่อ <portal> เปิดใช้งาน มีฟังก์ชันเจ๋งๆ ที่ชื่อ adoptPredecessor ซึ่งคุณใช้เพื่อดึงหน้าก่อนหน้าเป็นเอลิเมนต์ <portal> ได้ วิธีนี้ช่วยให้คุณสร้างการนำทางที่ราบรื่นและประสบการณ์ที่เขียนขึ้นระหว่างหน้า 2 หน้าได้

เราลองมาดูให้ไกลกว่ารูปแบบการใช้งานพื้นฐานกัน นี่คือรายการโดยสังเขปของสิ่งที่คุณสามารถทำได้ด้วยพอร์ทัลพร้อมด้วยโค้ดตัวอย่าง

ปรับแต่งรูปแบบเมื่อฝังเป็นองค์ประกอบ <portal>

// Detect whether this page is hosted in a portal
if (window.portalHost) {
  // Customize the UI when being embedded as a portal
}

การรับส่งข้อความระหว่างองค์ประกอบ <portal> และ portalHost

// Send message to the portal element
const portal = document.querySelector('portal');
portal.postMessage({someKey: someValue}, ORIGIN);

// Receive message via window.portalHost
window.portalHost.addEventListener('message', (evt) => {
  const data = evt.data.someKey;
  // handle the event
});

กำลังเปิดใช้งานองค์ประกอบ <portal> และรับเหตุการณ์ portalactivate

// You can optionally add data to the argument of the activate function
portal.activate({data: {somekey: 'somevalue'}});

// The portal content will receive the portalactivate event
// when the activate happens
window.addEventListener('portalactivate', (evt) => {
  // Data available as evt.data
  const data = evt.data;
});

เรียกข้อมูลรายการก่อนหน้า

// Listen to the portalactivate event
window.addEventListener('portalactivate', (evt) => {
  // ... and creatively use the predecessor
  const portal = evt.adoptPredecessor();
  document.querySelector('someElm').appendChild(portal);
});

การทราบว่าหน้าเว็บถูกนำมาใช้เป็นรุ่นก่อนหน้า

// The activate function returns a Promise.
// When the promise resolves, it means that the portal has been activated.
// If this document was adopted by it, then window.portalHost will exist.
portal.activate().then(() => {
  // Check if this document was adopted into a portal element.
  if (window.portalHost) {
    // You can start communicating with the portal element
    // i.e. listen to messages
    window.portalHost.addEventListener('message', (evt) => {
      // handle the event
    });
  }
});

เมื่อรวมฟีเจอร์ทั้งหมดที่พอร์ทัลรองรับ คุณสามารถสร้าง ประสบการณ์ของผู้ใช้ที่ดีเยี่ยม ตัวอย่างเช่น การสาธิตด้านล่างแสดงให้เห็นว่าพอร์ทัลสามารถมอบประสบการณ์ของผู้ใช้ที่ราบรื่นได้อย่างไร ระหว่างเว็บไซต์และเนื้อหาที่ฝัง ของบุคคลที่สาม

Use Case และแผน

เราหวังว่าคุณจะชอบทัวร์ชมพอร์ทัลสั้นๆ นี้! เราแทบอดใจรอไม่ไหวที่จะได้พบสิ่งที่คุณอยากได้ ตัวอย่างเช่น คุณอาจต้องการเริ่มใช้พอร์ทัลสำหรับการนำทางที่ไม่สำคัญ เช่น การแสดงผลล่วงหน้าสำหรับหน้าผลิตภัณฑ์ขายดีจากหน้ารายการหมวดหมู่ผลิตภัณฑ์

สิ่งสำคัญอีกอย่างที่ควรทราบคือ พอร์ทัลสามารถใช้ในการนำทางแบบข้ามต้นทางได้ เช่นเดียวกับ <iframe> ดังนั้น หากคุณมีหลายเว็บไซต์ที่อ้างอิงระหว่างกัน คุณสามารถใช้พอร์ทัลในการสร้างการนำทางระหว่าง 2 เว็บไซต์ที่ต่างกันได้อย่างราบรื่น กรณีการใช้งานแบบข้ามต้นทางนี้มีความเฉพาะตัวสูงในพอร์ทัล และยังช่วยปรับปรุงประสบการณ์ของผู้ใช้ใน SPA ได้อีกด้วย

ยินดีรับฟังความคิดเห็นจากคุณ

พอร์ทัลพร้อมสำหรับการทดลองใน Chrome 85 ขึ้นไป ความคิดเห็นจากชุมชนมีความสำคัญต่อการออกแบบ API ใหม่ ดังนั้นโปรดลองใช้งานและบอกให้เราทราบว่าคุณคิดอย่างไร หากมีคำขอฟีเจอร์หรือความคิดเห็น โปรดไปที่ที่เก็บ WICG GitHub