摘要:濾鏡也會導(dǎo)致失效完了嗎沒有。上文中的是什么上文的準確而言是什么我也無法確定,推測應(yīng)該是,幀緩存對象,存在于顯存中。幀緩存是一些二維數(shù)組和所使用的存儲區(qū)的集合顏色緩存深度緩存模板緩存和累計緩存。所以,短期內(nèi)可能無望解決。
今天在寫一個小的 CSS Demo,一個關(guān)于 3d 球的旋轉(zhuǎn)動畫,關(guān)于 CSS 3D,少不了會使用下面這幾個屬性:
{ transform-style: preserve-3d; perspective: 1000; transform: translate3d(); }
這個 Demo 你可以戳這里,大概是這樣:CodePen Demo - 3D ball:
嗯,大概到了這個效果,想到了 CSS 混合模式 mix-blend-mode
,尋思著,利用混合模式,是否能讓效果更上一層樓或者碰撞出一些其他火花。
mix-blend-mode
:我們通常稱之為混合模式,利用混合模式將多個圖層混合可以得到一個新的效果,mix-blend-mode
描述了元素的內(nèi)容應(yīng)該與元素的直系父元素的內(nèi)容和元素的背景如何混合。
關(guān)于混合模式的一些使用可以看這里:不可思議的混合模式 background-blend-mode (二)、不可思議的混合模式 background-blend-mode
mix-blend-mode
然而,給元素加上了一個混合模式之后,神奇的事情發(fā)生了,3D 效果消失了。
也就是在每個光點的 CSS 元素代碼中添加這樣一句:
{ mix-blend-mode: lighten; }
效果從 CSS 3D 變成了 2D。
這就很蹊蹺了,預(yù)想中的混合并沒有發(fā)生,取而代之的是 3D 的失效。我想,也許與內(nèi)核有關(guān),上面的效果是在 chrome 65.0.3325.181 試驗得到的。
帶著這樣的疑問,我又測試了下其他幾個內(nèi)核:
Safari 是可以正常展示的,只能初略的認為,應(yīng)該是與內(nèi)核有關(guān)系的。那應(yīng)該也有很多人遇到過同樣的問題,帶著這個疑惑,google 一下。
爆棧網(wǎng)也有同學(xué)提出類似的疑惑:StackOverflow -- mix-blend-mode is broken by 3D transformations on page
隨后,在 chromium bug 提交網(wǎng)站上,找到了 15 年的一個 bug 單,也是對這個問題的疑問:
BUG -CSS mix-blend-mode turns off CSS perspective.
最終在 bug 單的最下面找到了可能靠譜的回答:
When we have mix-blend-mode, the closest ancestor that creates stacking context will isolate blending. We create a render surface at the root of this isolated group and because render surfaces dont support preserve-3d(because they render into separate FBO), we see a flattened result.
ajuma@ suggested that this bug maybe much easier to fix after Slimming paint v2 if we can somehow disentangle transforms from layers.
翻譯一下,意思大概是:當我們使用 CSS 混合模式的時候,堆疊上下文會重新對這個使用了混合模式的元素的根節(jié)點處創(chuàng)建一個獨立的渲染平面,但是很可惜,這個渲染平面是不支持 preserve-3d 的(因為它們渲染到多帶帶的FBO中),所以我們看到是一個 2D 的平面效果。
上面的那句話應(yīng)該已經(jīng)可以作為結(jié)論,我再使用 chrome 提供的工具驗證一下,打開開發(fā)者工具的 Rendering -> Layer borders:
黃色代表 CSS 渲染時候的 GraphicsLayer 層, 藍色網(wǎng)格表示瓦片(tile),你可以把它們當作是層的單元(并不是層),Chrome 內(nèi)核可以將它們作為一個大層的部分上傳給 GPU 進行渲染加速。
mix-blend-mode
的 3D 模式下,開啟 Layer borders 效果:
可以看到,在 mix-blend-mode
的 3D 模式下,確實在整個球形元素之外,又多了一層藍色 tile。也就是上文提到的獨立的渲染平面,也就是因為這個渲染平面不支持 preserve-3d 的原因,我們最終得到了一個 2D 平面圖形。
完了嗎?沒有。不是吧,這誰頂?shù)米“ ?/span>
那么如果是因為 mix-blend-mode
多生成了一個獨立渲染平面導(dǎo)致的 3D 失效,那么是否有其他元素也會導(dǎo)致同樣的結(jié)果呢?
帶著疑惑,去掉了 mix-blend-mode
,我又給設(shè)置了 3d 的元素添加了一個濾鏡:
{ - mix-blend-mode: lighten; + filter: blur(1px); }
果然,出現(xiàn)了同樣的問題,3D 失效:
嗯。那么應(yīng)該可以初步得到一個結(jié)論就是所有這些在渲染時候需要再獨立生成一個渲染平面,且包含了 preserve-3d 的屬性,都會導(dǎo)致內(nèi)部的 CSS 3D 失效。
暫時我發(fā)現(xiàn)的有下述幾個屬性,都會導(dǎo)致 CSS 3D 失效:
mix-blend-mode
background-blend-mode
filter
額,通常來說,很少會有人在使用 CSS 3D 的同時使用混合模式或者濾鏡,這兩個屬性更多的錦上添花的作用,所以大部分時候,不使用它們就不會有問題, 所以影響不是很大。
上文的 FBO
準確而言是什么我也無法 100% 確定,推測應(yīng)該是 Frame Buffer Object,幀緩存對象,存在于顯存中。幀緩存是一些二維數(shù)組和 OpenGL 所使用的存儲區(qū)的集合:顏色緩存、深度緩存、模板緩存和累計緩存。
各種三維場景現(xiàn)在渲染到屏幕上都是先放到一個 FBO 中,可以理解為一張離屛圖片,用于加速渲染。
在 chromium bugs 網(wǎng)站,上述 bug 被合并到 issue 575099,并且最終狀態(tài)是 Untriaged,表示尚未分配優(yōu)先級,意思是等待某人確定哪個人應(yīng)該認領(lǐng)并修復(fù)該特定錯誤。所以,短期內(nèi)可能無望解決。
感謝耐心讀完。更多精彩 CSS 技術(shù)文章匯總在我的 Github -- iCSS ,持續(xù)更新,歡迎點個 star 訂閱收藏。
好了,本文到此結(jié)束,希望對你有幫助 :)
如果還有什么疑問或者建議,可以多多交流,原創(chuàng)文章,文筆有限,才疏學(xué)淺,文中若有不正之處,萬望告知。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/1430.html
摘要:濾鏡也會導(dǎo)致失效完了嗎沒有。上文中的是什么上文的準確而言是什么我也無法確定,推測應(yīng)該是,幀緩存對象,存在于顯存中。幀緩存是一些二維數(shù)組和所使用的存儲區(qū)的集合顏色緩存深度緩存模板緩存和累計緩存。 今天在寫一個小的 CSS Demo,一個關(guān)于 3d 球的旋轉(zhuǎn)動畫,關(guān)于 CSS 3D,少不了會使用下面這幾個屬性: { transform-style: preserve-3d; ...
摘要:歡迎來我的個人站點性能優(yōu)化其他優(yōu)化瀏覽器關(guān)鍵渲染路徑開啟性能優(yōu)化之旅高性能滾動及頁面渲染優(yōu)化理論寫法對壓縮率的影響唯快不破應(yīng)用的個優(yōu)化步驟進階鵝廠大神用直出實現(xiàn)網(wǎng)頁瞬開緩存網(wǎng)頁性能管理詳解寫給后端程序員的緩存原理介紹年底補課緩存機制優(yōu)化動 歡迎來我的個人站點 性能優(yōu)化 其他 優(yōu)化瀏覽器關(guān)鍵渲染路徑 - 開啟性能優(yōu)化之旅 高性能滾動 scroll 及頁面渲染優(yōu)化 理論 | HTML寫法...
摘要:歡迎來我的個人站點性能優(yōu)化其他優(yōu)化瀏覽器關(guān)鍵渲染路徑開啟性能優(yōu)化之旅高性能滾動及頁面渲染優(yōu)化理論寫法對壓縮率的影響唯快不破應(yīng)用的個優(yōu)化步驟進階鵝廠大神用直出實現(xiàn)網(wǎng)頁瞬開緩存網(wǎng)頁性能管理詳解寫給后端程序員的緩存原理介紹年底補課緩存機制優(yōu)化動 歡迎來我的個人站點 性能優(yōu)化 其他 優(yōu)化瀏覽器關(guān)鍵渲染路徑 - 開啟性能優(yōu)化之旅 高性能滾動 scroll 及頁面渲染優(yōu)化 理論 | HTML寫法...
摘要:歡迎來我的個人站點性能優(yōu)化其他優(yōu)化瀏覽器關(guān)鍵渲染路徑開啟性能優(yōu)化之旅高性能滾動及頁面渲染優(yōu)化理論寫法對壓縮率的影響唯快不破應(yīng)用的個優(yōu)化步驟進階鵝廠大神用直出實現(xiàn)網(wǎng)頁瞬開緩存網(wǎng)頁性能管理詳解寫給后端程序員的緩存原理介紹年底補課緩存機制優(yōu)化動 歡迎來我的個人站點 性能優(yōu)化 其他 優(yōu)化瀏覽器關(guān)鍵渲染路徑 - 開啟性能優(yōu)化之旅 高性能滾動 scroll 及頁面渲染優(yōu)化 理論 | HTML寫法...
摘要:下圖是我鼓搗到另外一個小,當?shù)皆氐臅r候,產(chǎn)生火焰效果嗯,這些其實都是對濾鏡及混合模式的一些搭配運用。主要幾個屬性默認大家已經(jīng)掌握了大概,閱讀后可以自行去了解補充更多細節(jié)更多精彩技術(shù)文章匯總在我的,持續(xù)更新,歡迎點個訂閱收藏。正文從下面開始。 今天的小技巧是使用純 CSS 生成火焰,逼真一點的火焰。 嗯,長什么樣子?在 CodePen 上輸入關(guān)鍵字?CSS Fire,能找到這樣的: 或者...
閱讀 735·2023-04-25 19:43
閱讀 3981·2021-11-30 14:52
閱讀 3807·2021-11-30 14:52
閱讀 3871·2021-11-29 11:00
閱讀 3802·2021-11-29 11:00
閱讀 3904·2021-11-29 11:00
閱讀 3580·2021-11-29 11:00
閱讀 6182·2021-11-29 11:00