纯 CSS 实现带连接线的树形组件

之前在这篇文章(CSS 实现树状结构目录[1])中实现了一个树状结构,效果是这样的,图片图片,整个实现没有用到任何 JavaScript,非常巧妙,有兴趣可以回顾一下。,不过有时候还需要那种带连接线的样式,这样看起来层级会更清晰,就像这样,图片图片,这是如何实现的呢?一起来看看吧~,简单回顾一下,整体结构需要利用到 details[2] 和 summary[3],天然地支持内容展开和收起。这里有一个 MDN 的例子,直接就实现了展开和收起,图片图片,还可以支持多层嵌套,只需要将details当做展开的内容就行了,如下,这样就得到了一个简单的树状结构,图片图片,看着还不像?那是因为现在还没有缩进,可以这样,简单调整一下间距后得到这样的效果,是不是要清晰很多?,图片图片,image-20230629161203001,首先,默认的黑色三角太丑了,需要去掉。现代浏览器中,这个“黑色三角”其实是 ::marker生成的,而这个 ::marker是通过list-style生成,所以要去除就很简单了,旧版本浏览器需要通过专门的伪元素修改,::-webkit-details-marker和::-moz-list-bullet ,现在都统一成了list-style,当然,也可以改变summary的display属性(默认是list-item),这样,默认的三角就去除了,图片图片,然后,绘制加号()和减号(),由于还有外围一个正方形边框,我们可以用伪元素来绘制(当然,这是在可以使用的情况下),好处是可以直接用border画边框,这比用渐变方便的多,然后加号就是两段线性渐变,如下,图片图片,用代码实现就是,调整一下间距,效果如下,图片,现在都是加号(),看不出哪些是展开的,所以还需要绘制减号(),可以用[open]属性来判断,相较于加号()而言,只需要一个线性渐变就行了,实现如下,现在就可以区分哪些是展开,哪些是折叠的了,图片,到了这一步,其实还有一个小问题,有些是不能继续展开的,因为已经到了最底层,没有内容了,所以希望在没有展开内容的时候不显示加号()或者减号(),这应该如何判断呢?,其实很简单,在没有展开内容的情况下,其实只有summary单个标签,就像这种结构,提到单个标签,可以想到:only-child伪类,所以可以这样重置一下,还有另外一种做法,那就是借助:not伪类,直接在前面的选择器上加一层判断,这样会更加优雅~效果如下,图片图片,这样就能轻易的看出哪些是不能展开的了,最后就是绘制连接线,也是 CSS 最灵活的、最有趣的一部分。,先从绘制实线开始,这样比较容易。,直接绘制可能有些难度,我们可以分解开来,一部分是垂直的,指向树的每个标题部分,所以直接绘制在summary上,还有一部分是竖直的,并且竖直部分会包含整个展开部分,因此可以把线条绘制在details上,用代码实现如下(为了区分,下面把垂直部分用红色表示),效果如下,图片图片,看着好像有些凌乱?确实有很多线是多余的,比如树的最后一个节点,垂直线段不应该继续向下延伸了,最左侧的线也是多余的,下面是示意图,我们其实想要右边那样的效果,图片图片,image-20230629195757152,首先是最左侧的线段,其实就是最外层,也就是第一层,要去除很简单,直接选中第一层的details以及下面的summary就行了,这里可以用子选择器>来实现,效果如下,图片,然后就是每层的最后一个子节点,如何将垂直线段去除呢?其实可以从HTML结构上入手,最后一层,其实就是最后一个details,所以将最后一个的背景尺寸改为刚好和垂直线段吻合,为了区分,下面将这一部分用蓝色表示,图片,还有一个小优化,现在最左侧第一层都是分开的,看着有些零散,这是因为前面这一步将所有最后一层的垂直线段都去掉了,所以需要还原这种情况,可以用子选择器>选到,如下,为了区分,下面将这一部分用紫色表示,图片图片,实线画出来了,虚线还远吗?,同样也可以用渐变实现,只不过需要用repeating-linear-gradient,因为虚线其实是不断重复的从实色到透明的渐变,示意如下,图片图片,用代码实现就是,这样就实现了文章开头效果了,图片图片,下面是完整CSS代码(真的不多了),你也可以查看以下任意链接:,以上就是本文的全部内容了,可以看到全部由 CSS 绘制而成,没有用到任何图片,是不是很简单呢?下面总结一下实现要点,相比于现有的组件库,原生实现最大的好处就是灵活性,合理运用选择器,各式各样的设计都能轻易实现,组件库可兼顾不了这么多。另外,兼容性方面也非常不错,主流浏览器均支持,IE 上虽然不支持 details 和 summary,但是通过 polyfill[7] 解决,总的来说非常实用的,大可以放心使用。

文章版权声明

 1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/28257.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年6月23日
下一篇 2023年7月15日