CSS設(shè)計(jì)之頁(yè)面滾動(dòng)條出現(xiàn)時(shí)防止頁(yè)面跳動(dòng)的方法
一、水平居中布局與滾動(dòng)條跳動(dòng)的千年難題
當(dāng)前web屆,絕大多數(shù)的頁(yè)面間布局都是水平居中布局,主體定個(gè)寬度,然后margin: 0 auto的節(jié)奏~
例如,大淘寶的首頁(yè):
然而,這種布局有一個(gè)存在一個(gè)影響用戶體驗(yàn)的隱患。應(yīng)該都知道,現(xiàn)代瀏覽器滾動(dòng)條默認(rèn)是overflow:auto類(lèi)型的,也就是如果尺寸不足一屏,沒(méi)有滾動(dòng)條;超出,出現(xiàn)滾動(dòng)條。于是,問(wèn)題來(lái)了:
信息流頁(yè)面,如新浪微博,是從上往下push渲染的。開(kāi)始只有頭部一些信息加載,此時(shí)頁(yè)面高度有限,沒(méi)有滾動(dòng)條;然后,更多內(nèi)容顯示,滾動(dòng)條出現(xiàn),占據(jù)可用寬度,margin: 0 auto主體元素自然會(huì)做偏移——跳動(dòng)產(chǎn)生。
JS交互,本來(lái)默認(rèn)頁(yè)面高度不足一屏,結(jié)果點(diǎn)擊了個(gè)“加載更多”,內(nèi)容超過(guò)一屏,滾動(dòng)條出現(xiàn),頁(yè)面主體就會(huì)左側(cè)跳動(dòng)。
結(jié)構(gòu)類(lèi)似幾個(gè)頁(yè)面通過(guò)頭部的水平導(dǎo)航刷新切換,結(jié)果有的頁(yè)面有滾動(dòng)條,有的沒(méi)有。造成的結(jié)果就是,導(dǎo)航尼瑪怎么跳來(lái)跳去!
當(dāng)前優(yōu)化這種體驗(yàn)問(wèn)題,一般有兩種解決方法:
高度尺寸不確定的,例如,新浪微博,使用:
- body { overflow-y: scroll; }

高度確定的,例如淘寶網(wǎng)首頁(yè)。使用CSS把頁(yè)面尺寸布局骨架搭好,再在里面吐數(shù)據(jù)。于是,要么沒(méi)有滾動(dòng)條,要么滾動(dòng)條直接出現(xiàn)。不會(huì)出現(xiàn)跳動(dòng)。
然而,然而,后面的策略只適合一些特殊的定制性很強(qiáng)的頁(yè)面。你說(shuō)像知乎這樣子,高度隨內(nèi)容而定的頁(yè)面,顯然就無(wú)法駕馭;而第1種方法overflow-y: scroll,在頁(yè)面高度較小的時(shí)候,依然會(huì)保留一個(gè)丑陋的灰色的滾動(dòng)欄,這其實(shí)又回到了IE當(dāng)?shù)赖呐f社會(huì)時(shí)代?,F(xiàn)代瀏覽器做的那些默認(rèn)視覺(jué)優(yōu)化豈不是白費(fèi)了,想想就好痛心。
二、CSS3計(jì)算calc和vw單位巧妙實(shí)現(xiàn)滾動(dòng)條出現(xiàn)頁(yè)面不跳動(dòng)
很簡(jiǎn)單,只要一行代碼就搞定了:
- .wrap-outer {
- margin-left: calc(100vw - 100%);
- }
或者:
- .wrap-outer {
- padding-left: calc(100vw - 100%);
- }
然后就可以慶祝放鞭炮啦??!
首先,.wrap-outer指的是居中定寬主體的父級(jí),如果沒(méi)有,創(chuàng)建一個(gè)(使用主體也是可以實(shí)現(xiàn)類(lèi)似效果,不過(guò)本著寬度分離原則,不推薦);
然后,calc是CSS3中的計(jì)算,IE10+瀏覽器支持,IE9瀏覽器基本支持(不能用在background-position上);
最后,100vw相對(duì)于瀏覽器的window.innerWidth,是瀏覽器的內(nèi)部寬度,注意,滾動(dòng)條寬度也計(jì)算在內(nèi)!而100%是可用寬度,是不含滾動(dòng)條的寬度。
于是,calc(100vw - 100%)就是瀏覽器滾動(dòng)條的寬度大小(如果有,如果沒(méi)有滾動(dòng)條則是0)!左右都有一個(gè)滾動(dòng)條寬度(或都是0)被占用,主體內(nèi)容就可以永遠(yuǎn)居中瀏覽器啦,從而沒(méi)有任何跳動(dòng)!
您可以狠狠地點(diǎn)擊這里(IE10+):頁(yè)面出現(xiàn)滾動(dòng)條的時(shí)候沒(méi)有跳動(dòng)demo
demo頁(yè)面中,標(biāo)題和下面的妹子都是居中效果。其中,妹子做了本文所述的“滾動(dòng)無(wú)跳動(dòng)”處理,而標(biāo)題沒(méi)有,結(jié)果,你會(huì)發(fā)現(xiàn),滾動(dòng)條出現(xiàn)與否會(huì)讓標(biāo)題文字跳動(dòng),但是,妹子卻女神般巋然不動(dòng):
兼容性
支持:IE9+以及其他現(xiàn)代瀏覽器。
窄屏幕寬度下的處理
上面CSS還是有一點(diǎn)瑕疵的,瀏覽器寬度比較小的時(shí)候,左側(cè)留的白明顯與右邊多,說(shuō)不定會(huì)顯得有點(diǎn)傻。此時(shí),可能需要做點(diǎn)響應(yīng)式處理會(huì)更好一點(diǎn):
- @media screen and (min-width: 1150px) {
- .wrap-outer {
- margin-left: calc(100vw - 100%);
- }
- }
相關(guān)文章
css將div層固定顯示在頁(yè)面底部不隨滾動(dòng)條滾動(dòng)
將div層固定顯示在頁(yè)面底部,在某些情況下還是很實(shí)用的,在本文為大家介紹下使用css是如何實(shí)現(xiàn)的,需要的碰可以參考下2013-11-20
這篇文章主要介紹了CSS頁(yè)面去除滾動(dòng)條詳細(xì)步驟,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-25


