广告
返回顶部
首页 > 资讯 > 精选 >CSS新特性content-visibility怎么使用
  • 188
分享到

CSS新特性content-visibility怎么使用

2023-07-04 16:07:33 188人浏览 泡泡鱼
摘要

这篇“CSS新特性content-visibility怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“CSS新特性co

这篇“CSS新特性content-visibility怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“CSS新特性content-visibility怎么使用”文章吧。

content-visibility

属性值

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

  • visible:默认值,没有效果。元素的内容被正常布局和呈现。

  • hidden:元素跳过它的内容。跳过的内容不能被用户代理功能访问,例如在页面中查找、标签顺序导航等,也不能被选择或聚焦。这类似于给内容设置display: none

  • auto:该元素打开布局包含、样式包含和绘制包含。如果该元素与用户不相关,它也会跳过其内容。与 hidden 不同,跳过的内容必须仍可正常用于用户代理功能,例如在页面中查找、tab 顺序导航等,并且必须正常可聚焦和可选择。

content-visibility: hidden手动管理可见性

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

  • content-visibility: hidden 只是隐藏了子元素,自身不会被隐藏

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

CSS新特性content-visibility怎么使用

从这上面我们可以看到,添加了content-visibility: hidden元素的子元素确实是没有渲染,但它自身是会渲染的!

content-visibility: auto 跳过渲染工作

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

我们上面说到的虚拟列表原理其实就跟这个类似,在首屏加载时,只加载可视区的内容,当页面发生滚动时,动态通过计算获得可视区的内容,并将非可视区的内容进行删除,这样就能够大大提高长列表的渲染性能。

但这个需要配合js才能实现,现在我们可以使用CSS中content-visibility: auto,它可以用来跳过屏幕外的内容渲染,对于这种有大量离屏内容的长列表,可以大大减少页面渲染时间。

我们将上面的例子稍微改改:

<template>  <div>    <div>      <img :src="book.bookCover" />      <div>        <div>{{ `${book.bookName}${index + 1}` }}</div>        <div>{{ book.catlog }}</div>        <div>          <div v-for="(item, index) in book.tags" :key="index">            {{ item }}          </div>        </div>        <div>          {{ book.desc }}        </div>      </div>    </div>  </div></template><script setup>import { toRefs } from "Vue";const props = defineProps<{  book: any;  index: any;}>();const { book, index } = toRefs(props);</script><style scoped>.card_item {  margin: 20px auto;  content-visibility: auto;}  / *  ...  */</style>

首先是没有添加content-visibility: auto的效果,无论这些元素是否在可视区,都会被渲染

CSS新特性content-visibility怎么使用

如果我们在平常业务中这样写,用户进入到这个页面可能就直接口吐芬芳了,为了性能考虑,我们为每一个列表项加上:

.card_item {  content-visibility: auto;}

这个时候我们再来看下效果:

CSS新特性content-visibility怎么使用

从第10个开始,这些没在可视区的元素就没有被渲染,这可比上面那种全部元素都渲染好太多了,但是如果浏览器不渲染页面内的一些元素,滚动将是一场噩梦,因为无法正确计算页面高度。这是因为,content-visibility会将分配给它的元素的高度(height)视为0,浏览器在渲染之前会将这个元素的高度变为0,从而使我们的页面高度和滚动变得混乱。

CSS新特性content-visibility怎么使用

这里我们可以看到页面上的滚动条会出现抖动现象,这是因为可视区外的元素只有出现在了可视区才会被渲染,这就回导致前后页面高度会发生变化,从而出现滚动条的诡异抖动现象,这是虚拟列表基本都会存在的问题。

⚠️注意:当元素接近视口时,浏览器不再添加size容器并开始绘制和命中测试元素的内容。这使得渲染工作能够及时完成以供用户查看。

这也是为什么上面我们看到的是从第十个才开始不渲染子元素,因为它需要一个缓冲区以便浏览器能够在页面发生滚动时及时渲染呈现在用户眼前。

上面提到的size其实是一种 CSS 属性的潜在值contain,它指的是元素上的大小限制确保元素的框可以在不需要检查其后代的情况下进行布局。这意味着如果我们只需要元素的大小,我们可以跳过后代的布局。

contain-intrinsic-size 救场

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

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

语法

