在过去的几年里,出现了一些前端特性,其中性能的重担从浏览器转移到了开发者身上。与其假设“浏览器在运行我的代码时会变得更快”,不如更多地考虑“我需要改变我的编码方式才能让浏览器更快”。
will-change
规范:
允许作者提前告知 UA 他们可能对元素进行哪些更改。这使得 UA 能够提前优化他们处理元素的方式,在动画实际开始之前执行可能代价高昂的工作来准备动画。
换句话说,除了使用动画和转换之外,还要告诉浏览器您将在这些动画和转换中更改什么。
.element {
will-change: transform;
}
.element:hover {
transform: rotateY(180deg);
}
Sara Soueidan 有 一篇更深入的文章,我们也有 一个年鉴参考。
contain
规范:
contain 属性允许作者指示一个元素及其内容尽可能独立于文档树的其余部分。这使得用户代理在使用 contain 正确渲染页面时能够利用更强大的优化,并允许作者确信他们的页面不会因无害的更改而意外地陷入缓慢的代码路径。
换句话说,如果您了解有关元素及其后代的某些信息,则应告诉浏览器,以便它可以围绕这些信息进行优化。例如…… contain: size; – “这确保包含元素可以在无需检查其后代的情况下进行布局。”
示例
<section class='message'>
Lol, check out this dog: images.example.com/jsK3jkl
</section>
<section class='message'>
I had a ham sandwich today. #goodtimes
</section>
<section class='message'>
I have political opinions that you need to hear!
</section>
.message {
contain: strict;
}
Michael Scharnagl 最近 发表了一篇关于此的文章
类似于 iframe,此边界建立了一个新的布局根,确保子树中的 DOM 更改永远不会触发父文档中的重排。
响应式图片
也许这些“你告诉浏览器发生了什么”场景中最明显的是响应式图片,特别是 sizes 属性。
规范:
用户代理将根据指定的 w 描述符和 sizes 属性中指定的渲染大小计算每个图像的有效像素密度。然后,它可以根据用户的屏幕像素密度、缩放级别以及可能的其他因素(例如用户的网络状况)选择任何给定的资源。
这是一个来自规范的示例,您尽可能多地向浏览器提供信息
<img
sizes="(max-width: 30em) 100vw, (max-width: 50em) 50vw, calc(33vw - 100px)"
srcset="swing-200.jpg 200w, swing-400.jpg 400w, swing-800.jpg 800w, swing-1600.jpg 1600w"
src="swing-400.jpg"
alt="Kettlebell Swing"
>
这意味着……
- 如果浏览器窗口的宽度小于
30em,我将以100vw的宽度显示图像。 - 如果浏览器窗口的宽度在
30em和50em之间,我将以50vw的宽度显示图像。 - 否则(如果更大),我将以
calc(33vw - 100px)的宽度显示图像。
然后,这需要与您在 CSS 中实际执行的操作相匹配。希望它相当准确,以便浏览器的优化与现实相符。
一个崭新的世界
我之所以提到这些,并不是因为我认为您需要立即开始使用所有这些。更多的是强调(如果可以这么说)趋势,在前端性能相关的特性中,浏览器要求作者做更多的事情。
我认为浏览器供应商和规范作者会说:“你想要性能。我们只能做这么多。有些事情我们不知道,但你知道。我们会尽最大努力在没有它们的情况下进行优化,但如果你告诉我们,我们就能做得更多。”
你怎么看?
在 will-change 场景中,我想知道为什么浏览器不能自动确定这一点。浏览器不能读取元素的 :hover 规则以查看其上是否有任何转换吗?
如果动态添加这些类之一,浏览器如何知道呢?
&.class1 {
transform: translateX(50%);
}
&.class2 {
box-shadow: 5px 5px 5px red;
}
&.class3 {
background: saddlebrown;
}
浏览器或多或少可以确定这一点。这就是为什么你不应该以这种方式使用它的原因。
will-change 属性应该只在 js 中动态添加,就在触发更改之前 - 否则它对浏览器的用处或多或少。
就在之前?不。在 CSS 中提前 - 是的。
你好,Chris
为什么不包含
*-rendering属性组?Text-renderingImage-rendering也许效果较小
Shape-renderingColor-rendering我认为它们也有帮助。
如果今天网页开发到了这一步,那么肯定哪里出了问题。在绝大多数情况下,浏览器通过解析文档就拥有足够的信息来了解我们的意图。浏览器不应该需要被微管理。
完全正确。
我认为你们是对的也是错的。
是的!它确实可以!例如,在下载并解析 HTML 以找到图像后,然后下载图像,然后找到并下载所有 CSS,然后进行布局(不仅针对图像本身,还针对可能影响其大小的所有周围内容)之后,便有足够的信息来确定要显示图像的大小。所有这些完成后,浏览器就能获得足够的信息来选择最合适的图像尺寸。但是(哦,糟糕),我们已经下载了图像,所以我们错过了优化的机会。
诀窍是在浏览器“解析文档”时提供更多信息,以便它能够更快地做出更明智的选择。
但这确实感觉很奇怪。就像电脑不能仅仅优化我提供给它的内容吗?答案是它可以,但如果我们帮助它,它可以做得更好,尤其是在我们专门致力于榨取更高性能时。
你说得对。但是浏览器无法知道 js 做出的更改。对于纯 css,如果我们不得不使用它,那将是一件令人难过的事情。
来自 frontend gmbh 的 Patrick
新的有
requestIdleCallback和被动事件监听器。好文章(再次)。以前从未听说过……
唉,有一个小错误:“如果您了解有关元素的某些信息”应为“如果您了解有关一个元素的某些信息”。
干杯。
网页设计正在发生很多变化,这些变化确实很好。
我认为我们能够帮助浏览器优化我们的代码是一件好事。当然,他们仍然应该尝试自己进行一些优化,但我仍然比任何浏览器都更了解我的 HTML 树将如何发生变化,因此留下这些提示将是一个相当有用的工具,以便在需要时获得额外的性能提升。
一切都在改变,而且变得更好。不是吗?