成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用 CSS 新特性直接實現(xiàn)虛擬列表?JS 往后稍稍

開發(fā) 前端
最近在業(yè)務中實際使用 ??content-visibility?? 進了一些渲染性能的優(yōu)化。這是一個比較新且有強大功能的屬性。本文將帶領大家深入理解一番。

何為 ??content-visibility???

??content-visibility??:屬性控制一個元素是否渲染其內(nèi)容,它允許用戶代理(瀏覽器)潛在地省略大量布局和渲染工作,直到需要它為止。

MDN 原文:The content-visibility CSS property controls whether or not an element renders its contents at all, along with forcing a strong set of containments, allowing user agents to potentially omit large swathes of layout and rendering work until it becomes needed. Basically it enables the user agent to skip an element's rendering work (including layout and painting) until it is needed — which makes the initial page load much faster.

它有幾個常見的取值。

/* Keyword values */
content-visibility: visible;
content-visibility: hidden;
content-visibility: auto;

分別解釋一下:

  • ??content-visibility: visible??:默認值,沒有任何效果,相當于沒有添加??content-visibility??,元素的渲染與往常一致。
  • ??content-visibility: hidden??:與??display: none?? 類似,用戶代理將跳過其內(nèi)容的渲染。(這里需要注意的是,跳過的是內(nèi)容的渲染)
  • ??content-visibility: auto??:如果該元素不在屏幕上,并且與用戶無關,則不會渲染其后代元素。

contain-intrinsic-size

當然,除 ??content-visibility?? 之外,還有一個與之配套的屬性 -- ??contain-intrinsic-size??。

??contain-intrinsic-size??:控制由 ??content-visibility?? 指定的元素的自然大小。

上面兩個屬性光看定義和介紹會有點繞。

我們首先來看看 ??content-visibility?? 如何具體使用。

??content-visibility: visible?? 是默認值,添加后沒有任何效果,我們就直接跳過。

利用 ??content-visibility: hidden?? 優(yōu)化展示切換性能

首先來看看 ??content-visibility: hidden??,它通常會拿來和 ??display: none?? 做比較,但是其實它們之間還是有很大的不同的。

首先,假設我們有兩個 DIV 包裹框:

<div class="g-wrap">
<div>1111</div>
<div class="hidden">2222</div>
</div>

設置兩個 div 為 ??200x200?? 的黑色塊:

.g-wrap > div {
width: 200px;
height: 200px;
background: #000;
}

效果如下:

圖片

OK,沒有問題,接下來,我們給其中的 ??.hidden?? 設置 ??content-visibility: hidden??,看看會發(fā)生什么:

.hidden {
content-visibility: hidden;
}

效果如下:

圖片

注意,仔細看效果,這里添加了 ??content-visibility: hidden?? 之后,消失的只是添加了該元素的 div 的子元素消失不見,而父元素本身及其樣式,還是存在頁面上的

如果我們?nèi)サ粼O置了 ??content-visibility: hidden?? 的元素本身的 ??width??、??height??、??padding??、??margin?? 等屬性,則元素看上去就如同設置了 ??display: none?? 一般,在頁面上消失不見了。

那么,??content-visibility: hidden?? 的作用是什么呢?

設置了 ??content-visibility: hidden?? 的元素,其元素的子元素將被隱藏,但是,它的渲染狀態(tài)將會被緩存。所以,當 ??content-visibility: hidden?? 被移除時,用戶代理無需重頭開始渲染它和它的子元素。

因此,如果我們將這個屬性應用在一些一開始需要被隱藏,但是其后在頁面的某一時刻需要被渲染,或者是一些需要被頻繁切換顯示、隱藏狀態(tài)的元素上,其渲染效率將會有一個非常大的提升。

利用 ??content-visibility: auto?? 實現(xiàn)懶加載或虛擬列表

OK,接下來是 ??content-visibility?? 的核心用法,利用 ??auto?? 屬性值。

??content-visibility: auto?? 的作用是,如果該元素不在屏幕上,并且與用戶無關,則不會渲染其后代元素。是不是與 LazyLoad 非常類似?

我們來看這樣一個 DEMO ,了解其作用:

假設,我們存在這樣一個 HTML 結構,含有大量的文本內(nèi)容:

<div class="g-wrap">
<div class="paragraph">...</div>
// ... 包含了 N 個 paragraph
<div class="paragraph">...</div>
</div>

每個 ??.paragraph?? 的內(nèi)容如下:

圖片

