重學(xué)CSS(11)—— overflow屬性詳解,利用CSS實(shí)現(xiàn)錨點(diǎn)定位

1.overflow的裁剪界線——border-box

overflow屬性用于指定塊容器元素的內(nèi)容溢出時(shí)的表現(xiàn)方式——滾動(dòng),裁剪,自適應(yīng)?!癇FC的最佳結(jié)界”只是其衍生出來(lái)的特性,“裁剪”才是其本職工作。在使用overflow做裁剪工作的時(shí)候需要注意裁剪的邊界時(shí)border box的內(nèi)邊緣,來(lái)看下面的例子。

<div style="width: 200px;height: 200px;overflow: hidden;border: 10px solid #ccc;padding: 20px">
    <img src="../小和尚.jpg">
</div>

裁切部分的留白似乎不是很符合我們的預(yù)期,如果想要實(shí)現(xiàn)元素裁切同時(shí)四周留白的話,可以利用透明邊框,此時(shí)padding屬性時(shí)無(wú)能為力的!

2.overflow與滾動(dòng)條

HTML中有兩個(gè)標(biāo)簽是默認(rèn)可以產(chǎn)生滾動(dòng)條的,一個(gè)是跟元素html,還有一個(gè)是文本標(biāo)簽textarea,只有這兩個(gè)標(biāo)簽的默認(rèn)overflow是auto屬性,其他都是visible。關(guān)于瀏覽器的滾動(dòng)條,有以下兩個(gè)結(jié)論:

(1)在PC端,無(wú)論什么瀏覽器,默認(rèn)滾動(dòng)條均來(lái)自html,而不是body,這點(diǎn)可以由瀏覽器下body的默認(rèn)margin不為零,但當(dāng)內(nèi)容高度超過(guò)100%的時(shí)候,滾動(dòng)條離瀏覽器不會(huì)有間隙(body的默認(rèn)margin)可以得出結(jié)論。上述結(jié)論只針對(duì)PC端有效!

(2)在PC端,滾動(dòng)條出現(xiàn)就一定會(huì)占用容器的可用寬度/高度,也就是你本來(lái)布局非常準(zhǔn)確的200像素寬度,在加入右側(cè)滾動(dòng)條后,可能會(huì)導(dǎo)致子元素的像素計(jì)算出現(xiàn)偏差,由于父容器的右側(cè)擠入了一個(gè)不速之客——滾動(dòng)條。因此在考慮PC端帶滾動(dòng)條布局的時(shí)候,可以減少子元素的實(shí)際可用寬度,通常情況下,瀏覽器滾動(dòng)條所占的寬度是17px(并不是絕對(duì)的),因此可以考慮子元素在右側(cè)留白>17px。注意本條定律也僅針對(duì)PC端有效,由于移動(dòng)端的屏幕分辨率本來(lái)就低,因此滾動(dòng)條一般以懸浮的方式出現(xiàn),并不會(huì)占用實(shí)際寬度。

(3)既然滾動(dòng)條在CSS布局中有如此重要的地位,因此其樣式也是可以自定義的,在chrome瀏覽器中的屬性如下:

  • 整體部分,::-webkit-scrollbar;

  • 兩端按鈕,::-webkit-scrollbar-button;

  • 外層軌道,::-webkit-scrollbar-track;

  • 內(nèi)層軌道,::-webkit-scrollbar-track-piece;

  • 滾動(dòng)滑塊,::-webkit-scrollbar-thumb;

  • 邊角部分,::-webkit-scrollbar-corner;

overflow除了和滾動(dòng)條是PY關(guān)系,還有一些衍生屬性也要依賴overflow,如單行文字超出部分省略號(hào)顯示,就需要用到overflow:hidden的聲明。代碼如下

<style>
.overText{
    white-space:nowrap;
    text-overflow:ellipsis;
    overflow:hidden;
}
</style>

3.overflow與錨點(diǎn)定位

