精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

純 CSS 實現帶連接線的樹形組件

開發 前端
原生實現最大的好處就是靈活性,合理運用選擇器,各式各樣的設計都能輕易實現,組件庫可兼顧不了這么多。另外,兼容性方面也非常不錯,主流瀏覽器均支持,IE 上雖然不支持 details 和 summary,但是通過 polyfill[7] 解決,總的來說非常實用的,大可以放心使用。

之前在這篇文章(CSS 實現樹狀結構目錄[1])中實現了一個樹狀結構,效果是這樣的

圖片圖片

整個實現沒有用到任何 JavaScript,非常巧妙,有興趣可以回顧一下。

不過有時候還需要那種帶連接線的樣式,這樣看起來層級會更清晰,就像這樣

圖片圖片

這是如何實現的呢?一起來看看吧~

一、details 和 summary

簡單回顧一下,整體結構需要利用到 details[2] 和 summary[3],天然地支持內容展開和收起。這里有一個 MDN 的例子

<details>
  <summary>System Requirements</summary>
  <p>Requires a computer running an operating system. The computer
  must have some memory and ideally some kind of long-term storage.
  An input device as well as some form of output device is
  recommended.</p>
</details>

直接就實現了展開和收起

圖片圖片

還可以支持多層嵌套,只需要將details當做展開的內容就行了,如下

<details>
  <summary>項目1</summary>
  <details>
    <summary>文件夾0</summary>
  </details>
  <details>
    <summary>文件夾1-1</summary>
    <details>
      <summary>文件夾1-1-2</summary>
    </details>
    <details>
      <summary>文件夾1-1-3</summary>
      ...
  </details>
</details>

這樣就得到了一個簡單的樹狀結構

圖片圖片

看著還不像?那是因為現在還沒有縮進,可以這樣

details{
  padding-left: 10px
}

簡單調整一下間距后得到這樣的效果,是不是要清晰很多?

圖片圖片

image-20230629161203001

二、繪制加號和減號

首先,默認的黑色三角太丑了,需要去掉。現代瀏覽器中,這個“黑色三角”其實是 ::marker生成的,而這個 ::marker是通過list-style生成,所以要去除就很簡單了

舊版本瀏覽器需要通過專門的偽元素修改,::-webkit-details-marker和::-moz-list-bullet ,現在都統一成了list-style

summary{
  list-style: none;
}

當然,也可以改變summary的display屬性(默認是list-item)

summary{
  display: flex;
}

這樣,默認的三角就去除了

圖片圖片

然后,繪制加號(?)和減號(?),由于還有外圍一個正方形邊框,我們可以用偽元素來繪制(當然,這是在可以使用的情況下),好處是可以直接用border畫邊框,這比用漸變方便的多,然后加號就是兩段線性漸變,如下

圖片圖片

用代碼實現就是