因此,整個的頁面看起來就是這樣的:

圖片圖片

由于,我們沒有對頁面內(nèi)容進行任何處理,因此,所有的 ??.paragraph?? 在頁面刷新的一瞬間,都會進行渲染,看到的效果就如上所示。

當然,現(xiàn)代瀏覽器愈加趨于智能,基于這種場景,其實我們非常希望對于仍未看到,仍舊未滾動到的區(qū)域,可以延遲加載,只有到我們需要展示、滾動到該處時,頁面內(nèi)容才進行渲染。

基于這種場景,??content-visibility: auto?? 就應運而生了,它允許瀏覽器對于設置了該屬性的元素進行判斷,如果該元素當前不處于視口內(nèi),則不渲染該元素。

我們基于上述的代碼,只需要最小化,添加這樣一段代碼:

.paragraph {
content-visibility: auto;
}

再看看效果,仔細觀察右側的滾動條:

圖片

這里我使用了 ??::-webkit-scrollbar?? 相關樣式,讓滾動條更明顯。

可能你還沒意識到發(fā)生了什么,我們對比下添加了 ??content-visibility: auto?? 和沒有添加 ??content-visibility: auto?? 的兩種效果下文本的整體高度:

圖片

有著非常明顯的差異,這是因為,設置了 ??content-visibility: auto?? 的元素,在非可視區(qū)域內(nèi),目前并沒有被渲染,因此,右側內(nèi)容的高度其實是比正常狀態(tài)下少了一大截的。

好,我們實際開始進行滾動,看看會發(fā)生什么:

圖片

由于下方的元素在滾動的過程中,出現(xiàn)在視口范圍內(nèi)才被渲染,因此,滾動條出現(xiàn)了明顯的飄忽不定的抖動現(xiàn)象。(當然這也是使用了 ??content-visibility: auto?? 的一個小問題之一),不過明顯可以看出,這與我們通常使用 JavaScript 實現(xiàn)的懶加載或者延遲加載非常類似。

當然,與懶加載不同的是,在向下滾動的過程中,上方消失的已經(jīng)被渲染過且消失在視口的元素,也會因為消失在視口中,重新被隱藏。因此,即便頁面滾動到最下方,整體的滾動條高度還是沒有什么變化的。

??content-visibility?? 是否能夠優(yōu)化渲染性能?

那么,??content-visibility?? 是否能夠優(yōu)化渲染性能呢?

Youtube -- Slashing layout cost with content-visibility[1] 中,給了一個非常好的例子。

這里我簡單復現(xiàn)一下。

對于一個存在巨量 HTML 內(nèi)容的頁面,譬如類似于這個頁面 -- HTML - Living Standard[2]

圖片

可以感受到,往下翻,根本翻不到盡頭。(這里我在本地模擬了該頁面,復制了該頁面的所有 DOM,并非實際在該網(wǎng)站進行測試)

如果不對這個頁面做任何處理,看看首次渲染需要花費的時間:

圖片

可以看到,DOMContentLoaded 的時間的 ??3s+??,而花費在 Rendering 上的就有整整 ??2900ms??!

而如果給這個頁面的每個段落,添加上 ??content-visibility: auto??,再看看整體的耗時:

圖片

可以看到,DOMContentLoaded 的時間驟降至了 ??500ms+??,而花費在 Rendering 上的,直接優(yōu)化到了 ??61ms??!

2900ms --> 61ms,可謂是驚人級別的優(yōu)化了。因此,??content-visibility: auto?? 對于長文本、長列表功能的優(yōu)化是顯而易見的。

利用 ??contain-intrinsic-size?? 解決滾動條抖動問題

當然,??content-visibility?? 也存在一些小問題。

從上面的例子,也能看到,在利用 ??content-visibility: auto?? 處理長文本、長列表的時候。在滾動頁面的過程中,滾動條一直在抖動,這不是一個很好的體驗。

當然,這也是許多虛擬列表都會存在的一些問題。

好在,規(guī)范制定者也發(fā)現(xiàn)了這個問題。這里我們可以使用另外一個 CSS 屬性,也就是文章一開頭提到的另外一個屬性 -- ??contain-intrinsic-size??,來解決這個問題。

??contain-intrinsic-size??:控制由 ??content-visibility?? 指定的元素的自然大小。

什么意思呢?

還是上面的例子

<div class="g-wrap">
<div class="paragraph">...</div>
// ... 包含了 N 個 paragraph
<div class="paragraph">...</div>
</div>

