小tip: 純CSS實現視差滾動效果
原文 http://www.zhangxinxu.com/wordpress/2015/03/css-only-parallax-effect/
一、效果Demo先行~
視差滾動效果大家可能都聽過,基本上都是JS實現的,有對應插件 – Parallax.js .
實際上,如果你對兼容性要求不是很高,比方說忽略IE瀏覽器,則我們使用簡單的幾行CSS代碼就可以實現視差滾動效果了。
對于效果展示,先看效果是最能引起興趣,激發學習熱情的,如下(IE9+):
您可以狠狠地點擊這里: 純CSS實現的視差滾動效果Demo
進入Demo滾動滾動條,最好鼠標慢慢拖動,效果更明顯——表情花朵等小圖標在手機圖片上方飛動的視差感覺。目前,Chrome以及FireFox等瀏覽器(不包括IE11在內的瀏覽器)都是有效果。
二、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)中的. 這幾個數字之間有什么關系呢?
我們先看下面這個3D視角示意圖(來自 這里 ):

當我們在屏幕前面個單位的地方,看屏幕后面個單位的元素,肉眼所見的畫面大小只有實際的1/2,即所謂的近大遠小。此時scale(2)讓內容放大到原來2倍,正好在平面上看上去好像是原來大小。
雖然肉眼所見體積似乎是1:1,但是,滾動時候的位移變化還是1:2, 應該很好理解。舉個極端的例子,我們坐在電瓶車上看天上的月亮,雖然車子在40碼的速度奔啊奔,但是,好像月亮的位置沒有移動,一直就在頭頂。網頁中的3D就是模擬真實世界的3D效果,因此,也會有這種視差體驗。
或者這么講吧,CSS3 3D天然視差效果,滾動,只是視差體現的一個觸發條件。
于是,親愛的同學。如果你想實現3層視差滾動怎么辦?很簡單,來個transform: translateZ(-2px)試試~
三、結語
據我測試,直接body或html滾動似乎難以實現視差滾動效果,不過天色已晚,我沒深究,有興趣的小伙伴可以研究分享下。
OK, 就像絢爛驚奇的魔術,解密之后,會發現不過爾爾。不知你成功解密了CSS視差滾動的秘密了沒?
感謝閱讀,歡迎交流!
本文為原創文章,會經常更新知識點以及修正一些錯誤,因此轉載請保留原出處,方便溯源,避免陳舊錯誤知識的誤導,同時有更好的閱讀體驗。