summary::before{
    content: '';
    width: 14px;
    height: 14px;
    flex-shrink: 0;
    margin-right: 8px;
    border: 1px solid #999;
    background: linear-gradient(#999, #999) 50%/1px 10px no-repeat,linear-gradient(#999, #999)  50%/10px 1px no-repeat;
}

調整一下間距,效果如下

圖片

現在都是加號(?),看不出哪些是展開的,所以還需要繪制減號(?),可以用[open]屬性來判斷,相較于加號(?)而言,只需要一個線性漸變就行了,實現如下

details[open]>summary::before{
    background: linear-gradient(#999, #999) 50%/10px 1px no-repeat;
}

現在就可以區分哪些是展開,哪些是折疊的了

圖片

到了這一步,其實還有一個小問題,有些是不能繼續展開的,因為已經到了最底層,沒有內容了,所以希望在沒有展開內容的時候不顯示加號(?)或者減號(?),這應該如何判斷呢?

其實很簡單,在沒有展開內容的情況下,其實只有summary單個標簽,就像這種結構

<details>
  <summary>文件</summary>
  <!--沒有內容了-->
</details>

提到單個標簽,可以想到:only-child偽類,所以可以這樣重置一下

summary:only-child::before{
  display: none
}

還有另外一種做法,那就是借助:not偽類,直接在前面的選擇器上加一層判斷

summary:not(:only-child)::before{
    /*排除單個summary的情況*/
}

這樣會更加優雅~效果如下

圖片圖片

這樣就能輕易的看出哪些是不能展開的了

三、繪制連接線

最后就是繪制連接線,也是 CSS 最靈活的、最有趣的一部分。

先從繪制實線開始,這樣比較容易。

直接繪制可能有些難度,我們可以分解開來,一部分是垂直的,指向樹的每個標題部分,所以直接繪制在summary上,還有一部分是豎直的,并且豎直部分會包含整個展開部分,因此可以把線條繪制在details上,用代碼實現如下(為了區分,下面把垂直部分用紅色表示)

summary{
  /*水平線*/
  background: linear-gradient(#999,#999) 0px 50%/20px 1px no-repeat;
}
details{
  /*垂直線*/
  background: linear-gradient(#999, #999) 40px 0px/1px 100% no-repeat;
}

效果如下

圖片圖片

看著好像有些凌亂?確實有很多線是多余的,比如樹的最后一個節點,垂直線段不應該繼續向下延伸了,最左側的線也是多余的,下面是示意圖,我們其實想要右邊那樣的效果

圖片圖片

image-20230629195757152

首先是最左側的線段,其實就是最外層,也就是第一層,要去除很簡單,直接選中第一層的details以及下面的summary就行了,這里可以用子選擇器>來實現

.tree>details,
.tree>details>summary{
  /*去除最外層的連接線*/
  background: none
}

效果如下

圖片

然后就是每層的最后一個子節點,如何將垂直線段去除呢?其實可以從HTML結構上入手,最后一層,其實就是最后一個details,所以將最后一個的背景尺寸改為剛好和垂直線段吻合

details:last-child{
  background-size: 1px 23px;
}

為了區分,下面將這一部分用藍色表示

圖片

還有一個小優化,現在最左側第一層都是分開的,看著有些零散,這是因為前面這一步將所有最后一層的垂直線段都去掉了,所以需要還原這種情況,可以用子選擇器>選到,如下

.tree>details:not(:last-child)>details:last-child{
   background-size: 1px 100%;
}

為了區分,下面將這一部分用紫色表示

圖片圖片

實線畫出來了,虛線還遠嗎?

同樣也可以用漸變實現,只不過需要用repeating-linear-gradient,因為虛線其實是不斷重復的從實色到透明的漸變,示意如下

圖片圖片

用代碼實現就是

summary{
  /*水平虛線*/
  background: repeating-linear-gradient( 90deg, #999 0 1px,transparent 0px 2px) 0px 50%/20px 1px no-repeat;
}
details{
  /*垂直虛線*/
  background: repeating-linear-gradient( #999 0 1px,transparent 0px 2px) 40px 0px/1px 100% no-repeat;
}

這樣就實現了文章開頭效果了

圖片圖片

下面是完整CSS代碼(真的不多了)

.tree summary{
    outline: 0;
    padding-left: 30px;
    list-style: none;
    background: repeating-linear-gradient( 90deg, #999 0 1px,transparent 0px 2px) 0px 50%/20px 1px no-repeat;
    /* background: linear-gradient(#999,#999) 0px 50%/20px 1px no-repeat; */
}
.tree details:last-child{
    background-size: 1px 23px;
}
.tree>details:not(:last-child)>details:last-child{
    background-size: 1px 100%;
}
.tree details{
    padding-left: 40px;
    background: repeating-linear-gradient( #999 0 1px,transparent 0px 2px) 40px 0px/1px 100% no-repeat;
    /* background: linear-gradient(#999, #999) 40px 0px/1px 100% no-repeat; */
}
.tree>details{
    background: none;
    padding-left: 0;
}
.tree>details>summary{
    background: none
}
.tree summary{
    display: flex;
    align-items: center;
    height: 46px;
    font-size: 15px;
    line-height: 22px;
    color: rgba(0, 0, 0, 0.85);
    cursor: default;
}
.tree summary::after{
    content: '';
    position: absolute;
    left: 10px;
    right: 10px;
    height: 38px;
    background: #EEF2FF;
    border-radius: 8px;
    z-index: -1;
    opacity: 0;
    transition: .2s;
}
.tree summary:hover::after{
    opacity: 1;
}
.tree summary:not(:only-child)::before{
    content: '';
    width: 14px;
    height: 14px;
    flex-shrink: 0;
    margin-right: 8px;
    border: 1px solid #999;
    background: linear-gradient(#999, #999) 50%/1px 10px no-repeat,linear-gradient(#999, #999)  50%/10px 1px no-repeat;
}
.tree details[open]>summary::before{
    background: linear-gradient(#999, #999) 50%/10px 1px no-repeat;
}

你也可以查看以下任意鏈接:

  • CSS tree with line (juejin.cn)[4]
  • CSS tree with line (codepen.io)[5]
  • CSS tree with line (runjs.work)[6]

四、總結一下

以上就是本文的全部內容了,可以看到全部由 CSS 繪制而成,沒有用到任何圖片,是不是很簡單呢?下面總結一下實現要點

  1. details 和 summary 原生支持展開收起
  2. details 和 summary 支持多層嵌套,這樣就得到了簡易的樹狀結構
  3. 逐層縮進可以通過給 details 添加內邊距實現
  4. summary 的黑色三角形是通過 list-style 生成的,可以更改 display 屬性去除
  5. 利用偽元素可以輕易實現 border 邊框,這比用漸變方便的多
  6. 加號其實是兩段線性漸變疊加而成,減號一段漸變就夠了
  7. 連接線可以分成兩段,垂直線段繪制在 details 上,水平線段繪制在 summary 上
  8. 多余的線段可以通過 :last-child和子選擇器>去除
  9. 虛線其實是不斷重復的從實色到透明的漸變,可以用repeating-linear-gradient繪制

相比于現有的組件庫,原生實現最大的好處就是靈活性,合理運用選擇器,各式各樣的設計都能輕易實現,組件庫可兼顧不了這么多。另外,兼容性方面也非常不錯,主流瀏覽器均支持,IE 上雖然不支持 details 和 summary,但是通過 polyfill[7] 解決,總的來說非常實用的,大可以放心使用。

責任編輯:武曉燕 來源: 前端偵探
相關推薦

2009-11-16 14:28:14

思科路由器

2024-08-29 08:13:58

2021-10-19 22:23:47

CSSBeautiful按鈕

2021-01-19 12:16:10

CSS前端UI

2024-09-18 09:18:11

2017-04-27 14:05:59

CSS動畫前端

2022-02-21 07:02:16

CSSbeautiful按鈕

2022-08-10 16:08:38

鴻蒙CSS

2013-04-08 14:07:28

CSS

2020-11-04 13:55:06

CSS密室逃脫前端

2021-01-25 06:37:06

Css前端CSS 特效

2022-08-29 17:39:53

應用開發css動畫

2024-07-31 20:38:18

2024-09-02 00:03:00

tabs組件CSS

2025-03-26 01:35:00

tabs開發組件

2015-04-24 10:05:15

HTML+CSS阿童木頭像

2024-05-09 00:00:00

CSS標簽JavaScript

2023-10-08 20:32:59

CSS定義Loading

2022-09-15 10:30:06

CSS

2022-08-04 06:57:54

CSS拼圖游戲
點贊
收藏

51CTO技術棧公眾號

免费看黄色aaaaaa 片| 8x拔播拔播x8国产精品| 天天干天天av| 在线观看wwwxxxx| 不卡av免费在线观看| 日韩av不卡电影| 在线成人www免费观看视频| 夜夜嗨av一区二区三区网页| 国产精品一区二区欧美| 精品无码一区二区三区的天堂| 色男人天堂综合再现| 精品久久久久久久久久久久久久久| 精品毛片三在线观看| yy111111少妇影院日韩夜片| 日韩大片免费在线观看| 成人在线免费小视频| 精品国免费一区二区三区| 欧美日韩在线免费播放| 天天摸日日摸狠狠添| 人人九九精品| 奇米精品一区二区三区四区| 欧美激情视频网址| 日本高清www| 精品一区二区三区中文字幕视频| 欧美日韩人人澡狠狠躁视频| 欧美一区二区三区在线| 免费观看美女裸体网站| 国产网站在线免费观看| 国产欧美一区二区精品性| 国产精品二区三区| 国产农村老头老太视频| 七七婷婷婷婷精品国产| 欧美在线免费观看| 久久精品国产亚洲AV无码男同| 成人羞羞视频播放网站| 亚洲欧美中文日韩在线v日本| 国产精品果冻传媒| 日本免费精品| 91精品国产综合久久久久| 午夜激情在线观看视频| 在线观看涩涩| 精品国产老师黑色丝袜高跟鞋| 成人短视频在线观看免费| 黄色av电影在线观看| 国产精品伦理在线| 日韩免费毛片| 国产资源在线观看| 91蜜桃免费观看视频| 极品日韩久久| 亚洲日本中文字幕在线| 99久久免费视频.com| 国产精品一区视频| a天堂视频在线| 国产一区视频在线看| 91欧美精品成人综合在线观看| 在线免费a视频| 蜜臀av一级做a爰片久久| 国产高清在线不卡| 国产精品国产精品国产| 男女性色大片免费观看一区二区| 国产精品草莓在线免费观看| 波多野结衣一区二区在线| 日韩国产欧美在线观看| 国产精品免费一区| 在线免费观看一级片| 精品一区二区免费看| 成人做爽爽免费视频| 国产免费叼嘿网站免费| 国产91露脸合集magnet| 国产成人精品日本亚洲11 | 色婷婷av一区二区三区gif| 欧美v在线观看| 最新欧美电影| 欧美精品久久久久久久多人混战| 91 视频免费观看| 一本一道久久a久久| 亚洲国产精品专区久久| 性少妇bbw张开| 日韩精品久久| 久久99久久久久久久噜噜| 成年人免费看毛片| 日韩国产精品久久| 亚洲精品免费在线视频| 午夜视频福利在线| 欧美高清在线视频| 欧美黄色免费网址| 亚洲日本天堂| 欧美浪妇xxxx高跟鞋交| 亚洲av无码一区东京热久久| 国产精品一在线观看| 久久九九热免费视频| 日本少妇全体裸体洗澡| 国产农村妇女毛片精品久久莱园子| 国产精品嫩草视频| 粉嫩小泬无遮挡久久久久久| 国产亚洲va综合人人澡精品| 特色特色大片在线| 国产免费不卡| 欧美一区二区三区免费| 成人免费网站黄| 亚洲破处大片| 日韩免费在线视频| 亚洲精品成人电影| 中文字幕 久热精品 视频在线| 精品视频在线观看一区二区| 成人看片网页| 亚洲成成品网站| 在线日韩国产网站| 香蕉久久久久久久av网站| 亚洲一区二区在线播放| 成人精品一区二区三区校园激情| 一区二区三区成人| 亚洲免费av一区二区三区| 给我免费播放日韩视频| 久久香蕉频线观| 精人妻无码一区二区三区| 成人国产精品免费观看| 成人毛片100部免费看| 国产经典一区| 亚洲美女久久久| 九九热国产视频| 国产成人精品1024| 中文字幕在线亚洲三区| 日韩在线短视频| 日韩国产精品一区| 国产无遮挡裸体免费视频| 激情av综合网| 亚洲午夜精品一区二区| 我爱我色成人网| 亚洲精品小视频| 自拍偷拍欧美亚洲| 成人美女视频在线观看| www.18av.com| 国产精品高清一区二区| 日韩性生活视频| 中文字幕视频免费观看| 国产视频不卡一区| 国内外免费激情视频| 亚洲激情77| 日韩女优在线播放| 久久久久久久影视| 日本高清不卡一区| 亚洲精品国产一区黑色丝袜| 久久久777| 日本欧美精品久久久| 成人欧美大片| 亚洲天堂av在线免费观看| 无码视频在线观看| 久久久国际精品| 亚洲三级视频网站| 国产精品精品国产一区二区| 91精品国产综合久久香蕉最新版| 五月婷婷在线视频| 欧美军同video69gay| 中文字幕在线观看2018| 国产一区久久久| 伊人再见免费在线观看高清版| 国产精品一区二区精品| 欧美黑人极品猛少妇色xxxxx| 成人无码一区二区三区| 午夜精品福利视频网站| 不卡一区二区在线观看| 日韩精品视频网| 艳色歌舞团一区二区三区| 亚洲免费资源| 欧美激情极品视频| 欧美日韩国产亚洲沙发| 欧美在线影院一区二区| 老熟妻内射精品一区| 成人一道本在线| 国产福利一区视频| 国产精品久久占久久| 成人午夜电影免费在线观看| 蜜桃在线视频| www.日本久久久久com.| 国产 日韩 欧美 综合| 欧美天天综合色影久久精品| 欧美人妻一区二区三区 | 91传媒理伦片在线观看| 国产女优一区| 成年人免费观看的视频| 国产美女撒尿一区二区| 国产精品精品久久久| 91高清在线观看视频| 亚洲精品在线视频| 国产欧美综合视频| 狠狠躁夜夜躁久久躁别揉| 久久久久99精品成人| 丁香婷婷综合色啪| 美女网站免费观看视频| 欧美日本一区| 青娱乐国产91| 51亚洲精品| 国产精品高潮呻吟久久av无限| a视频在线观看| 亚洲欧美国产精品久久久久久久 | 国产精品久久久久久久久免费高清| 欧美另类第一页| 国产在线视频资源| 精品国产第一区二区三区观看体验 | 视频二区在线播放| 亚洲成人中文| 在线观看成人av电影| 希岛爱理av免费一区二区| 成人福利在线视频| 成人动漫一区| 国精产品一区一区三区有限在线| av大片在线播放| 日韩经典中文字幕| 亚洲va天堂va欧美ⅴa在线| 欧美亚洲高清一区二区三区不卡| 久热精品在线观看| 中文字幕在线不卡| 亚洲一区二区三区日韩| 99国内精品久久| 久久发布国产伦子伦精品| 免费在线一区观看| 国产精品亚洲αv天堂无码| 国产精品啊啊啊| 欧美一级黄色录像片| 成人激情电影在线| 欧美成人第一区| 激情亚洲另类图片区小说区| 91青青草免费在线看| 四虎在线精品| 国产精品久久久久久影视| 中老年在线免费视频| 国内精品在线一区| 欧洲性视频在线播放| 蜜臀久久99精品久久久无需会员 | 国产综合久久久久久| 日本在线中文字幕一区二区三区| 7m第一福利500精品视频| 91高清视频在线观看| 欧美激情欧美激情| 日韩免费影院| 欧美大片免费观看在线观看网站推荐| 黄色网址免费在线观看| 中文字幕一区电影| 69久久久久| 日韩在线免费av| 素人av在线| 日韩一区二区三区国产| 色哟哟免费在线观看| 最近2019中文字幕mv免费看| 婷婷成人激情| 美女国内精品自产拍在线播放| 免费在线观看av| 中文字幕精品一区久久久久 | 欧美**字幕| 蜜桃日韩视频| 波多野结衣在线观看一区二区三区| 日韩电影免费观看高清完整| 欧美午夜精品一区二区三区电影| 日韩欧美99| 91精品国产91久久久久久密臀 | 日韩电影在线一区二区三区| 欧美日韩在线成人| 麻豆中文一区二区| 天堂av.com| 成人免费看的视频| 黄色短视频在线观看| 久久精品免视看| 日本免费网站视频| 亚洲精品福利视频网站| 久久久久久久国产视频| 午夜精品久久久久久久久久久| 国产一级精品视频| 在线日韩一区二区| 国产乱码精品一区二三区蜜臂| 日韩一区二区三区四区五区六区| 国产18精品乱码免费看| 亚洲人成网7777777国产| 在线日本中文字幕| 欧美激情一二区| 色尼玛亚洲综合影院| 91精品久久久久久久久| 国产精品香蕉| 日韩国产伦理| 欧美一区免费| 欧美日韩大尺度| 国产精品影视网| wwwwww日本| 亚洲免费看黄网站| 亚洲影院在线播放| 91精品国产综合久久久蜜臀粉嫩 | www.性欧美| 国产精品久久久视频| 亚洲一区二区三区四区在线观看| 久久精品国产成人av| 在线播放国产精品二区一二区四区| 国内爆初菊对白视频| 中文在线不卡视频| 国产99在线观看| 成人免费观看a| 亚洲丁香日韩| 久久久久久久久久伊人| 日本在线不卡视频一二三区| 少妇献身老头系列| 国产精品网站在线观看| 亚洲黄色三级视频| 69成人精品免费视频| 男人天堂网在线观看| 欧美人成在线视频| 欧美成人app| 久久av一区二区三区漫画| 一本精品一区二区三区| 毛葺葺老太做受视频| 99久精品国产| 欧美精品色哟哟| 在线一区二区三区四区| 日韩性xxxx| 欧美精品在线第一页| 国产精品伦一区二区| 国产在线精品一区二区三区| 91精品福利| 特级丰满少妇一级| 久久亚洲春色中文字幕久久久| 青娱乐av在线| 91精品免费观看| 日本不卡视频| 国产精品吴梦梦| 欧洲乱码伦视频免费| 少妇无码av无码专区在线观看| 国产高清不卡一区| 日韩三级久久久| 欧美日韩高清在线播放| 国产三级视频在线| 欧美夜福利tv在线| 天堂资源在线亚洲| 国产午夜伦鲁鲁| www.性欧美| 成人精品免费在线观看| 亚洲激情久久久| 92久久精品| 好吊色欧美一区二区三区 | 国产aaaaa毛片| 欧美国产日本韩| 性高潮视频在线观看| 一区二区三区动漫| 成人看片网页| 亚洲一区二三| 久久国产成人午夜av影院| youjizz亚洲女人| 欧美日韩高清一区二区不卡| 色综合久久久久综合一本到桃花网| 国产精品视频色| 99国产精品一区二区| www激情五月| 亚洲一区二区视频在线观看| 亚洲AV无码精品国产| 久久久视频精品| 青青视频一区二区| 日本女优爱爱视频| 国产精品久久久久影视| 99久久精品日本一区二区免费| 欧美精品情趣视频| 第四色中文综合网| 国产免费观看高清视频| 久久色在线观看| 中文字幕乱码视频| 欧美成人黄色小视频| 激情小说一区| 黄色国产小视频| 中文字幕欧美一| 高h震动喷水双性1v1| 日本91av在线播放| 久久看人人摘| 国产精品熟妇一区二区三区四区| 欧美日韩国产丝袜另类| 成年网站在线| 91视频在线免费观看| 国产欧美精品| 久久免费手机视频| 欧美大片日本大片免费观看| 成人bbav| 中文字幕在线中文字幕日亚韩一区| 国产91精品一区二区麻豆亚洲| 特级做a爱片免费69| 日韩天堂在线视频| 牲欧美videos精品| 国产乱码一区二区三区四区| 亚洲成人1区2区| av在线播放av| 成人一区二区在线| 日韩经典中文字幕一区| 男人的天堂久久久| 亚洲男人天堂2019| 欧美区一区二区| 999在线免费视频| 亚洲午夜在线观看视频在线| 国产黄在线看| 成人黄动漫网站免费| 日韩成人精品在线| 国产精品美女毛片真酒店| 中文字幕在线观看亚洲| 欧美变态网站| 亚洲制服在线观看| 日本韩国精品在线| av在线网页|