什么是錨點(diǎn)定位?通俗點(diǎn)的解釋就是讓頁(yè)面定位到某個(gè)位置的點(diǎn)。在高度較高的頁(yè)面中,通常我們會(huì)通過(guò)側(cè)邊導(dǎo)航欄定位到文章的某一段內(nèi)容中去,如bilibili的側(cè)邊導(dǎo)航欄即可實(shí)現(xiàn)這個(gè)功能。要實(shí)現(xiàn)錨點(diǎn)定位,很多人都知道可以通過(guò)Js通過(guò)調(diào)整scrollTop實(shí)現(xiàn),但新手很少會(huì)知道CSS本身就已經(jīng)提供了這個(gè)功能(包括我)。這跟網(wǎng)上教程中很少涉及"CSS錨點(diǎn)定位"功能實(shí)現(xiàn)有關(guān),通常情況下,我們看到的都是"JS錨點(diǎn)定位"功能的講解。下面來(lái)看看如何用CSS實(shí)現(xiàn)錨點(diǎn)定位。CSS規(guī)定觸發(fā)錨點(diǎn)定位行為發(fā)生的條件有兩種:

(1)URL地址中的錨鏈與錨點(diǎn)元素對(duì)應(yīng)并有交互行為

(2)可focus的錨點(diǎn)元素處于focus狀態(tài)

URL的觸發(fā)條件比較容易,最常用的a標(biāo)簽即可幫助我們實(shí)現(xiàn)錨點(diǎn)定位功能。如下代碼:

<a href="#1">我要定位到和1綁定的元素</a>
<div id="1">我是要被定位的元素</div>

此時(shí)我們點(diǎn)擊a標(biāo)簽,便會(huì)觸發(fā)URL的哈希值改變,然后頁(yè)面會(huì)根據(jù)實(shí)際情況讓id為1的div元素定位在瀏覽器窗體的上邊緣(如果需要的話,div元素本身就在頁(yè)面的第一行就沒(méi)必要定位了)

可focus的錨點(diǎn)元素處于focus狀態(tài)不是本章要討論的重點(diǎn),這里只舉一個(gè)簡(jiǎn)單的鏈子,在PC端,我們使用Tab鍵可以快速定位可focus的元素,如果下一個(gè)focus元素位于屏幕外,那么瀏覽器就會(huì)自動(dòng)重新定位,將這個(gè)屏幕外的元素定位到屏幕之中。

雖然兩者都是錨點(diǎn)定位,但是這兩種方式的表現(xiàn)行為還是有差異的,"URL錨點(diǎn)定位"實(shí)讓元素定位在瀏覽器窗體的上邊緣,而"focus錨點(diǎn)定位"是讓元素在瀏覽器窗體范圍顯示即可,不一定是在上邊緣(這個(gè)你自己一試便知,如CSDN的編輯器就有許多focus元素,把滾動(dòng)條拖到最上方,按下Tab鍵就可以看到效果了~)

錨點(diǎn)定位行為發(fā)生的本質(zhì)是通過(guò)改變?nèi)萜鳚L動(dòng)高度/寬度來(lái)實(shí)現(xiàn)的,除了html,錨點(diǎn)定位功能還可以在任何overflow不為visible的元素中實(shí)現(xiàn),這句話中可以拆分成兩個(gè)條件。

條件(1):錨點(diǎn)定位行為可以在任何元素中發(fā)生,不只是html,還可以是普通的div元素

條件(2):只要是overflow不為visible的元素都可以錨點(diǎn)定位,包括overflow:hidden!

第二個(gè)條件說(shuō)明,錨點(diǎn)定位功能和有沒(méi)有滾動(dòng)條時(shí)也能實(shí)現(xiàn),后面我們會(huì)借助這個(gè)條件用CSS實(shí)現(xiàn)一個(gè)選項(xiàng)卡功能。干巴巴的說(shuō)了許多,還沒(méi)確認(rèn)過(guò)功能,下面我們就來(lái)簡(jiǎn)單驗(yàn)證一下CSS自帶的錨點(diǎn)定位功能。

<!-- CSS錨點(diǎn)定位 -->
<a href="#1">1</a>
<a href="#2">2</a>
<a href="#3">3</a>
<a href="#4">4</a>
<a href="#5">5</a>
<a href="#6">6</a>
<a href="#7">7</a>
<a href="#8">8</a>
<a href="#9">9</a>
<a href="#10">10</a>
<a href="#">回到頂部</a>