此属性是以下 CSS 属性的简写:

  • contain-intrinsic-width

  • contain-intrinsic-height

contain-intrinsic-width: none;contain-intrinsic-size: 1000px;contain-intrinsic-size: 10rem;contain-intrinsic-size: 1000px 1.5em;contain-intrinsic-size: auto 300px;contain-intrinsic-size: auto 300px auto 4rem;

contain-intrinsic-size 可以为元素指定以下一个或两个值。如果指定了两个值,则第一个值适用于宽度,第二个值适用于高度。如果指定单个值,则它适用于宽度和高度。

实现

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

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

CSS新特性content-visibility怎么使用

之前没添加contain-intrinsic-size属性时,可视区外的元素高度都是0,现在这些元素高度都是我们设置的contain-intrinsic-size的值,这样的话整个页面的高度就是不会发生变化(或者说变化很小),从而页面滚动条也不会出现抖动问题(或者说抖动减少)

CSS新特性content-visibility怎么使用

性能对比

上面说了这么多,content-visibility是否真的能够提高页面的渲染性能呢,我们来实际对比看看:

  • 首先是没有content-visibility的页面渲染

CSS新特性content-visibility怎么使用

  • 然后是有content-visibility的页面渲染

CSS新特性content-visibility怎么使用

上面是用1000个列表元素进行测试的,有content-visibility的页面渲染花费时间大概是37ms,而没有content-visibility的页面渲染花费时间大概是269ms,提升了足足有7倍之多!!!

对于列表元素更多的页面,content-visibility带来的渲染性能提升会更加明显。

思考?

能否减小页面的内存占用?

之前有同学问到了content-visibility: auto是否会减少页面内存的占用,这个我们可以查看下使用前后页面所占用内存的大小是否有变化。

我们可以通过chrome浏览器 设置 --> 更多工具 --> 任务管理器 查看页面占用内存大小。

CSS新特性content-visibility怎么使用

  • 首先是没有content-visibility: auto,页面占用内存大概为96.2MB

CSS新特性content-visibility怎么使用

  • 然后是添加了content-visibility: auto,页面占用内存仍然是96.2MB

CSS新特性content-visibility怎么使用

也就是说,它并不会减少页面占用内存大小,这些元素是真实存在于DOM树中的,并且我们也可以通过JS访问到

CSS新特性content-visibility怎么使用

是否会影响脚本的加载行为?

如果我们在添加了content-visibility: auto的元素内去加载脚本,并且此时的元素处于一个不可见的状态,那么此时元素内的脚本能够正常加载呢?

<!-- ... 第十二个 --><div class="visibility_item">        <div class="inner">            测试脚本            <img src="../../../../images/22-11/content-s1.png" alt="">            <script src="./2.js"></script>        </div>        </div>

CSS新特性content-visibility怎么使用

很明显它并不会影响脚本与图片的加载行为,并且脚本再加载后能够正常执行。结合上面第一点,我们可以得出结论,使用了content-visibility: auto的元素影响的只是子元素的渲染,对于内部静态资源的加载还是正常进行。

但我们需要注意的是脚本的执行时机,如果要获取DOM元素的话,此时的脚本只能获取到它加载位置之前的DOM元素,而与它自身DOM有没有渲染无关!

// 2.jsconsole.log('测试脚本')console.log('第十一个', document.querySelectorAll('.visibility_item')[10])console.log('第十三个', document.querySelectorAll('.visibility_item')[12])

CSS新特性content-visibility怎么使用

可访问性

使用了content-visibility: auto并且在非可视区的元素是否存在于可访问树中?

CSS新特性content-visibility怎么使用

这里我们可以看出content-visibility: auto是屏幕外的内容在文档对象模型中仍然可用,因此在可访问性树中(与visibility: hidden不同)。这意味着我们可以在页面上搜索并导航到该内容,而无需等待它加载或牺牲渲染性能。

这个功能特性是在chrome 90 中更新的,在 chrome 85-89 中,屏幕外的子元素content-visibility: auto被标记为不可见。

兼容性

content-visibility是chrome85新增的特性,所以兼容性还不是很高,但它是一个非常实用的CSS属性,由于跳过了渲染,如果我们大部分内容都在屏幕外,利用该content-visibility属性可以使初始用户加载速度更快。相信兼容性的问题在不久的将来会得到解决~CSS新特性content-visibility怎么使用

