摘要:再經(jīng)過簡單的修飾就可以達(dá)到上面的效果了。記得剛?cè)肭岸说臅r候就是采取的這種方式,效果實(shí)現(xiàn)就好。
原文地址,排版效果更好
https://blog.codelabo.cn/article/5ce4f0eb8aab210ff34d0150
https://xboxyan.codelabo.cn/post/css-tree-padding/
在平時的項目中會經(jīng)常碰到這樣一種布局,暫且稱之為多級菜單吧
(截圖來自于ant-design)
這類布局也很容易,大概就是這樣ul和li嵌套,如下
于是就得到下面一個很原始的樣式。
再經(jīng)過簡單的修飾就可以達(dá)到上面的效果了。
當(dāng)然,這個很容易,一般情況下我們是通過設(shè)置內(nèi)邊距來完成的,比如默認(rèn)為
ul{ padding-left:40px; }
然后每一層級跟隨父級逐步累積,然后就實(shí)現(xiàn)了,層級越深,距離左邊的縮進(jìn)越多的效果。
多級菜單選中范圍通過上面的布局和樣式,很顯然每一項的選擇范圍都是逐步縮進(jìn)的,
但是,可能設(shè)計師覺得不好看,往往會設(shè)計成通欄的形式,比如像上面ant-design的設(shè)計
那么,該如何處理呢?
通欄的處理方式首先,一個很自然的思路就是去除ul的padding,改為每一個子項分別指定padding
ul.parent{ padding: 0; }
然后將內(nèi)邊距直接寫在html上,如下
如果菜單層級較多,我們通常使用js來輔助生成,注意每一次循環(huán)來指定不同的內(nèi)邊距就可以了
ant-design也是采取這種方式,可以自行打開控制臺去查看。
記得剛?cè)肭岸说臅r候就是采取的這種方式,效果實(shí)現(xiàn)就好。
不過,在現(xiàn)在看來,在html中使用內(nèi)聯(lián)樣式始終不雅,而且數(shù)量較多時還需要和js扯上關(guān)系,能否優(yōu)化一下呢
下面列舉兩種css方式
1.子選擇器我們可以在上面的基礎(chǔ)上,分別控制每一級的內(nèi)邊距,這里我們可以使用子選擇器>
ul.parent>li>div{/**第一級**/ padding-left: 40px; } ul.parent>li>ul>li>div{/**第二級**/ padding-left: 80px; } ul.parent>li>ul>li>ul>li>div{/**第三級**/ padding-left: 120px; } /** ... **/
通常,在層級不是特別多的情況下,我們可以一一羅列出來,只需用選擇器ul>li疊加即可,是不是比style方便維護(hù)了很多呢?
2.absolute半依賴定位在講這個方法之前,首先搞清楚一個問題
absolute在不設(shè)置方向?qū)傩?b>left,top,right,bottom時,默認(rèn)位置是哪里?
在我的學(xué)習(xí)過程中,很多地方講到的都是說absolute是絕對定位,是相對于第一個有定位屬性的父級的,所以基本上都是和relative一起使用,反正不管三七二十一,直接就給父級加上position:relative,有一個可靠的父級,看著比較靠譜,不是嗎?
其實(shí),當(dāng)元素設(shè)置了absolute屬性,沒有方向?qū)傩詴r,元素仍保留在原來位置,只是不占空間而已
比如,我給上面每一項后面加一個角標(biāo)
ul.parent div:after{ content:"new"; font-size: 10px; position:absolute; margin-top: -5px; color: red }
可以看到,雖然設(shè)置了absolute屬性,但元素仍保留在原來位置,一旦設(shè)置了left等方位屬性,就會查找第一個有定位屬性的父級。
現(xiàn)在,我們把css還原為默認(rèn)的狀態(tài),也就是
ul{ padding-left:40px; }
現(xiàn)在情況就和初始狀態(tài)一致,選中范圍逐層遞減,那么,如何實(shí)現(xiàn)選中范圍為通欄呢
我們可以給最外層父級設(shè)置position:relative,因為通欄的寬度是相對于最外層的,然后給選中元素設(shè)置
ul.parent div:hover:before{ content:""; position:absolute; left:0; right:0; height:21px; background: violet; z-index: -1; }
這里只設(shè)置了水平方向的left和right,沒有設(shè)置垂直方向上的屬性,所以水平位置會跟隨父級定位元素(這里是最外層),而垂直方向位置還是基于當(dāng)前父級(這里是父級li元素)
注意,這里的高度由于是基于最外層元素,所以,這里不能設(shè)置height:100%,那么,如何解決這一個小瑕疵呢,畢竟在這里寫一個固定高度實(shí)在不怎么合適。
這里有兩種方式來優(yōu)化。
方式一上面的方式如果不指定高度,由于沒有內(nèi)容,高度自然為0,解決方式也很簡單,在content插入一個空字符或者透明字符即可
ul.parent div:hover:before{ content:"A0"; }
或者
ul.parent div:hover:before{ content:"任意字符"; color:transparent; }方式二
通常子項目的高度都是固定的,可以給子項目手動指定一個高度,然后選中項繼承該高度即可
ul.parent div{ height:24px; line-height:24px; } ul.parent div:hover:before{ content:""; height:inherit }
注意這里的height:inherit是繼承直接父級的高度,有興趣的可以看張鑫旭的這篇文章
這樣也實(shí)現(xiàn)了通欄的效果
https://codepen.io/xboxyan/pe...
小節(jié)上面介紹了兩種實(shí)現(xiàn)通欄的方法,相比而言,absolute效果更好,也易于維護(hù),可能一個并不怎么起眼的屬性,有時候也能發(fā)揮出意想不到的效果。
下面有一個案例,純css實(shí)現(xiàn),可以查看一下
https://codepen.io/xboxyan/pe...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/114689.html
摘要:概覽盒模型也叫框模型,規(guī)定了元素框處理元素內(nèi)容內(nèi)邊距邊框和外邊距的方式。不幸的是,和在使用自己的非標(biāo)準(zhǔn)模型。當(dāng)一個元素出現(xiàn)在另一個元素上面時,第一個元素的下外邊距與第二個元素的上外邊距會發(fā)生合并。如果缺少右外邊距的值,則使用上外邊距的值。 概覽 CSS 盒模型 (Box Model)也叫框模型,規(guī)定了元素框處理元素 內(nèi)容、 內(nèi)邊距、 邊框 和 外邊距 的方式。 showImg(http...
摘要:當(dāng)兩個及以上外邊距折疊,合并后的外邊距寬度是發(fā)生折疊的外邊距中的最大寬度。如果該元素的外邊距同其父元素的上外邊距折疊,則該盒的上邊框邊緣同其父元盒的上邊框邊緣相同。 2017-07-20: 關(guān)于外邊距折疊, 推薦問題: https://segmentfault.com/q/10... 8 盒模型 Box Model URL: http://www.w3.org/TR/CSS2/box...
摘要:父元素沒有上邊框為子元素設(shè)置上外邊距時在中嵌套一個子元素設(shè)置其尺寸為,并設(shè)置其背景顏色設(shè)置的上外邊距為觀察其結(jié)果。 前端知識點(diǎn)總結(jié)——CSS 1.CSS的概述 1.什么是CSS? CSS:Cascading Style Sheets層疊樣式表,級聯(lián)樣式表(簡稱:樣式表) 2.作用 設(shè)置HTML網(wǎng)頁元素的樣式 3.HTML與CSS的關(guān)系 HTML:負(fù)責(zé)內(nèi)容的展示 CSS:負(fù)責(zé)內(nèi)容(元素)...
摘要:屬性是中最重要的用于控制布局的屬性。布局的高度多數(shù)情況下,布局中結(jié)構(gòu)化元素乃至任何元素的高度是不必設(shè)定的。更新效果如圖以上措施使布局有了明顯改觀。 這是《CSS設(shè)計指南》的讀書筆記,用于加深學(xué)習(xí)效果。 display 屬性 display是 CSS 中最重要的用于控制布局的屬性。每個元素都有一個默認(rèn)的 display 值。對于大多數(shù)元素它們的默認(rèn)值通常是 block 或 inline ...
摘要:屬性是中最重要的用于控制布局的屬性。布局的高度多數(shù)情況下,布局中結(jié)構(gòu)化元素乃至任何元素的高度是不必設(shè)定的。更新效果如圖以上措施使布局有了明顯改觀。 這是《CSS設(shè)計指南》的讀書筆記,用于加深學(xué)習(xí)效果。 display 屬性 display是 CSS 中最重要的用于控制布局的屬性。每個元素都有一個默認(rèn)的 display 值。對于大多數(shù)元素它們的默認(rèn)值通常是 block 或 inline ...
閱讀 1784·2023-04-25 14:33
閱讀 3385·2021-11-22 15:22
閱讀 2182·2021-09-30 09:48
閱讀 2691·2021-09-14 18:01
閱讀 1746·2019-08-30 15:55
閱讀 3009·2019-08-30 15:53
閱讀 2145·2019-08-30 15:44
閱讀 653·2019-08-30 10:58