Chrome 115 有哪些值得关注的新特性?

大家好,我是 ConardLi。今天带大家一起来了解一下 Chrome 115 值得关注的新特性。

eb624803879190bb569571e0c5d4d37b.png

滚动动画

用滚动驱动的动画是网站上非常常见的用户体验模式,比如当页面向前或向后滚动时,对应的动画也会向前或向后移动。

比如下面图中这种比较常见的,页面顶部的进度条随着滚动而变化:

3c8ae8d1a3e1e1ef83d456bce969a12a.png

另外还可以依靠页面滚动来驱动页面上的元素淡入淡出:

e5ef1fdb5a8b27f1e4090be4c84dc142.png

一项新的 Scroll-driven Animations 规范定义了两种可供我们使用的新时间线类型:

  • Scroll Progress Timeline: 链接到滚动容器沿特定轴的滚动位置的时间线。

  • View Progress Timeline: 链接到特定元素在其滚动容器内的相对位置的时间线。

下面是一个代码示例,它使用匿名的滚动进度时间轴创建固定在页面顶部的阅读进度指示器。

<body>
  <div id="progress"></div>
  你好,code 秘密花园
</body>
@keyframes grow-progress {
  from { transform: scaleX(0); }
  to { transform: scaleX(1); }
}

#progress {
  position: fixed;
  left: 0; top: 0;
  width: 100%; height: 1em;
  background: red;

  transform-origin: 0 50%;
  animation: grow-progress auto linear;
  animation-timeline: scroll();
}

另外我们也可以使用 JavaScript 来创建一个滚动进度时间线,我们可以创建一个新的 ScrollTimeline 实例,它接受以下两个参数:

  • source:对要跟踪其滚动条的元素的引用,用于 document.documentElement 定位根滚动条。

  • axis:确定要跟踪的轴,与 CSS 变体类似,可接受的值为 block、inline、x、y

const tl = new ScrollTimeline({
  source: document.documentElement,
});

要将其附加到 Web 动画,可以将它作为时间轴属性传递,并省略任何 duration 属性。

$el.animate({
  opacity: [0, 1],
}, {
  timeline: tl,
});

下面是使用 JavaScript 来创建阅读进度指示器对应的代码:

const $progressbar = document.querySelector('#progress');

$progressbar.style.transformOrigin = '0% 50%';
$progressbar.animate(
  {
    transform: ['scaleX(0)', 'scaleX(1)'],
  },
  {
    fill: 'forwards',
    timeline: new ScrollTimeline({
      source: document.documentElement,
    }),
  }
);

CSS display 多值语法

CSS Display Module Level 3 描述了 display 属性的多关键字语法,也可以称为 “双值语法” 或 “多值语法”。

491d279e2440e9aa94af29c161c15dd4.png

我们最开始学习的 CSS 之一就是一些元素是块级元素,一些元素是内联元素。例如 <h1><p> 默认是块级元素,<span> 是内联元素。使用 display 属性,我们可以在块和内联之间切换。例如,要使标题内联,我们可以使用以下 CSS:

h1{
  display:inline;
}

最近,CSS 又相继支持了 GridFlexbox 布局。要使用这些布局,我们也要使用 display 属性的值 —— display:griddisplay:flex。只有当 display 的值改变时,子元素才会成为 GridFlex 元素,并开始响应 GridFlexbox 规范中的其他属性。改变元素的 display 值会改变其直接子级的格式化上下文。

但是,GridFlexbox 元素有内部和外部的 display 类型。外部的 display 类型描述元素是块级还是内联,内部的显示类型描述容器中的子元素应该如何表现。

因此,display 多关键字语法允许分别指定内外两个 display 类型。简单来说,它允许我们这样写:

display: block flex;

创建一个块级容器,具有 Flex 子元素。

display: inline flex;

创建一个内联容器,具有 Flex 子元素。

而这个新语法也会向后兼容以前的单关键字语法。

Fenced Frames

去年的文章中我曾经介绍过 Fenced Frames ,如今在这个版本得到了支持。

在很多业务场景中,我们可能会使用 iframe 去嵌入一些智能推荐的广告。

我们的顶级站点可以读取到  iframesrc 属性,这就意味着顶级站点可以从广告的 URL 推断有关访问者兴趣的信息,这在一定程度上就泄露了用户隐私。

Fenced frames 是一项隐私沙盒提案(https://github.com/WICG/fenced-frame),它建议顶级站点应该对数据进行分区。

b60f7e92e1505a4c13d2739eb7d690e2.png

使用 Fenced frames ,我们依然可以显示与访问者兴趣相匹配的广告,但顶级站点是无法从 framesrc 属性中推断出用户的兴趣信息的,这个信息只有广告商知道。

85b85199a4a15eee486f96c22216becd.png

常规的用法和 iframe 一样,我们可以用 src 属性来引入一个嵌入的内容:

<fencedframe src="conardli.html"></fencedframe>

另外 Fenced frames 可能会和其他的 隐私沙盒 的 API 来配合使用,浏览器可能会为 Fenced frames 生成一个不透明的 URL

例如,配合 FLEDGE,浏览器可以生成一个 urn:uuid,来映射智能广告推荐的 URL

<fencedframe src="urn:uuid:c36973b5-e5d9-de59-e4c4-364f137b3c7a" mode="opaque-ads" ></fencedframe>

只有在 Fenced frames 内部嵌入的广告商的站点才能获取到  urn:uuid  和 URL 的真实映射关系,外部的顶级站点是获取不到的。

WebAssembly 编译限制

b01a860aba639a5b61678d3091b32e04.png

Chrome 将主线程上同步 WebAssembly 编译的大小限制从 4KB 扩展到了 8MB。这无疑是一个巨大的提升,得益于 WebAssembly 运行时 V8 的性能改进。

8MB 限制是通过对 Google Pixel 1 手机的性测试确定的,该手机目前被认为是具有代表性的低端手机。V8 或硬件的未来发展可能会进一步的扩展这个限制。大于 8MBWebAssembly 模块可以使用 WebAssembly.compile() 异步编译,也可以在 Worker 上同步编译。

而大部分的 WebAssembly 模块都可以在主线程的同步方式直接编译,而不需要异步或借助 Worker 线程。

最后

大家怎么看?欢迎在评论区留言!

参考:

  • https://chromestatus.com/features#milestone%3D115

  • https://developer.chrome.com/docs/privacy-sandbox/topics/overview/

  • https://developer.chrome.com/origintrials/#/view_trial/1196831600973709313

  • https://developer.chrome.com/docs/privacy-sandbox/fenced-frame/

  • https://drafts.csswg.org/scroll-animations-1/

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。

4a86ae83b974986f9cbea127ac4d44a8.png

猜你喜欢

转载自blog.csdn.net/qiwoo_weekly/article/details/131777827
115