ב-Chrome מתבצעת בדיקה של שני ממשקי API, Device Posture API ו-Viewport Segments Enumeration API, שזמינים כגרסת מקור לניסיון מ-Chrome 125. הקבוצה הזו נקראת 'ממשקי API למכשירים מתקפלים', והיא נועדה לעזור למפתחים לטרגט מכשירי מתקפלים. בפוסט הזה נסביר על ממשקי ה-API האלה ונציג מידע על התחלת הבדיקה שלהם.
יש בעיקר שני גורמים פיזיים שונים של צורת המכשיר: מכשירים עם מסך גמיש יחיד (ללא תפרים) ומכשירים עם שני מסכים (עם תפרים, שנקראים גם מכשירים עם מסך כפול).
המכשירים האלה מציבים אתגרים ומציעים הזדמנויות למפתחים. הן מספקות דרכים נוספות לצפייה בתוכן. לדוגמה, משתמש יכול להחזיק מכשיר ללא תפרים כמו ספר, ואז להשתמש בו כמו בטאבלט עם מסך שטוח. במכשירים עם שני מסכים יש חיבור פיזי בין המסכים, ויכול להיות שיהיה צורך להביא אותו בחשבון.
ממשקי ה-API החדשים האלה מאפשרים למפתחים לספק חוויית משתמש טובה יותר במכשירים האלה. כל ממשק API חושף את הרכיבים הבסיסיים הנדרשים בפלטפורמת האינטרנט בשתי דרכים, באמצעות CSS ו-JavaScript.
Device Posture API
למכשירים מתקפלים יש יכולות שמאפשרות לשנות את _התנוחה_ שלהם, כלומר את המצב הפיזי של המכשיר. הם יכולים לשנות את גורם הצורה שלהם, וכך לאפשר לכותבי תוכן לספק חוויית משתמש שונה. ממשקי ה-API החדשים האלה מבטיחים שתוכן האינטרנט יוכל להגיב למצבי הקיפול השונים.
יש שתי תנוחות של המכשיר:
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 שמגדירים את המיקום והמידות של אזור נפרד מבחינה לוגית בשדה התצוגה. פלחים של חלון תצוגה נוצרים כשחלון התצוגה מחולק על ידי תכונה חומרה אחת או יותר (כמו ציר או צירוף בין מסכים נפרדים) שמשמשות כמחיצה. קטעים הם האזורים של אזור התצוגה שאפשר להתייחס אליהם כאל אזורים נפרדים מבחינה לוגית על ידי המחבר.
CSS
מספר החלוקות הלוגיות מוצג באמצעות שתי תכונות מדיה חדשות, שמוגדרות במפרט של CSS Media Queries ברמה 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)
לכל משתנה יש שני מאפיינים, שמייצגים את המיקום ב-x וב-y, בהתאמה, בתצוגת הרשת הדו-מימדית שנוצרת על ידי מאפייני החומרה שמפרידים בין הפלחים.
קטע הקוד הבא הוא דוגמה פשוטה ליצירת חוויית משתמש מפוצלת, שבה יש שני קטעי תוכן (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 של מכשירי ה-Foldable זמינים בגרסת המקור לניסיון מ-Chrome 125 עד Chrome 128. למידע נוסף על ניסויים במקור, אפשר לעיין במאמר תחילת העבודה עם ניסויים במקור.
לצורך בדיקה מקומית, אפשר להפעיל את ממשקי ה-API של Foldable באמצעות הדגל Experimental Web Platform features ב-chrome://flags/#enable-experimental-web-platform-features
. אפשר גם להפעיל אותו על ידי הפעלת Chrome משורת הפקודה עם --enable-experimental-web-platform-features
.
הדגמות
הדגמות זמינות במאגר הדגמות. אם אין לכם מכשיר פיזי לבדיקה, תוכלו לבחור את המכשיר המאומלל Galaxy Z Fold 5 או Asus Zenbook Fold בכלי הפיתוח ל-Chrome, ולהחליף בין המצבים רציף ומכווץ. אם רלוונטי, תוכלו גם לראות את ציר המכשיר.
קישורים רלוונטיים
- Device Posture API
- Viewport Segments API