当前位置: 首页 > article >正文

通过两个css属性提升长列表渲染效率

  • content-visibility
  • contain-intrinsic-size

content-visibility是CSS新增的属性,主要用来提高页面渲染性能,它可以控制一个元素是否渲染其内容,并且允许浏览器跳过这些元素的布局与渲染。

  • visible:默认值,没有效果。元素的内容被正常布局和呈现。
  • hidden:元素跳过它的内容。跳过的内容不能被用户代理功能访问,例如在页面中查找、标签顺序导航等,也不能被选择或聚焦。这类似于给内容设置display: none。
  • auto:该元素打开布局包含、样式包含和绘制包含。如果该元素与用户不相关,它也会跳过其内容。与 hidden 不同,跳过的内容必须仍可正常用于用户代理功能,例如在页面中查找、tab 顺序导航等,并且必须正常可聚焦和可选择。
  • content-visibility: hidden手动管理可见性

上面说到content-visibility: hidden的效果与display: none类似,但其实两者还是有比较大的区别的:

  • content-visibility: hidden 只是隐藏了子元素,自身不会被隐藏
  • content-visibility: hidden 隐藏内容的渲染状态会被缓存,所以当它被移除或者设为可见时,浏览器不会重新渲染,而是会应用缓存,所以对于需要频繁切换显示隐藏的元素,这个属性能够极大地提高渲染性能。
  • content-visibility: auto 跳过渲染工作

我们仔细想想,页面上虽然会有很多元素,但是它们会同时呈现在用户眼前吗?很显然是不会的。

用户每次能够真实看到就只有设备可见区那些内容,对于非可见区的内容只要页面不发生滚动,用户就永远看不到。虽然用户看不到,但浏览器却会实实在在的去渲染,以至于浪费大量的性能。所以我们得想办法让浏览器不渲染非可视区的内容就能够达到提高页面渲染性能的效果。

此时就可以直接使用 content-visibility: auto 它可以用来跳过屏幕外的内容渲染,对于这种有大量离屏内容的长列表,可以大大减少页面渲染时间。

.card_item {  
  content-visibility: auto;  
}


但是如果浏览器不渲染页面内的一些元素,滚动将是一场噩梦,因为无法正确计算页面高度。这是因为,content-visibility会将分配给它的元素的高度(height)视为0,浏览器在渲染之前会将这个元素的高度变为0,从而使我们的页面高度和滚动变得混乱。

contain-intrinsic-size 救场

页面在滚动过程中滚动条一直抖动,这是一个不能接受的体验问题,为了更好地实现content-visibility,浏览器需要应用 size containment 以确保内容的渲染结果不会以任何方式影响元素的大小。这意味着该元素将像空的一样布局。如果元素没有在常规块布局中指定的高度,那么它将是 0 高度。

这个时候我们可以使用contain-intrinsic-size来指定的元素自然大小,确保我们未渲染子元素的 div 仍然占据空间,同时也保留延迟渲染的好处。

我们只需要给添加了content-visibility: auto的元素添加上contain-intrinsic-size就能够解决滚动条抖动的问题,当然,这个高度约接近真实渲染的高度,效果会越好,如果实在无法知道准确的高度,我们也可以给一个大概的值,也会使滚动条的问题相对减少。

.card_item {  
  content-visibility: auto;  
  contain-intrinsic-size: 200px;  
}

http://www.kler.cn/a/154727.html

相关文章:

  • C++:基于红黑树封装map和set
  • 游戏引擎学习第九天
  • 供应链管理、一件代发系统功能及源码分享 PHP+Mysql
  • androidstudio入门到放弃配置
  • 民事诉讼中,火灾事故认定书并非不可推翻,其证明力弱于鉴定意见
  • 数据库的性能优化 -- SQL性能优化
  • Hdoop学习笔记(HDP)-Part.10 创建集群
  • Linux驱动开发学习笔记1《字符设备驱动开发》
  • VT-VRPA2-1-1X/V0/T5控制4WRE6比例方向阀放大板
  • Wordpress自动定时发布怎么开通-Wordpress怎么自动发布原创文章
  • 4-Docker命令之docker pause
  • react-native实践日记--6.ReactNative 项目版本升级,0.61到0.72升级的问题记录(二)
  • 锂电涂布机设备健康管理:降低运维成本的关键
  • pygame实现贪吃蛇小游戏
  • mybatis项目中添加logback日志
  • Android 13.0 默认授予app获取序列号SerialNo权限
  • SQL Server 2016(分离和附加数据库)
  • 【计算机网络笔记】802.11无线局域网
  • 深度学习【二】
  • [二分查找]LeetCode2009 :使数组连续的最少操作数
  • 数据管理系统-week10-自由访问控制
  • JavaSE自定义验证码图片生成器
  • Frida hook框架环境搭建
  • 【题目】链表相关算法题
  • Beta冲刺总结随笔
  • 论文编写软件latex安装教程