Chrome กําลังทดลองใช้ 2 API ได้แก่ Device Posture API และ Viewport Segments enumeration API ซึ่งพร้อมใช้งานเป็นช่วงทดลองใช้จากต้นทางใน Chrome 125 ซึ่งเรียกรวมกันว่า Foldable API ที่ออกแบบมาเพื่อช่วยนักพัฒนาแอปกำหนดเป้าหมายไปยังอุปกรณ์แบบพับได้ โพสต์นี้จะแนะนำ API เหล่านี้และบอกวิธีเริ่มทดสอบ
อุปกรณ์มีรูปแบบหลักๆ 2 แบบ ได้แก่ อุปกรณ์ที่มีหน้าจอแบบยืดหยุ่นหน้าจอเดียว (ไร้รอยต่อ) และอุปกรณ์ที่มี 2 หน้าจอ (มีรอยต่อ หรือที่เรียกว่าอุปกรณ์แบบ 2 หน้าจอ)
อุปกรณ์เหล่านี้นำเสนอความท้าทายและโอกาสสำหรับนักพัฒนาซอฟต์แวร์ วิดีโอเหล่านี้เป็นช่องทางเพิ่มเติมในการรับชมเนื้อหา เช่น ผู้ใช้อาจถืออุปกรณ์แบบไร้รอยต่อเหมือนหนังสือ แล้วเปลี่ยนเป็นการใช้อุปกรณ์แบบแท็บเล็ตที่มีหน้าจอแบน อุปกรณ์ที่มี 2 หน้าจอมีการต่อเชื่อมระหว่างหน้าจอจริงที่อาจต้องพิจารณา
API ใหม่เหล่านี้ช่วยให้นักพัฒนาแอปมอบประสบการณ์การใช้งานที่ดีขึ้นให้แก่ผู้ใช้อุปกรณ์เหล่านี้ API แต่ละรายการจะแสดงรายการพื้นฐานของแพลตฟอร์มเว็บที่จำเป็น 2 วิธี ได้แก่ ผ่าน CSS และ JavaScript
Device Posture API
อุปกรณ์แบบพับได้มีความสามารถที่ช่วยให้เปลี่ยน_ลักษณะ_หรือสถานะของอุปกรณ์ได้ บริษัทสามารถเปลี่ยนรูปแบบของอุปกรณ์เพื่อให้ผู้เขียนเนื้อหามอบประสบการณ์ของผู้ใช้ที่แตกต่างออกไปได้ และ API ใหม่เหล่านี้จะช่วยให้มั่นใจได้ว่าเนื้อหาเว็บจะตอบสนองต่อสถานะการพับแบบต่างๆ ได้
อุปกรณ์มีท่าทาง 2 แบบ ได้แก่
folded
: ท่าทางของแล็ปท็อปหรือหนังสือ
continuous
: จอแบน จอแท็บเล็ต หรือแม้แต่จอโค้งแบบไร้รอยต่อ
CSS
ข้อกําหนดของ Device Posture API กําหนด CSS แบบใหม่ นั่นคือ device-posture ฟีเจอร์สื่อนี้แก้ไขเป็นท่าตายตัว ท่าทางเหล่านี้ประกอบด้วยค่าที่กำหนดไว้ล่วงหน้าจำนวนหนึ่ง ซึ่งแต่ละค่าจะครอบคลุมสถานะทางกายภาพของอุปกรณ์
ค่าของฟีเจอร์ device-posture
ตรงกับคำอธิบายท่าทางที่เป็นไปได้ก่อนหน้านี้ ดังนี้
folded
continuous
อาจมีการเพิ่มท่าทางใหม่ในอนาคตหากมีอุปกรณ์ใหม่ออกสู่ตลาด
ตัวอย่าง
/* Using the device in a 'book' posture. */
@media (device-posture: folded) { ... }
/* Using the device in a 'flat' posture, or any typical device like a laptop or
desktop device. */
@media (device-posture: continuous) { ... }
JavaScript
หากต้องการค้นหาลักษณะของอุปกรณ์ โปรดใช้ออบเจ็กต์ DevicePosture
ใหม่
const { type } = navigator.devicePosture;
console.log(`The current device is of type ${type}.`);
หากต้องการตอบสนองต่อการเปลี่ยนแปลงลักษณะการวางอุปกรณ์ เช่น ผู้ใช้เปิดอุปกรณ์จนสุดแล้วจึงย้ายจาก folded
ไป continuous
ให้สมัครรับเหตุการณ์ change
navigator.devicePosture.addEventListener('change', (e) => {
console.log(`The device posture changed to type ${e.type}`);
});
Viewport Segments API
ส่วนวิวพอร์ตคือตัวแปรสภาพแวดล้อม CSS ที่กำหนดตำแหน่งและขนาดของภูมิภาคที่แยกกันตามตรรกะของวิวพอร์ต ระบบจะสร้างกลุ่มวิวพอร์ตเมื่อวิวพอร์ตถูกแยกด้วยฟีเจอร์ฮาร์ดแวร์อย่างน้อย 1 รายการ (เช่น การพับหรือบานพับระหว่างจอแสดงผลแยกต่างหาก) ที่ทำหน้าที่เป็นตัวแบ่ง ส่วนคือภูมิภาคของวิวพอร์ตที่ผู้เขียนสามารถถือว่ามีความแตกต่างตามตรรกะ
CSS
จำนวนการแบ่งส่วนเชิงตรรกะจะแสดงผ่านฟีเจอร์สื่อใหม่ 2 รายการ ซึ่งกำหนดไว้ในข้อกำหนด CSS Media Query ระดับ 5 นั่นคือ vertical-viewport-segments
และ horizontal-viewport-segments
เพื่อแก้ไขจำนวนกลุ่มที่วิวพอร์ตแบ่งออกเป็นกลุ่ม
นอกจากนี้ ระบบยังเพิ่มตัวแปรสภาพแวดล้อมใหม่เพื่อค้นหามิติข้อมูลของส่วนแบ่งการตลาดเชิงตรรกะแต่ละส่วน ตัวแปรเหล่านี้ ได้แก่
env(viewport-segment-width x y)
env(viewport-segment-height x y)
env(viewport-segment-top x y)
env(viewport-segment-left x y)
env(viewport-segment-bottom x y)
env(viewport-segment-right x y)
ตัวแปรแต่ละตัวมีมิติข้อมูล 2 รายการ ซึ่งแสดงตำแหน่ง x และ y ตามลำดับในตารางกริด 2 มิติที่สร้างขึ้นโดยฟีเจอร์ฮาร์ดแวร์ซึ่งแยกกลุ่ม
ข้อมูลโค้ดต่อไปนี้เป็นตัวอย่างที่เข้าใจง่ายของการสร้าง UX แบบแยกส่วนซึ่งมีส่วนเนื้อหา 2 ส่วน (col1 และ col2) ในแต่ละฝั่งของรอยพับ
<style>
/* Segments are laid out horizontally. */
@media (horizontal-viewport-segments: 2) {
#segment-css-container {
flex-direction: row;
}
#col1 {
display: flex;
flex: 0 0 env(viewport-segment-right 0 0);
background-color: steelblue;
}
#fold {
width: calc(env(viewport-segment-left 1 0) - env(viewport-segment-right 0 0));
background-color: black;
height: 100%;
}
#col2 {
display: flex;
background-color: green;
}
}
/* Segments are laid out vertically. */
@media (vertical-viewport-segments: 2) {
#segment-css-container {
flex-direction: column;
}
#col1 {
display: flex;
flex: 0 0 env(viewport-segment-bottom 0 0);
background-color: pink;
}
#fold {
width: 100%;
height: calc(env(viewport-segment-top 0 1) - env(viewport-segment-bottom 0 0));
background-color: black;
}
#col2 {
display: flex;
background-color: seagreen;
}
}
</style>
<div id="segment-css-container">
<div id="col1"></div>
<div id="fold"></div>
<div id="col2"></div>
</div>
รูปภาพต่อไปนี้จะแสดงลักษณะของประสบการณ์การใช้งานบนอุปกรณ์จริง
JavaScript
หากต้องการดูจํานวนกลุ่มวิวพอร์ต ให้ดูรายการ segments
ใน
visualViewport
const segments = window.visualViewport.segments;
console.log('The viewport has the following segments:', segments);
แต่ละรายการในอาร์เรย์ segments
จะแสดงแต่ละส่วนของวิวพอร์ตตามตรรกะ โดยมี DOMArray
ที่อธิบายพิกัดและขนาด ฟิลด์ segments
เป็นภาพรวมของสถานะที่ระบุเมื่อมีการค้นหา หากต้องการรับค่าที่อัปเดต คุณต้องคอยฟังการเปลี่ยนแปลงของท่าทางหรือปรับขนาดเหตุการณ์และค้นหาพร็อพเพอร์ตี้ segments
อีกครั้ง
ลองใช้ API แบบพับได้
Foldable API พร้อมใช้งานในช่วงทดลองใช้จากต้นทางตั้งแต่ Chrome 125 ถึง Chrome 128 ดูข้อมูลเบื้องต้นเกี่ยวกับการทดลองใช้ต้นทางได้ที่หัวข้อเริ่มต้นใช้งานการทดลองใช้ต้นทาง
สําหรับการทดสอบในเครื่อง คุณสามารถเปิดใช้ Foldable API ได้ด้วยการตั้งค่า Flag ฟีเจอร์เว็บแพลตฟอร์มเวอร์ชันทดลองที่ chrome://flags/#enable-experimental-web-platform-features
นอกจากนี้ คุณยังเปิดใช้ได้โดยเรียกใช้ Chrome จากบรรทัดคำสั่งด้วย --enable-experimental-web-platform-features
เดโม
ดูเดโมได้ที่ที่เก็บ demos หากไม่มีอุปกรณ์จริงที่จะทดสอบ คุณสามารถเลือกอุปกรณ์จำลอง Galaxy Z Fold 5 หรือ Asus Zenbook Fold ในเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome แล้วสลับระหว่างแบบต่อเนื่องกับแบบพับ นอกจากนี้ คุณยังดูภาพจำลองของบานพับได้ด้วยหากมี