<div style="overflow:auto;height: 300px; width: 300px;">
    <div id="1" class="li">1</div>
    <div id="2" class="li">2</div>
    <div id="3" class="li">3</div>
    <div id="4" class="li">4</div>
    <div id="5" class="li">5</div>
    <div id="6" class="li">6</div>
    <div id="7" class="li">7</div>
    <div id="8" class="li">8</div>
    <div id="9" class="li">9</div>
    <div id="10" class="li">10</div>
</div>

<style type="text/css">
.li{
    width: 200px;
    height: 200px;
    margin-bottom: 20px;
    background: yellow;
    display: inline-block;
}
</style>

上面的例子證明了錨點(diǎn)定位也可以發(fā)生在普通元素中,同時(shí)我們還需要知道一個(gè)概念,就是錨點(diǎn)定位是可以同時(shí)發(fā)生在嵌套元素中的,且發(fā)生的順序是“由內(nèi)而外的”,如普通元素和窗體可以同時(shí)滾動(dòng)的時(shí)候,就會(huì)由內(nèi)而外觸發(fā)所有可以滾動(dòng)的窗體的錨點(diǎn)定位功能。

上面只是錨點(diǎn)定位功能的簡(jiǎn)單測(cè)試,同時(shí)他也符合“錨點(diǎn)定位功能是滾動(dòng)條的表現(xiàn)形式”的正常預(yù)期。然而本小節(jié)的核心內(nèi)容是:overflow:hidden的元素也是可以實(shí)現(xiàn)錨點(diǎn)定位的,當(dāng)元素聲明了overflow后,里面內(nèi)容高度溢出的時(shí)候,滾動(dòng)永遠(yuǎn)存在,滾動(dòng)條可有可無(wú),下面我們就將上面例子中的overflow:auto改為overflow:hidden,看看是否符合這個(gè)理論。


結(jié)果跟理論相同,overflow:hidden的元素也可以實(shí)現(xiàn)錨點(diǎn)定位功能。(關(guān)于CSS的錨點(diǎn)定位,我個(gè)人求證了掘金右側(cè)的導(dǎo)航欄也是用的CSS錨點(diǎn)定位功能,感興趣的小伙伴可以自己看一下掘金自帶的錨點(diǎn)定位功能)

4.利用CSS實(shí)現(xiàn)選項(xiàng)卡效果

理論需要被用在實(shí)踐中才能發(fā)揮他的作用,下面我們就用overflow:hidden的錨點(diǎn)定位功能實(shí)現(xiàn)一個(gè)CSS選項(xiàng)卡效果。

<!-- CSS實(shí)現(xiàn)選項(xiàng)卡功能 -->
<div class="box">
    <div class="list" id="one">1</div>
    <div class="list" id="two">2</div>
    <div class="list" id="three">3</div>
    <div class="list" id="four">4</div>
</div>
<div class="link">
    <a class="click" href="#one">1</a>
    <a class="click" href="#two">2</a>
    <a class="click" href="#three">3</a>
    <a class="click" href="#four">4</a>
</div>
<style type="text/css">
.box {
    width: 20em;
    height: 10em;
    border: 1px solid #ddd;
    overflow: hidden;
}
.list {
    line-height: 10em;
    background: #ddd;
    text-align: center;
}
</style>

由于markdown編輯器支持標(biāo)簽語(yǔ)言,因此我們可以直接預(yù)覽最終效果如下(小提示:你可以直接點(diǎn)擊1,2,3,4看到效果,建議copy代碼到本地查看效果)

當(dāng)然這個(gè)方法也有其缺點(diǎn),就是需要固定高度,當(dāng)然這只是一個(gè)小缺點(diǎn),他還有個(gè)更麻煩的地方就是,錨點(diǎn)功能“由內(nèi)而外”的特性會(huì)使其觸發(fā)窗體外的重定位,也就是說(shuō)如果頁(yè)面也是可以滾動(dòng),那么點(diǎn)擊選項(xiàng)卡后頁(yè)面會(huì)發(fā)生跳動(dòng),這種體驗(yàn)顯然是“bug”級(jí)別的存在,因此這里只是介紹這種方法,在實(shí)際場(chǎng)景中,我更推薦使用第二種方法去實(shí)現(xiàn)CSS錨點(diǎn)定位功能。

