overflow之scroll 和 auto

CSS有個overflow,為了讓顯示不下的內(nèi)容滾動顯示,通常會加上:
overflow: scroll;/* 或者 */overflow: auto;

以前我天真地以為,他們的區(qū)別僅僅是,一個始終顯示滾動條(overflow: scroll
),一個按需顯示滾動條(overflow: auto
)。直到遇到了一個自適應(yīng)寬度同時(shí)自動顯示滾動條的場景,才發(fā)現(xiàn):
overflow: scroll
情況下,內(nèi)容自動撐開容器的寬度不包括滾動條,相當(dāng)于滾動條是一個和內(nèi)容并列顯示的組件。

overflow: scroll

而overflow: auto
情況下,內(nèi)容撐開容器的寬度包括滾動條,即使用whitespace: no-wrap;
撐開容器至正好顯示所有內(nèi)容時(shí),如果有滾動條,則滾動條會覆蓋在內(nèi)容上方,導(dǎo)致內(nèi)容寬度再次被縮小,然后出現(xiàn)省略號。由此推測渲染順序:自適應(yīng)寬度 → 根據(jù)高度顯示滾動條 → 重新計(jì)算內(nèi)部元素寬度

這里不會再次自適應(yīng),因此出現(xiàn)了內(nèi)容顯示不全的情況。

overflow: auto

總結(jié)一下就是,如果寬度是由內(nèi)容自適應(yīng)撐開的,則overflow: auto;
帶來的滾動條會占用內(nèi)容的一部分寬度,導(dǎo)致內(nèi)容顯示不全。
那么遇到這種情況,最直接的解決辦法就是,強(qiáng)制顯示滾動條,這也是我在StackOverflow上找到的回答。然而我并不想就這樣屈服,而且在Windows上多顯示個不必要的滾動條真的很丑,于是我又使用了一個不走尋常路的方法:
動態(tài)獲取滾動條的寬度:var scrollbarWidth = container.offsetWidth - container.clientWidth;// 如果沒有滾動條則為0// 否則為滾動條寬度

有滾動條的時(shí)候需要在內(nèi)容右側(cè)加個padding
。測試發(fā)現(xiàn),如果直接把padding加在內(nèi)容元素上,則內(nèi)容文字顯示全了,但是背景在右側(cè)空出了一塊。于是換個思路,用一個占位元素來撐開容器,然后再顯示真正想要的內(nèi)容。
占位元素怎么做?其實(shí)很簡單,就是把當(dāng)前容器復(fù)制一份,但是給它設(shè)置:overflow: hidden; height: 0;
,不受滾動條影響寬度,同時(shí)高度為0不可見,然后用JavaScript把第1步計(jì)算的滾動條寬度作為padding-right
加上去,這樣占位元素的寬度就是我們最后想要的容器寬度,可見部分的內(nèi)容再自適應(yīng)就完全沒有問題了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 14,095評論 1 92
  • 一、在什么場景下會出現(xiàn)外邊距合并?如何合并?如何不讓相鄰元素外邊距合并?給個父子外邊距合并的范例 在CSS當(dāng)中,相...
    dengpan閱讀 682評論 0 0
  • display: none; 與 visibility: hidden; 的區(qū)別 聯(lián)系:它們都能讓元素不可見 區(qū)別...
    紋小艾閱讀 1,982評論 0 1
  • 一天,一個穿黑色衣服的男人,帶著一個小黑皮包來到了一個平房前,等了些許時(shí)間,慢步走了進(jìn)去,一個中年男人一看到他來...
    似夢似霧閱讀 440評論 0 0
  • 我夢到過你 可是我不知道你 我們一起馳騁沙場 為了保護(hù)你 我替你擋了一劍 夢醒了 我不知道你是誰 我們一起去海...
    落小馬閱讀 480評論 0 1

友情鏈接更多精彩內(nèi)容