冲击分数
冲击分数
衡量的是变动元素在两渲染帧之间对页面视口的影响。前一帧和当前帧的所有不稳定元素的可见区域的并集(作为视口总面积的一部分)是当前帧的影响分数。
在上图中,有一个元素在一帧中占据了视口的一半。然后,在下一帧中,元素下移视口高度的25%。红色的虚线矩形表示两个帧中元素的可见区域的并集,在这种情况下,其为总视口的75%,因此其影响分数为0.75。
距离分数距离分数
是不稳定元素在视口中移动的最大距离(水平或垂直)除以视口的最大尺寸(宽度或高度,取较大的)。
在上面的例子中,最大的视口尺寸是高度,不稳定元素移动了视口高度的25%,这使得距离分数为0.25。
所以,在这个例子中,影响分数是0.75,距离分数是0.25,所以布局移位分数是0.75 * 0.25 = 0.1875。
向现有元素添加内容如何影响布局移位分数
图中"Click Me!"按钮被添加到带有黑色文本的灰色框的底部,它将带有白色文本的绿色框向下推(并部分推出视口)。
在这个例子中,灰色框改变了大小,但是它的起始位置没有改变,所以它不是一个不稳定的元素。按钮以前并不在DOM中,因此它的起始位置也不会改变。
然而,绿色方块的起始位置确实会发生变化,但由于它已经部分移出了视口,所以在计算冲击分数时,不可见区域并不会被考虑在内。两个帧中绿色框的可视区域(用红色虚线矩形表示)的联合与第一个帧中50%视口的绿色框的区域相同。冲击分数为0.5。
距离分数用紫色箭头表示。绿框已经向下移动了大约14%的视口,所以距离分数是0.14。
布局位移得分为0.5 x 0.14 = 0.07。
多个不稳定元素
在上面的第一帧中,有一个动物的API请求的四个结果,按字母顺序排序。在第二帧中,更多的结果被添加到排序列表中。
列表中的第一项(“Cat”)不会在帧之间改变它的起始位置,所以它是稳定的。类似地,添加到列表中的新项以前并不在DOM中,因此它们的起始位置也不会改变。但标有"狗"、"马"和"斑马"的物品都改变了它们的起始位置,使它们成为不稳定的元素。
红色的虚线矩形再次代表这三个不稳定元素的前后区域的结合,在这个例子中大约是视口区域的38%(撞击率为0.38)。
箭头表示不稳定元素从起始位置移动的距离。用蓝色箭头表示的"斑马"元素移动得最多,移动了视口高度的30%左右。这个例子中的距离分数是0.3。
布局位移分数是0.38 x 0.3 = 0.1172。
预期 VS 意外的布局变化
并不是所有的布局变化都是不好的。事实上,许多动态web应用程序经常改变页面上元素的起始位置。
只有在用户非预期的情况下,布局的改变才是糟糕的。另外,在响应用户交互时(点击一个链接,按下一个按钮,输入一个搜索框等等)出现的布局变化通常是好的,只要这种变化发生在距离交互足够近的地方,用户能够清楚地看到这种关系。
动画和过渡是更新页面内容的好方法,不会让用户感到意外。页面上突然移动内容几乎总是会造成糟糕的用户体验。但是,从一个位置逐渐自然地移动到另一个位置的内容通常可以帮助用户更好地理解发生了什么。
CSS transform
属性允许你在不触发布局移位的情况下动画元素,比如使用transform: scale()
代替改变高度和宽度属性。要移动元素,请避免更改顶部、右侧、底部或左侧属性,可以使用transform: translate()
代替。
如何衡量CLS
1、可以使用lighthouse和performce检测CLS。
2、手动测量 可以使用布局不稳定性API。创建一个PerformanceObserver,该observer侦听意外的布局移动元素,将它们累加,并将它们记录到控制台。
let cls = 0;
new PerformanceObserver((entryList) => {
for (const entry of entryList.getEntries()) {
if (!entry.hadRecentInput) {
cls += entry.value;
console.log(‘Current CLS value:’, cls, entry);
}
}
}).observe({type: ‘layout-shift’, buffered: true});
如何改善CLS
首先,最常见的影响CLS的分数的有:
-
未指定尺寸的图片
-
未指定尺寸的广告、嵌入元素、iframe
-
动态插入内容
-
自定义字体(引发FOIT/FOUT)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
文末
js前端的重头戏,值得花大部分时间学习。
推荐通过书籍学习,《 JavaScript 高级程序设计(第 4 版)》你值得拥有。整本书内容质量都很高,尤其是前十章语言基础部分,建议多读几遍。
CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
另外,大推一个网上教程 现代 JavaScript 教程 ,文章深入浅出,很容易理解,上面的内容几乎都是重点,而且充分发挥了网上教程的时效性和资料链接。
学习资料在精不在多,二者结合,定能构建你的 JavaScript 知识体系。
面试本质也是考试,面试题就起到很好的考纲作用。想要取得优秀的面试成绩,刷面试题是必须的,除非你样样精通。
这是288页的前端面试题
真实项目实战+最新讲解视频】]( )**
另外,大推一个网上教程 现代 JavaScript 教程 ,文章深入浅出,很容易理解,上面的内容几乎都是重点,而且充分发挥了网上教程的时效性和资料链接。
学习资料在精不在多,二者结合,定能构建你的 JavaScript 知识体系。
面试本质也是考试,面试题就起到很好的考纲作用。想要取得优秀的面试成绩,刷面试题是必须的,除非你样样精通。
这是288页的前端面试题