使用CSS實(shí)現(xiàn)一個(gè)滾動(dòng)陰影效果

背景
為了良好的用戶(hù)體驗(yàn),需要在容器頂部可滾動(dòng)的情況下增加一個(gè)陰影條,提示用戶(hù)可向上滾動(dòng);如果容器頂部不可滾動(dòng),則不顯示陰影條,效果如下圖所示:
實(shí)現(xiàn)
首先我們定義好dom和相應(yīng)的樣式:
<!-- 容器 --> <div class="container"> <!-- 陰影 --> <div class="shadow"></div> <!-- 占位用,使容器能夠滾動(dòng) --> 1<br/> 2<br/> 3<br/> 4<br/> 5<br/> 6<br/> 7<br/> 8<br/> 9<br/> 10<br/> 11<br/> 12<br/> 13<br/> 14<br/> 15<br/> 16<br/> </div>
// 給容器設(shè)置最大高度,使其產(chǎn)生滾動(dòng) .container { max-height: 200px; overflow-y: auto; border: 1px solid black; position: relative; } // 利用sticky定位實(shí)現(xiàn)吸頂效果 .shadow { position: sticky; visibility: hidden; top: 0; left: 0; right: 0; box-shadow: 0 10px 0 10px rgba(0, 0, 0, 0.2); // 如果不希望陰影擋住下方內(nèi)容的點(diǎn)擊事件的話(huà) pointer-events: none; }
核心的實(shí)現(xiàn)便是如何判斷容器頂部是否還有滾動(dòng)空間,我們用到scrollTop屬性,如果scrollTop大于0,說(shuō)明可以向上滾動(dòng):
import { debounce } from 'https://cdn.jsdelivr.net/npm/lodash-es@4.17.21/lodash.min.js'; // 容器 const container = document.querySelector('.container'); // 陰影 const shadow = document.querySelector('.shadow'); // 用到了lodash的防抖函數(shù), // 通過(guò)scrollTop是否大于0來(lái)判斷容器頂部是否還有滾動(dòng)空間, // 從而控制shadow是否顯示。 const handler = debounce((e) => { if (e.target.scrollTop > 0) { shadow.style.visibility = 'visible'; } else { shadow.style.visibility = 'hidden' } }, 50, { leading: true }); // 監(jiān)聽(tīng)滾動(dòng)事件 container.addEventListener('scroll', handler);
然后就實(shí)現(xiàn)了開(kāi)頭的滾動(dòng)陰影效果。
舉一反三
會(huì)了頂部陰影,那怎么實(shí)現(xiàn)底部、左側(cè)、右側(cè)陰影呢?聰明的你肯定脫口而出用scrollBottom、scrollLeft、scrollRight比較一下就行了。行嗎?不太行哦,元素沒(méi)有scrollBottom、
scrollRight屬性,因此底部和右側(cè)陰影不能用這個(gè)方法實(shí)現(xiàn)。那么應(yīng)該怎么搞呢,也簡(jiǎn)單,用到元素的scrollWidth和scrollHeight就可以實(shí)現(xiàn)scrollBottom和scrollRight的效果:
const scrollRight = scrollWidth - scrollLeft; const scrollBottom = scrollHeight - scrollTop; // 然后再使用前文的邏輯處理即可 ...... // 但是這里還有個(gè)坑, // 上述的scrollBottom和scrollRight是通過(guò)浮點(diǎn)數(shù)相減來(lái)的, // 會(huì)有精度問(wèn)題,因此比較時(shí)不是直接與0比較,而是用Number.EPSILON // 舉個(gè)栗子 scrollRight > Number.EPSILON
其實(shí)不止?jié)L動(dòng)陰影,還有一些效果也是可以用這個(gè)思路做的,比如下圖中的指示器效果:
總結(jié)
寫(xiě)篇小水文,混混經(jīng)驗(yàn)。我發(fā)現(xiàn)長(zhǎng)篇的干貨數(shù)據(jù)不太好,反而是這樣幾分鐘看完的小水文數(shù)據(jù)還挺好看的。雖然水,但是也有不少知識(shí)點(diǎn):
- sticky定位實(shí)現(xiàn)吸頂效果
- pointer-events實(shí)現(xiàn)鼠標(biāo)事件穿透
- 判斷元素某個(gè)方向是否可滾動(dòng)
- 防抖函數(shù)以及立即執(zhí)行
- 浮點(diǎn)數(shù)精度用EPSILON處理
到此這篇關(guān)于使用CSS實(shí)現(xiàn)一個(gè)滾動(dòng)陰影效果的文章就介紹到這了,更多相關(guān)CSS滾動(dòng)陰影內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
使用純 CSS 實(shí)現(xiàn)滾動(dòng)陰影效果
這篇文章主要介紹了使用純 CSS 實(shí)現(xiàn)滾動(dòng)陰影效果,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-04- CSS的陰影效果為網(wǎng)頁(yè)設(shè)計(jì)增添了許多細(xì)節(jié)和質(zhì)感,本文就來(lái)介紹一下css實(shí)現(xiàn)元素四周陰影的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-04
- 這篇文章主要個(gè)大家介紹了如何使用CSS實(shí)現(xiàn)Logo陰影特效,文章通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,感興趣的同學(xué)可是自己動(dòng)手嘗試一下2023-11-20
- 這篇文章主要介紹了CSS 實(shí)現(xiàn)多彩、智能的陰影效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-12
- 這篇文章主要介紹了css文字陰影漸漸模糊效果的實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-07
- 這篇文章主要介紹了CSS 陰影動(dòng)畫(huà)優(yōu)化技巧,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-31
- 這篇文章主要介紹了用CSS畫(huà)一個(gè)帶陰影的三角形的示例代碼的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨2019-07-31
css實(shí)現(xiàn)動(dòng)態(tài)陰影、蝕刻文本、漸變文本效果
這篇文章主要介紹了css實(shí)現(xiàn)動(dòng)態(tài)陰影、蝕刻文本、漸變文本效果,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-22- 這篇文章主要介紹了CSS 翹邊陰影的實(shí)現(xiàn)代碼的相關(guān)資料,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-15