CSS實現的原理
原理說透了很簡單,下面幾個關鍵CSS聲明起的作用(紅色高亮部分):
| 代碼如下 |
複製代碼 |
.container {
/* 滾動容器 */
perspective: 1px;
padding: 0; height: calc(100vh - 300px); overflow: auto;
}
.box {
/* 視差元素的父級需要3D視角 */
height: 1280px;
transform-style: preserve-3d;
position: relative;
}
.background {
/* 滾動比較慢的背景元素 */
position: absolute; left: 50%;
transform: translate3D(-50%, -120px, -1px) scale(2);
} |
大家可以注意上面紅色高亮代碼出現了一個1px(來自perspective), 一個-1px(來自transform)以及scale(2)中的2. 這幾個數字之間有什麼關係呢?
我們先看下面這個3D視角示意圖
當我們在螢幕前面1個單位的地方,看螢幕後面1個單位的元素,肉眼所見的畫面大小隻有實際的1/2,即所謂的近大遠小。此時scale(2)讓內容放大到原來2倍,正好在平面上看上去好像是原來大小。
雖然肉眼所見體積似乎是1:1,但是,滾動時候的位移變化還是1:2, 應該很好理解。舉個極端的例子,我們坐在電瓶車上看天上的月亮,雖然車子在40碼的速度奔啊奔,但是,好像月亮的位置沒有移動,一直就在頭頂。網頁中的3D就是類比真實世界的3D效果,因此,也會有這種視差體驗。
或者這麼講吧,CSS3 3D天然視差效果,滾動,只是視差體現的一個觸發條件。
於是,親愛的同學。如果你想實現3層視差滾動怎麼辦?很簡單,來個transform: translateZ(-2px)試試~
結語
據我測試,直接body或html滾動似乎難以實現視差滾動效果,不過天色已晚,我沒深究,有興趣的小夥伴可以研究分享下。
OK, 就像絢爛驚奇的魔術,解密之後,會發現不過爾爾。不知你成功解密了CSS視差滾動的秘密了沒?