還記得剛才提到的focus元素也可以觸發(fā)錨點(diǎn)定位的功能嘛?而且focus的特性就是只要元素在瀏覽器內(nèi),就不會(huì)觸發(fā)瀏覽器窗口的重新定位,這個(gè)屬性用在選項(xiàng)卡這兒,簡(jiǎn)直是太棒了。那么如何觸發(fā)元素的focus呢?原生的標(biāo)簽也可以觸發(fā)這個(gè)屬性,就是已經(jīng)快被我們遺忘的label標(biāo)簽可以完美觸發(fā)input的focus,知道了這些理論后我們就可以實(shí)現(xiàn)一個(gè)完美的CSS選項(xiàng)卡功能了。

<!-- CSS實(shí)現(xiàn)選項(xiàng)卡功能 -->
<div class="box">
    <div class="list"><input id="one">1</div>
    <div class="list"><input id="two">2</div>
    <div class="list"><input id="three">3</div>
    <div class="list"><input id="four">4</div>
</div>
<div class="link">
    <label class="click" for="one">1</label>
    <label class="click" for="two">2</label>
    <label class="click" for="three">3</label>
    <label class="click" for="four">4</label>
</div>
<style type="text/css">
.box {
    width: 20em;
    height: 10em;
    border: 1px solid #ddd;
    overflow: hidden;
}
.list {
    height: 100%;
    background: #ddd;
    text-align: center;
    position: relative;
}
.list > input { 
  position: absolute; top:0; 
  height: 100%; width: 1px;
  border:0; padding: 0; margin: 0;
  clip: rect(0 0 0 0);
}
</style>

overflow的講解到此就結(jié)束了,下一章我們繼續(xù)來(lái)探討CSS世界的流破壞與流保護(hù),之前講了float,下一章float的好PY position:absolute相關(guān)的內(nèi)容,感興趣的關(guān)注一下吧~

7ced86fae6cd7b89ad3345ee022442a7d8330e6e.jpg

最后,給大家推薦一個(gè)前端學(xué)習(xí)進(jìn)階內(nèi)推交流群685910553前端資料分享),不管你在地球哪個(gè)方位,
不管你參加工作幾年都?xì)g迎你的入駐!(群內(nèi)會(huì)定期免費(fèi)提供一些群主收藏的免費(fèi)學(xué)習(xí)書(shū)籍資料以及整理好的面試題和答案文檔?。?/p>

如果您對(duì)這個(gè)文章有任何異議,那么請(qǐng)?jiān)谖恼略u(píng)論處寫(xiě)上你的評(píng)論。

如果您覺(jué)得這個(gè)文章有意思,那么請(qǐng)分享并轉(zhuǎn)發(fā),或者也可以關(guān)注一下表示您對(duì)我們文章的認(rèn)可與鼓勵(lì)。

愿大家都能在編程這條路,越走越遠(yuǎn)。

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

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

  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 14,162評(píng)論 1 92
  • 第一回 overflow基本屬性 overflow基本屬性 visibel hidden scroll ...
    seepDown閱讀 765評(píng)論 0 2
  • float float 屬性指定一個(gè)元素應(yīng)沿其容器的左側(cè)或右側(cè)放置,允許文本和內(nèi)聯(lián)元素環(huán)繞它。該元素從網(wǎng)頁(yè)的正常流...
    Promise_4483閱讀 403評(píng)論 0 0
  • day01-_起源和結(jié)構(gòu) 結(jié)構(gòu):Xhtml xml 表現(xiàn):CSS 行為:DOM ECMAScript 以上都屬于W...
    Sakura_明妃閱讀 1,331評(píng)論 0 1
  • 每每被問(wèn)到“你在教學(xué)中最困擾的問(wèn)題是什么?”時(shí),我的第一反應(yīng)總是:如何與學(xué)生高效溝通。在過(guò)去一年的教學(xué)生...
    曾_ZJM閱讀 2,728評(píng)論 0 6

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