如果我們不使用 ??contain-intrinsic-size??,只對視口之外的元素使用 ??content-visibility: auto??,那么視口外的元素高度通常就為 0。

當然,如果直接給父元素設置固定的 ??height??,也是會有高度的。

那么實際的滾動效果,滾動條就是抖動的:

圖片

所以,我們可以同時利用上 ??contain-intrinsic-size??,如果能準確知道設置了 ??content-visibility: auto?? 的元素在渲染狀態(tài)下的高度,就填寫對應的高度。如果如法準確知道高度,也可以填寫一個大概的值:

.paragraph {
content-visibility: auto;
contain-intrinsic-size: 320px;
}

如此之后,瀏覽器會給未被實際渲染的視口之外的 ??.paragraph?? 元素一個高度,避免出現(xiàn)滾動條抖動的現(xiàn)象:

圖片

你可以自己親自嘗試感受一下:CodePen Demo -- content-visibility: auto Demo[3]

??content-visibility?? 的一些其他問題

首先,看看 ??content-visibility?? 的兼容性(2022-06-03):

圖片

目前還是比較慘淡的,并且我沒有實際在業(yè)務中使用它,需要再等待一段時間。當然,由于該屬性屬于漸進增強一類的功能,即便失效,也完全不影響頁面本身的展示。

同時,也有一些同學表示,利用 ??content-visibility: auto?? 只能解決部分場景,在海量 DOM 的場景下的實際效果,還有待進一步的實測。真正運用的時候,多做對比,再做取舍。

當然,現(xiàn)代瀏覽器已經(jīng)越來越智能,類似 ??content-visibility?? 功能的屬性也越來越多,我們在性能優(yōu)化的路上有了更多選擇,總歸是一件好事。

參考資料

[1]Youtube -- Slashing layout cost with content-visibility: https://www.youtube.com/watch?v=FFA-v-CIxJQ&t=869s

[2]L - Living Standard: https://html.spec.whatwg.org/

[3]CodePen Demo -- content-visibility: auto Demo: https://codepen.io/Chokcoco/pen/rNJvPEX

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2011-11-18 13:25:48

HTML 5

2025-05-19 08:15:00

ChromeCSS輪播特效

2023-12-11 09:02:27

CSS前端CSS 新特性

2023-10-23 19:51:11

Java線程

2024-09-25 16:31:02

2013-06-12 15:19:05

iOS7WWDC

2023-04-14 16:45:21

CSS前端CSS3

2012-05-07 13:45:45

Oraclen 11g虛擬列數(shù)據(jù)庫

2009-01-05 18:15:48

服務器虛擬化數(shù)據(jù)中心

2025-05-09 00:00:00

2017-03-13 15:27:55

CSS新特性

2021-04-28 06:00:36

CSS contain技巧

2022-03-09 08:14:24

CSS容器container

2024-11-19 10:26:35

2017-09-22 14:04:33

前端Node.js新特性

2009-06-03 16:10:34

OpenSolaris

2020-05-14 11:19:19

降序索引子集

2010-09-14 09:18:28

DIVCSS

2014-07-15 14:48:26

Java8

2024-09-11 09:30:58

IDEA工具編程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区在线 | 婷婷开心激情综合五月天 | 中文字幕一区在线观看视频 | 天堂va在线观看 | 中文字幕一区二区三区四区五区 | 91视频精选 | 国产一区二区在线看 | 亚州中文字幕 | 精品二三区 | 精品国产一区二区久久 | 天堂综合网 | 亚洲人成网亚洲欧洲无码 | 欧美日韩最新 | 蜜桃久久 | 精品福利在线视频 | 亚洲一区二区中文字幕在线观看 | 国产一区二区日韩 | 中文字幕av在线 | 91精品国产一区二区三区香蕉 | 日韩欧美二区 | 久久久久久蜜桃一区二区 | 羞羞的视频免费看 | 在线国产视频观看 | 日韩欧美在线不卡 | 一区二区三区视频在线免费观看 | 精品久草| 国产精品自拍啪啪 | 亚洲成人www | 在线视频亚洲 | av电影一区 | 在线观看www高清视频 | 日本三级做a全过程在线观看 | 99精品一区二区三区 | 一道本视频 | 特级黄一级播放 | 欧美精品在线观看 | 成人在线免费观看视频 | yeyeav| 91免费观看在线 | 欧美日韩精品在线免费观看 | 一级毛片大全免费播放 |