其他
引入适用于双屏和可折叠设备的Web API
来源:https://blogs.windows.com/msedgedev/
作者:Microsoft Edge Team
浏览器是所有设备上使用最广泛的应用之一,如今,它运行在全新的硬件类别上:双屏和可折叠设备。
随着各种新的双屏和可折叠设备进入市场,包括微软 Surface Duo[1],现在再没有比现在更好的时间来考虑你的网站如何采用这些外形。
今天,我们很高兴地宣布推出两项新的实验性功能,这两项功能将帮助Web开发人员有效地在跨越多个显示区域的浏览器窗口中布局内容,并创建响应式网站,以自然地适应这一类新设备。
CSS screen-spanning media feature[2]和一组环境变量来描述折叠的几何形状。
JavaScript window segments enumeration API[3],在处理Canvas2d和WebGL等非DOM目标时很有用。
可折叠设备类
从传统的连续屏幕过渡到双屏和可折叠屏
screen-spanning
媒体功能和一组预先定义的环境变量,允许Web开发人员将可折叠设备作为另一个响应式Web设计目标。开发人员现在可以创建适用于每种设备类别的布局,而无需严格依赖特定的硬件参数。这种灵活性提高了可扩展性,因为它不需要为每个新设备类型重复工作。screen-spanning
媒体功能将帮助Web开发人员测试根视口是否被跨越到多个相邻的显示区域,并提供关于这些相邻显示区域的配置细节(如堆叠或并排)。screen-spanning
媒体功能被指定为一个值,该值描述设备具有的折叠(或铰链)数量及其姿势。如果该设备不是可折叠设备,则该值为none。如果它是可折叠的,则可以具有以下两个值之一:
Single-fold-vertical
:匹配具有单个折叠(两个显示区域)且折叠姿势为垂直的设备。Single-fold-horizontal
:匹配具有单个折叠(两个显示区域)且折叠姿势为水平的设备。
计算显示区域的几何形状
screen-spanning
状态时,折叠总是要把视口正好分成两半,这是不安全的。此外,某些窗口管理器可能会选择隐藏首屏后的Web内容。为了帮助Web开发人员计算每个显示区域的大小,并确保他们知道他们的内容(如果有的话)需要填充多少以避免遮罩,我们正在添加四个预定义的CSS环境变量。env(fold-top)
env(fold-left)
env(fold-width)
env(fold-height)
增强我们的电子邮件示例应用程序,以实现双屏和可折叠的体验
screen-spanning
媒体功能和折叠几何环境变量付诸实践,增强我们电子邮件客户端的读者视图。@media screen and (min-width: 799px) {
/* 特定于平板电脑屏幕的规则 */
}
@media screen and (min-width: 799px) and (screen-spanning: single-fold-vertical) {
/* 主要是一个元素,其中包含上图中突出显示的3个flex项目 */
main {
display: flex;
flex-direction: row;
}
.navigation {
/*
** flex方向是行,因此flex-basis的行为类似于此flex项的宽度
**根据设计,可折叠/双屏上的所需宽度为60px
*/
flex-basis: 60px;
flex-grow: 0;
flex-shrink: 0;
}
.inbox {
/*
** 收件箱宽度会占用第一个显示区域的整个宽度,例如
** 收件箱宽度=显示区域1宽度-60像素(导航列宽度)
*/
flex-basis: calc( env(fold-left) - 60px );
/*
** 有些设备具有遮罩,因此我们需要在此列之后添加边距或间隙
** env(fold-width) = surface Duo上的28个CSS像素。
** env(fold-width) = 0不屏蔽内容的设备上的CSS像素。
*/
margin-inline-end: env(fold-width);
flex-grow: 0;
flex-shrink: 0;
}
.email-content {
/*
** 电子邮件内容栏应 "增长 "以填满其余空间。
** 但要演示如何计算第2个显示区域的宽度。
** 我们将手动设置宽度
*/
flex-basis: calc( 100vw - (env(fold-left) + env(fold-width)) );
flex-grow: 0;
flex-shrink: 0;
}
}
在JavaScript中枚举窗口段
Window Segments Enumeration API
获得每个显示区域的几何体。getWindowSegments()
是Window对象上的一个方法,它返回一个由1个或多个DOMRects组成的数组,这些DOMRects代表每个显示区域的几何形状和位置。const segments = window.getWindowSegments();
// 案例1:台式机、传统触屏设备、可折叠设备不跨越的问题
console.log(segments.length) // 1
// 案例2:双屏和可折叠
console.log(segments.length) // 2
resize
)事件或方向改变(orientationchange
)事件,以检测浏览器是否被调整大小,或设备是否被旋转,并检索更新的显示区域。let segments = window.getWindowSegments();
// 状态1:浏览器横跨2个显示器,且折叠为垂直。
console.log(segments.length); // 2
// 状态2:用户决定旋转设备,浏览器仍然是跨越的,但现在折叠是水平的。
// 在窗口调整大小时,调整大小和方向改变事件都会被触发
// 当用户进入或退出跨屏状态时,调整大小事件也会触发。
window.addEventListener('resize', () => {
// 我们最初检索的片段已不复存在
// 当折叠为水平时,用表示片段2的最新信息进行更新
segments = window.getWindowSegments();
});
function isSingleFoldHorizontal() {
const segments = window.getWindowSegments();
// 单折叠式是指设备有1折叠式和2个显示区域
if( segments.length !== 2 ) {
return false;
}
// 横折指第一段顶部小于第二段顶部
if( segments[0].top < segments[1].top ) {
return true;
}
// if we reach this point, the fold is vertical
return false;
}
getWindowSegments()
提供的信息来了解窗口管理器是否掩盖了呈现在折叠后面的内容,以及折叠宽度是否大于零像素。function foldWidth() {
const segments = window.getWindowSegments();
// 如果有1段,折叠蒙版不适用,返回0
// 如果有超过2个段,我们不处理这种设备,但返回0
if( segments.length !== 2 ) {
return 0;
}
// 折叠是垂直的
// 设备看起来像这样 [][]
if( segments[0].top === segments[1].top ) {
return segments[1].left - segments[0].right;
}
// if we reach this point, the fold is horizontal
return segments[1].top - segments[0].bottom;
}
面向未来
getWindowSegments()
方法将返回一个由3个DOMRects组成的数组,使用简单的语言基元,如循环或内置的数组方法,你可以了解更多关于显示区域的配置情况(例如屏幕都是相同的宽度?等)screen-spanning
媒体功能中添加新的值。立即开始增强你的网站的可折叠体验
前方的路
相关阅读
听说你熟练使用Vue.js,这9种Vue技术你掌握了吗?
在Vue Vite应用程序中实现暗/亮模式
2020 开发人员生态系统现状
Vue技巧 | 在Vue3中使元素在滚动视图时淡入
Vue.js中编写更好的v-for循环的6种技巧
我总结了12个Vue.js开发技巧和窍门
Vue.js嵌套组件生命周期执行顺序
Vue.js中侦听器(watch)的高级用法
粉丝福利
福利1:某慕网课程《React Hooks重构去哪网购票》获取地址和密码请在公众号中回复关键字:002 福利2:在看+留言,张张会在留言区随机抽取一位认真留言的小伙伴,给他发一个红包奖励
- END -
走心的分享更容易被抽中~
开奖时间 下期文末
点赞 + 在看 + 留言
下一个幸运儿就是你
👇