在平時(shí)開發(fā)中,經(jīng)常會遇到這樣一種問題:當(dāng)打開一個(gè)彈窗時(shí),后面的頁面是可以滾動的,演示如下
圖片
那么,該如何鎖定頁面的滾動呢?
傳統(tǒng)的方式其實(shí)也不復(fù)雜,就是在打開彈窗時(shí)阻止?jié)L動就行了,通常是改變overflow屬性
const openModal = () => { document.body.style.overflow = 'hidden'}const closeModal = () => { document.body.style.overflow = 'auto'}
如果是在現(xiàn)代框架里,比如vue,可以用監(jiān)聽彈窗狀態(tài)來實(shí)現(xiàn)
watch( () => show.value, (val) => { if (val) { document.body.style.overflow = 'hidden' } else { document.body.style.overflow = 'auto' } },)
這樣就能鎖定滾動了
圖片
雖然上面的實(shí)現(xiàn)看似完美,其實(shí)還有潛在問題的。比如有多個(gè)彈窗,彈窗覆蓋的情況下,這個(gè)時(shí)候鎖定就會出問題了。
圖片
因?yàn)樵陉P(guān)閉第二個(gè)彈窗的時(shí)候,頁面已經(jīng)解除鎖定了,所以在第一個(gè)彈窗還在的時(shí)候,頁面已經(jīng)可以滾動了
如果想要優(yōu)化這個(gè)問題,還需要做進(jìn)一步的判斷
現(xiàn)在有了CSS :has偽類,一切就好辦了,無需過多的判斷,直接一個(gè)選擇器搞定
body:has(dialog[open]){ overflow: hidden}
這行選擇器表示,只要有屬性為open的彈窗,body就自動鎖定,無論有多少層彈窗
圖片
是不是非常簡單?
完整代碼可以查看:CSS has lock scroll (juejin.cn)[1]
提一下兼容性,目前現(xiàn)代瀏覽器都支持了,如下
圖片
[1]CSS has lock scroll (juejin.cn): https://code.juejin.cn/pen/7357637625827573800
本文鏈接:http://www.tebozhan.com/showinfo-26-83625-0.html借助CSS has實(shí)現(xiàn)打開彈窗時(shí)自動鎖定滾動
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: 輕松打造Windows服務(wù):將.NET Core項(xiàng)目轉(zhuǎn)化為無縫運(yùn)行的后臺服務(wù)
下一篇: Go 如何緩解來自軟件依賴的惡意攻擊?