摘要:濾鏡也會導致失效完了嗎沒有。上文中的是什么上文的準確而言是什么我也無法確定,推測應該是,幀緩存對象,存在于顯存中。幀緩存是一些二維數組和所使用的存儲區的集合顏色緩存深度緩存模板緩存和累計緩存。
今天在寫一個小的 CSS Demo,一個關于 3d 球的旋轉動畫,關于 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 描述了元素的內容應該與元素的直系父元素的內容和元素的背景如何混合。CSS 3D 配合 mix-blend-mode關于混合模式的一些使用可以看這里:不可思議的混合模式 background-blend-mode (二)、不可思議的混合模式 background-blend-mode
然而,給元素加上了一個混合模式之后,神奇的事情發生了,3D 效果消失了。
也就是在每個光點的 CSS 元素代碼中添加這樣一句:
{ mix-blend-mode: lighten; }
效果從 CSS 3D 變成了 2D。
這就很蹊蹺了,預想中的混合并沒有發生,取而代之的是 3D 的失效。我想,也許與內核有關,上面的效果是在 chrome 65.0.3325.181 試驗得到的。
是否與瀏覽器內核有關?帶著這樣的疑問,我又測試了下其他幾個內核:
firefox 64.0 -- 這次更加詭異,整個圖案都不會再被渲染出來
Safari 12.0.2 -- 渲染正常
Safari 是可以正常展示的,只能初略的認為,應該是與內核有關系的。那應該也有很多人遇到過同樣的問題,帶著這個疑惑,google 一下。
爆棧網也有同學提出類似的疑惑:StackOverflow -- mix-blend-mode is broken by 3D transformations on page
隨后,在 chromium bug 提交網站上,找到了 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 don"t 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 混合模式的時候,堆疊上下文會重新對這個使用了混合模式的元素的根節點處創建一個獨立的渲染平面,但是很可惜,這個渲染平面是不支持 preserve-3d 的(因為它們渲染到多帶帶的FBO中),所以我們看到是一個 2D 的平面效果。
驗證 Layer borders上面的那句話應該已經可以作為結論,我再使用 chrome 提供的工具驗證一下,打開開發者工具的 Rendering -> Layer borders:
黃色代表 CSS 渲染時候的 GraphicsLayer 層, 藍色網格表示瓦片(tile),你可以把它們當作是層的單元(并不是層),Chrome 內核可以將它們作為一個大層的部分上傳給 GPU 進行渲染加速。
正常 3D 模式下,開啟 Layer borders 效果:
添加了 mix-blend-mode 的 3D 模式下,開啟 Layer borders 效果:
可以看到,在 mix-blend-mode 的 3D 模式下,確實在整個球形元素之外,又多了一層藍色 tile。也就是上文提到的獨立的渲染平面,也就是因為這個渲染平面不支持 preserve-3d 的原因,我們最終得到了一個 2D 平面圖形。
濾鏡也會導致 CSS 3D 失效完了嗎?沒有。不是吧,這誰頂得住啊。
那么如果是因為 mix-blend-mode 多生成了一個獨立渲染平面導致的 3D 失效,那么是否有其他元素也會導致同樣的結果呢?
帶著疑惑,去掉了 mix-blend-mode,我又給設置了 3d 的元素添加了一個濾鏡:
{ - mix-blend-mode: lighten; + filter: blur(1px); }
果然,出現了同樣的問題,3D 失效:
總結一下嗯。那么應該可以初步得到一個結論就是所有這些在渲染時候需要再獨立生成一個渲染平面,且包含了 preserve-3d 的屬性,都會導致內部的 CSS 3D 失效。
暫時我發現的有下述幾個屬性,都會導致 CSS 3D 失效:
mix-blend-mode
background-blend-mode
filter
其他問題 這個 bug 有什么影響額,通常來說,很少會有人在使用 CSS 3D 的同時使用混合模式或者濾鏡,這兩個屬性更多的錦上添花的作用,所以大部分時候,不使用它們就不會有問題, 所以影響不是很大。
上文中的 FBO 是什么?上文的 FBO 準確而言是什么我也無法 100% 確定,推測應該是 Frame Buffer Object,幀緩存對象,存在于顯存中。幀緩存是一些二維數組和 OpenGL 所使用的存儲區的集合:顏色緩存、深度緩存、模板緩存和累計緩存。
各種三維場景現在渲染到屏幕上都是先放到一個 FBO 中,可以理解為一張離屛圖片,用于加速渲染。
Bug 何時會被修復在 chromium bugs 網站,上述 bug 被合并到 issue 575099,并且最終狀態是 Untriaged,表示尚未分配優先級,意思是等待某人確定哪個人應該認領并修復該特定錯誤。所以,短期內可能無望解決。
最后感謝耐心讀完。更多精彩 CSS 技術文章匯總在我的 Github -- iCSS ,持續更新,歡迎點個 star 訂閱收藏。
好了,本文到此結束,希望對你有幫助 :)
如果還有什么疑問或者建議,可以多多交流,原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/117104.html
摘要:濾鏡也會導致失效完了嗎沒有。上文中的是什么上文的準確而言是什么我也無法確定,推測應該是,幀緩存對象,存在于顯存中。幀緩存是一些二維數組和所使用的存儲區的集合顏色緩存深度緩存模板緩存和累計緩存。所以,短期內可能無望解決。今天在寫一個小的 CSS Demo,一個關于 3d 球的旋轉動畫,關于 CSS 3D,少不了會使用下面這幾個屬性: { transform-style: preser...
摘要:歡迎來我的個人站點性能優化其他優化瀏覽器關鍵渲染路徑開啟性能優化之旅高性能滾動及頁面渲染優化理論寫法對壓縮率的影響唯快不破應用的個優化步驟進階鵝廠大神用直出實現網頁瞬開緩存網頁性能管理詳解寫給后端程序員的緩存原理介紹年底補課緩存機制優化動 歡迎來我的個人站點 性能優化 其他 優化瀏覽器關鍵渲染路徑 - 開啟性能優化之旅 高性能滾動 scroll 及頁面渲染優化 理論 | HTML寫法...
摘要:下圖是我鼓搗到另外一個小,當到元素的時候,產生火焰效果嗯,這些其實都是對濾鏡及混合模式的一些搭配運用。主要幾個屬性默認大家已經掌握了大概,閱讀后可以自行去了解補充更多細節更多精彩技術文章匯總在我的,持續更新,歡迎點個訂閱收藏。正文從下面開始。 今天的小技巧是使用純 CSS 生成火焰,逼真一點的火焰。 嗯,長什么樣子?在 CodePen 上輸入關鍵字?CSS Fire,能找到這樣的: 或者...
閱讀 1552·2021-11-17 09:33
閱讀 1100·2021-11-12 10:36
閱讀 2414·2019-08-30 15:54
閱讀 2441·2019-08-30 13:14
閱讀 2913·2019-08-26 14:05
閱讀 3289·2019-08-26 11:32
閱讀 3001·2019-08-26 10:09
閱讀 2995·2019-08-26 10:09