ดูวิธีที่ Portals API นำเสนอจะช่วยปรับปรุง UX การนำทางของคุณ
การตรวจสอบว่าหน้าเว็บโหลดได้เร็วคือกุญแจสำคัญในการมอบประสบการณ์ที่ดีให้แก่ผู้ใช้ แต่สิ่งหนึ่งที่เรามักมองข้ามไปก็คือการเปลี่ยนหน้า ซึ่งผู้ใช้จะเห็น จะเลื่อนไปมาระหว่างหน้าต่างๆ
ข้อเสนอ API แพลตฟอร์มเว็บใหม่ที่ชื่อพอร์ทัลมีเป้าหมาย โดยจะช่วยปรับปรุงประสบการณ์ในขณะที่ผู้ใช้ไปยังส่วนต่างๆ ของ ของคุณ
ดูการทำงานของพอร์ทัล
พอร์ทัลใดที่เปิดใช้งาน
แอปพลิเคชันหน้าเว็บเดียว (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
ใหม่
ใช้งานพอร์ทัล
ลองดูตัวอย่างการใช้งานเบื้องต้น
// 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 จะเปิดขึ้น
หากคุณต้องการสร้างสรรค์สิ่งที่เราแสดงไว้ในงาน 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 ขึ้นไป และเปิดธงสถานะทดลอง
- ป้อน URL ที่ต้องการดูตัวอย่าง
- จากนั้นระบบจะฝังหน้าเว็บเป็นองค์ประกอบ
<portal>
- คลิกตัวอย่าง
- โดยการแสดงตัวอย่างจะเปิดใช้งานหลังจากภาพเคลื่อนไหว
ดูข้อกำหนด
เรากำลังหารือเกี่ยวกับ ข้อกำหนดของพอร์ทัลใน 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