Query sui segmenti di viewport CSS per il rilevamento a doppio schermo
La funzionalità CSSmedia estesa può essere usata per verificare se il dispositivo di output è un doppio schermo (o piegabile) e il riquadro di visualizzazione del browser è esteso tra le due aree di visualizzazione. Le variabili di ambiente sono disponibili anche per calcolare le aree visibili sugli schermi e l'area della cerniera (se presente) tra di esse.
Questa API è disponibile in Microsoft Edge versione 97 e successive.
Segmenti del riquadro di visualizzazione
Sintassi CSS per dichiarare gli stili per quando il browser è esteso su una cerniera orizzontale o verticale:
@media (horizontal-viewport-segments: <count>) { }
@media (vertical-viewport-segments: <count>) { }
Per Surface Duo, i valori che corrisponderanno alla visualizzazione a doppio schermo sono:
horizontal-viewport-segments: 2
- Descrive lo stato di quando il riquadro di visualizzazione del browser si estende su una singola piega (due aree di visualizzazione) e la posizione di piegatura è verticale. Questo valore corrisponde a Surface Duo in modalità verticale doppia (wide).
vertical-viewport-segments: 2
- Descrive lo stato di quando il riquadro di visualizzazione del browser si estende su una singola piega (due aree di visualizzazione) e il comportamento di piegatura è orizzontale. Questo valore corrisponde a Surface Duo in modalità orizzontale doppio (alto).
Questo frammento di codice CSS di esempio mostra come usare le -viewport-segments
funzionalità multimediali per applicare stili a un dispositivo Surface Duo:
@media (horizontal-viewport-segments: 2) {
/* styles applied in double-portrait (wide) mode */
/* matches Figure 1. below */
}
@media (vertical-viewport-segments: 2) {
/* styles applied in double-landscape (tall) mode */
/* matches Figure 2. below */
}
Variabili di ambiente CSS
Gli sviluppatori Web possono utilizzare variabili di ambiente definite dal browser per ottenere la geometria dell'area di visualizzazione (o delle aree) e calcolare la geometria dell'area della cerniera nascosta (se presente). Le proprietà di ogni viewport possono essere sottoposte a query con le definizioni di variabili di ambiente seguenti (usando le coordinate del segmento in alto a sinistra):
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>);
Le coordinate vengono assegnate dal segmento superiore sinistro:
Questi valori possono essere usati per dedurre le coordinate delle aree della cerniera:
/* double-portrait */
env(viewport-segment-right 0 0); /* hinge left */
env(viewport-segment-left 1 0); /* hinge right*/
calc(env(viewport-segment-left 1 0) - env(viewport-segment-right 0 0))
/* hinge width */
/* double-landscape */
env(viewport-segment-bottom 0 0); /* hinge top */
env(viewport-segment-top 0 1); /* hinge bottom */
calc(env(viewport-segment-top 0 1) - env(viewport-segment-bottom 0 0))
/* hinge height */
Esempio
Basic
Creare una pagina reattiva in cui il <body>
colore di sfondo è impostato su yellow
nei telefoni e green
nei dispositivi a doppio schermo in qualsiasi posizione.
/* maximum width of our customers phones is 420px */
/* spanning: none is optional in this case */
@media (max-width: 420px) {
body {
background-color: yellow;
}
}
/* Separating media features with comma `,` is equivalent to the logical operation OR */
@media (horizontal-viewport-segments: 2), (vertical-viewport-segments: 2) {
body {
background-color: green;
}
}
Flexbox
Usare flexbox per creare un layout di due colonne compatibile con gap in cui la prima colonna contiene una descrizione scorrevole e la seconda colonna contiene l'immagine.
Il codice HTML e CSS per creare questo layout è illustrato di seguito:
<body>
<article class="article">
...
</article>
<figure class="figure">
<img src="/sydney-opera-house.jpg"
alt="Sydney Opera House">
</figure>
</body>
body {
height: 100vh;
display: flex;
}
.article {
/* grow: no, shrink: no, basis: fold-left */
flex: 0 0 env(viewport-segment-right 0 0);
/* equals to margin-right when writing mode is left-to-right (english) */
/* equals to margin-left when writing mode is right-to-left (arabic, hebrew) */
/* this will prevent content from being rendered behind the device mask */
margin-inline-end: calc(env(viewport-segment-left 1 0) - env(viewport-segment-right 0 0)) ; /* hinge width */
overflow-y: scroll;
}
.figure {
/* fill the rest of the space */
flex: 1;
margin: 0;
overflow: hidden;
}
.figure img {
height: 100%;
}