以上就是关于“CSS新特性content-visibility怎么使用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: CSS新特性content-visibility怎么使用

本文链接: https://www.lsjlt.com/news/346273.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • CSS新特性content-visibility怎么使用
    这篇“CSS新特性content-visibility怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“CSS新特性co...
    99+
    2023-07-04
  • 聊聊CSS新特性content-visibility,助你提升页面渲染性能
    visible:默认值,没有效果。元素的内容被正常布局和呈现。hidden:元素跳过它的内容。跳过的内容不能被用户代理功能访问,例如在页面中查找、标签顺序导航等,也不能被选择或聚焦。这类似于给内容设置display: none。auto:该...
    99+
    2022-11-22
    css
  • 怎么使用content-visibility属性优化渲染性能
    本篇内容介绍了“怎么使用content-visibility属性优化渲染性能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读...
    99+
    2022-10-19
  • css中的backface-visibility属性怎么用
    这篇文章给大家分享的是有关css中的backface-visibility属性怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。   CSS3backface-visibil...
    99+
    2022-10-19
  • CSS的align-content属性怎么用
    这篇文章主要介绍了CSS的align-content属性怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。     ...
    99+
    2022-10-19
  • 怎么用css3新增属性content
    这篇文章将为大家详细讲解有关怎么用css3新增属性content,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。     一、详解content属性 ...
    99+
    2022-10-19
  • CSS五个最新的特性怎么使用
    今天小编给大家分享一下CSS五个最新的特性怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2022-10-19
  • CSS动画新特性@scroll-timeline怎么使用
    这篇文章主要介绍“CSS动画新特性@scroll-timeline怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“CSS动画新特性@scroll-timeli...
    99+
    2022-10-19
  • css中的align-content属性怎么用
    这篇文章主要介绍css中的align-content属性怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!   align-content 属性   align-content...
    99+
    2022-10-19
  • CSS伪元素和Content属性怎么用
    这篇文章主要为大家展示了“CSS伪元素和Content属性怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“CSS伪元素和Content属性怎么用”这篇文章吧...
    99+
    2022-10-19
  • CSS媒体查询新增的特性怎么使用
    这篇文章主要介绍了CSS媒体查询新增的特性怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇CSS媒体查询新增的特性怎么使用文章都会有所收获,下面我们一起来看看吧。CSS @media 规范prefers-...
    99+
    2023-07-04
  • Vue3.0新特性怎么使用
    本篇内容主要讲解“Vue3.0新特性怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3.0新特性怎么使用”吧!1、Vue3带来的新变化性能提升(零成本:从vue2切到vue3就享受到...
    99+
    2023-06-29
  • es6新特性怎么使用
    这篇“es6新特性怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“es6新特性怎么使用”文章吧。es6新特性有:1、l...
    99+
    2023-07-04
  • Java8新特性怎么使用
    本篇内容介绍了“Java8新特性怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java语言新特性Lambda表达式Lambda表达式...
    99+
    2023-06-02
  • HTML5的新特性怎么使用
    这篇“HTML5的新特性怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“HTML5的...
    99+
    2022-10-19
  • 怎么使用的新Java特性
    这篇文章主要讲解了“怎么使用的新Java特性”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用的新Java特性”吧!1 Try-with-resource 语句使用 try-catch ...
    99+
    2023-06-15
  • CSS新特性有哪些及如何使用
    这篇文章主要介绍“CSS新特性有哪些及如何使用”,在日常操作中,相信很多人在CSS新特性有哪些及如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CSS新特性有哪些及如何...
    99+
    2022-10-19
  • React18新增特性released怎么使用
    本文小编为大家详细介绍“React18新增特性released怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“React18新增特性released怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。新...
    99+
    2023-06-30
  • Java8新特性Stream流怎么使用
    本文小编为大家详细介绍“Java8新特性Stream流怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java8新特性Stream流怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Stream流的概...
    99+
    2023-07-02
  • Go1.18新特性之泛型怎么使用
    本篇内容主要讲解“Go1.18新特性之泛型怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go1.18新特性之泛型怎么使用”吧!01 Go中的泛型是什么众所周知,Go是一门静态类型的语言。...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作