HTMLCSS中的树形结构图

news2025/1/11 3:00:45

我们可以只使用 html 和 css 创建树视图(可折叠列表) ,而不需要 JavaScript。可访问性软件将看到树形视图作为列表嵌套在披露窗口小部件中,并且自动支持标准键盘交互。

 1、HTML

我们就从简单嵌套列表的 html 开始:

<ul>
  <li>
    Giant planets
    <ul>
      <li>
        Gas giants
        <ul>
          <li>Jupiter</li>
          <li>Saturn</li>
        </ul>
      </li>
      <li>
        Ice giants
        <ul>
          <li>Uranus</li>
          <li>Neptune</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

       然后,我们向最外层的 < ul > 元素添加一个类,对于每个包含嵌套列表的列表项,我们将列表项的内容放在 < Details > 和 < Summary > 元素中,使用 open 属性来控制最初展开哪些嵌套列表:

<ul class="tree">
  <li>
    <details open>
      <summary>Giant planets</summary>
      <ul>
        <li>
          <details>
            <summary>Gas giants</summary>
            <ul>
              <li>Jupiter</li>
              <li>Saturn</li>
            </ul>
          </details>
        </li>
        <li>
          <details>
            <summary>Ice giants</summary>
            <ul>
              <li>Uranus</li>
              <li>Neptune</li>
            </ul>
          </details>
        </li>
      </ul>
    </details>
  </li>
</ul>

没有任何样式,这个 html 生成:

浏览器将 < Details > 元素实现为一个披露窗口小部件,使其能够展开和折叠嵌套列表,但是项目符号和披露箭头的组合会产生一个令人困惑的用户界面。 

2、自定义属性:

       有两个维度影响树视图的布局: 行间距(等于文本的行高)和标记的半径。我们首先为这些维度创建 CSS 自定义属性:

.tree{
  --spacing : 1.5rem;
  --radius  : 10px;
}

       虽然我们通常使用相对单位来缩放基于文本大小的用户界面控件,但对于标记,这可能导致控件过小或过大,所以我们使用一个合理的固定大小。

3、padding

       然后我们设计列表项和嵌套列表的样式,为行和标记腾出空间:

.tree li{
  display      : block;
  position     : relative;
  padding-left : calc(2 * var(--spacing) - var(--radius) - 2px);
}

.tree ul{
  margin-left  : calc(var(--radius) - var(--spacing));
  padding-left : 0;
}

        第7行从列表项中删除项目符号点。第8行建立了一个新的堆叠上下文和包含块,我们将使用它来定位行和标记。

       第9行缩进列表项。缩进等于两倍的间距,减去标记半径,减去两个像素的行宽。其结果是,列表项中的文本将与其下方的标记的左侧对齐。

       第13行使用负边距来补偿第9行引入的缩进,确保嵌套列表只按所需的间距缩进。第14行删除浏览器应用于列表的默认填充。

在最初展开所有嵌套列表的树视图中,应用此样式生成:

4、垂直线属性 

接下来,我们添加构成连接每个列表项标记的线的一部分的垂直线到其嵌套列表的标记:

.tree ul li{
  border-left : 2px solid #ddd;
}

.tree ul li:last-child{
  border-color : transparent;
}

       我们使用一个边框来创建这条线,并将其隐藏在每个列表中的最后一个项目中,因为这条线不应该继续超过这个项目的标记。使边框透明,而不是完全删除它,避免了增加填充以进行补偿的需要。

应用这种风格生成:

5、水平线

 我们使用生成的内容来添加将垂直线连接到每个列表项的标记的水平线:

.tree ul li::before {
            content: '';
            display: block;
            position: absolute;
            top: calc(var(--spacing) / -2);
            left: -2px;
            width: calc(var(--spacing) + 2px);
            height: calc(var(--spacing) + 1px);
            border: solid #ddd;
            border-width: 0 0 2px 2px;
        }

       这段代码还创建了短的垂直线,因为之前创建的垂直线不会一直延伸到顶部和底部的标记。

       第26行和第27行生成一个块,第28行到第30行将其定位为从前一行文本的中点开始,与左侧的垂直线重叠。

       第31和32行设置块的大小。它需要比间距宽两个像素,因为它与左侧的垂直线重叠,并且比间距高一个像素,因为水平线宽度的一半位于文本行的中点以下。注意,我们假设使用边框大小,因此这些尺寸包括边框。

      第33和34行在块的左边和底边创建一个边框。

应用这种风格生成:

总结:

接下来,我们从摘要中删除默认样式:

.tree summary {
            display: block;
            cursor: pointer;
        }

        .tree summary::marker,
        .tree summary::-webkit-details-marker {
            display: none;
        }

        .tree summary:focus {
            outline: none;
        }

        .tree summary:focus-visible {
            outline: 1px dotted #000;
        }

        第38行和第44行删除了公开箭头。Safari 需要第44行,第42行和第43行的两个选择器覆盖了不同版本的浏览器。第39行更改光标以指示可以单击摘要以与其交互。

       Safari 在摘要周围显示了一个焦点指示器,即使是在使用指针而不是键盘导航的情况下,所以我们移除了第48行的焦点样式,然后使用 :focus-visible 伪类将其添加回来,供访问者使用第52行的键盘导航。

应用这种风格生成:

6、标识

 我们再次使用生成的内容来创建标记:

        .tree li::after,
        .tree summary::before {
            content: '';
            display: block;
            position: absolute;
            top: calc(var(--spacing) / 2 - var(--radius));
            left: calc(var(--spacing) - var(--radius) - 1px);
            width: calc(2 * var(--radius));
            height: calc(2 * var(--radius));
            border-radius: 50%;
            background: #ddd;
        }

       注意,我们同时为 < li > 元素(不包含嵌套列表的列表项)和 < 摘要元素生成标记,允许包含嵌套列表的列表项具有不同的标记样式,具体取决于嵌套列表是展开的还是折叠的。

       第57行和第58行生成一个块,第59行到第61行将其置于水平线和垂直线交汇处的中心。顶部位于文本行的中点,减去半径。左边定位在垂直线的边缘,减去半径,减去对应于线宽一半的一个像素。

第62和63行设置块的大小,第64和65行将其设置为圆形。

应用这种风格生成:

 7、展开和折叠按钮

最后,我们添加了展开和折叠按钮:

       .tree summary::before {
            content: '+';
            z-index: 1;
            background: #696;
            color: #fff;
            line-height: calc(2 * var(--radius) - 2px);
            text-align: center;
        }

        .tree details[open]>summary::before {
            content: '−';
        }

       第69行和第78行显示了按钮中的加号与减号。请注意,我们使用真正的减号(-)而不是连字符(-) ,因为这与加号的外观相匹配,而在大多数字体中,连字符越窄越小。

       第70行使按钮显示在前面创建的标记之上。因为标记是使用: : 创建的,否则它将显示在按钮的顶部。

应用此样式生成完成的树视图:

8、这是完成的代码 

将以上所有内容结合起来,就得到了最终的代码:

CSS

    <style>
        .tree {
            --spacing: 1.5rem;
            --radius: 10px;
        }

        .tree li {
            display: block;
            position: relative;
            padding-left: calc(2 * var(--spacing) - var(--radius) - 2px);
        }

        .tree ul {
            margin-left: calc(var(--radius) - var(--spacing));
            padding-left: 0;
        }

        .tree ul li {
            border-left: 2px solid #ddd;
        }

        .tree ul li:last-child {
            border-color: transparent;
        }

        .tree ul li::before {
            content: '';
            display: block;
            position: absolute;
            top: calc(var(--spacing) / -2);
            left: -2px;
            width: calc(var(--spacing) + 2px);
            height: calc(var(--spacing) + 1px);
            border: solid #ddd;
            border-width: 0 0 2px 2px;
        }

        .tree summary {
            display: block;
            cursor: pointer;
        }

        .tree summary::marker,
        .tree summary::-webkit-details-marker {
            display: none;
        }

        .tree summary:focus {
            outline: none;
        }

        .tree summary:focus-visible {
            outline: 1px dotted #000;
        }

        .tree li::after,
        .tree summary::before {
            content: '';
            display: block;
            position: absolute;
            top: calc(var(--spacing) / 2 - var(--radius));
            left: calc(var(--spacing) - var(--radius) - 1px);
            width: calc(2 * var(--radius));
            height: calc(2 * var(--radius));
            border-radius: 50%;
            background: #ddd;
        }

        .tree summary::before {
            content: '+';
            z-index: 1;
            background: #696;
            color: #fff;
            line-height: calc(2 * var(--radius) - 2px);
            text-align: center;
        }

        .tree details[open]>summary::before {
            content: '−';
        }
    </style>

HTML

<body>
    <ul class="tree">
        <li>
            <details open>
                <summary>Giant planets</summary>
                <ul>
                    <li>
                        <details>
                            <summary>Gas giants</summary>
                            <ul>
                                <li>Jupiter</li>
                                <li>Saturn</li>
                            </ul>
                        </details>
                    </li>
                    <li>
                        <details>
                            <summary>Ice giants</summary>
                            <ul>
                                <li>Uranus</li>
                                <li>Neptune</li>
                            </ul>
                        </details>
                    </li>
                </ul>
            </details>
        </li>
    </ul>
</body>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/582495.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

五个有用的微信公众号运营技巧!

微信公众号是一个非常有用的网络工具&#xff0c;可以让个人或组织与其关注者建立起联系。随着人们使用微信的增加&#xff0c;许多公司和组织都使用微信公众号来扩大其业务范围和提高其品牌形象。在本文中&#xff0c;我将分享一些关于如何运营一个成功的微信公众号的建议。 一…

入门性能测试(一)

一、JDK的下载和安装 1、jdk安装 官网位置&#xff1a;https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 2、安装JDK 建议&#xff1a;安装路径&#xff0c;不要有汉字目录&#xff0c;不要有空格目录&#xff0c;不要有x86目录 3、配置环境变量…

附下载 | 354个数据开发利用机构名单来了

数字中国建设正在驶入发展快车道。2023年2月&#xff0c;中共中央、国务院印发的《数字中国建设整体布局规划》提出&#xff0c;到2025年&#xff0c;基本形成横向打通、纵向贯通、协调有力的一体化推进格局&#xff0c;数字中国建设取得重要进展。到2035年&#xff0c;数字化发…

一个未初始化的局部变量引起的BUG(二)-PC13引脚异常

现象&#xff1a; STM32F030C8中PC13引脚异常&#xff0c;配置为GPIO输出&#xff0c;有时编译后出现异常&#xff0c;表现如下&#xff1a; 1、不能输出高电平。 2、烧回原来正确的版本固件&#xff0c;也不能输出高电。 3、过一段时间后&#xff0c;能恢复。 4、同样的代码&…

征文 | CSDN创作纪念日

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 征文 | CSDN创作纪念日 机缘 CSDN专业的IT社区&#xff0c;致力于为IT从业人员提供最新、最全面的技术资讯、最专业的技术交流平台。作为一个IT从业者&#xff0c;我最…

DG4Pros结合M3D,1:500地籍免像控实践详解

前言 免像控技术正在迈向成熟&#xff0c;逐渐从理论走向了实际应用。本期&#xff0c;我们详细讨论DG4 Pros相机配合北京中测智绘科技有限公司的Mirauge 3D软件在1:500地籍精度的免像控作业中的可行性及具体项目流程。 DG4 Pros倾斜摄影相机 实验背景 无人机航空摄影测量是…

Facebook群组营销:建立社群,促进互动与品牌增长

除了常见的Facebook广告和页面推广&#xff0c;Facebook群组也成为了一种强大的营销工具。本文将探讨Facebook群组营销的潜力以及如何建立社群、促进互动并实现品牌增长。 1.Facebook群组&#xff1a;一个强大的社群平台 理解Facebook群组的概念&#xff1a;Facebook群组是一个…

【数据分析之道-Matplotlib(五)】Matplotlib柱状图

文章目录 专栏导读1、matplotlib柱状图基本语法1.1bar()函数绘制垂直柱状图基本语法1.2barh()函数绘制垂直柱状图基本语法 2、使用 bar() 来创建一个简单的柱形图3、垂直方向的柱形图可以使用 barh() 方法来设置4、设置柱形图颜色4.1使用单个颜色值4.2使用颜色列表 5、设置柱形…

【Unity】 HTFramework框架(四十四)【进阶篇】指令系统

更新日期&#xff1a;2023年5月29日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 指令系统简单使用定义InstructionAgent编辑指令代码执行指令代码 指令代码语法基本语法指令关键字注释支持的值类型标识符命名规范 进阶使用运行时检视面…

【MySQL】MySQL的事务原理和实现?

文章目录 MySQL事务的底层实现原理一、事务的目的可靠性和并发处理 二、实现事务功能的三个技术2.1 redo log 与 undo log介绍2.1.1 redo log2.1.2undo log 2.2 mysql锁技术2.2.1 mysql锁技术 2.3 MVCC基础 三、事务的实现3.1 原子性的实现3.1.1 undo log 的生成3.1.2 根据undo…

机器视觉陶瓷板智能检测设备在工业质检中的应用

随着工业自动化的不断发展&#xff0c;机器视觉技术在质量控制领域中的应用越来越广泛。在陶瓷制品生产中&#xff0c;机器视觉技术可以帮助企业实现陶瓷板的智能检测&#xff0c;减少人工操作的错误率&#xff0c;提高生产效率和产品质量。本文将介绍机器视觉陶瓷板智能检测设…

4种不改变格式将PDF转Word文档的方法

Microsoft Word 使用户能够按照自己的喜好创建和编辑文档。当用户发现一些PDF资源有助于补充他们的文书工作时&#xff0c;他们可能希望将PDF插入到Word文档中&#xff0c;特别是插入多页PDF文件&#xff0c;以进行编辑或其他目的。将 PDF 插入 Word 文档非常容易&#xff0c;只…

视频剪辑必备,7免费个视频素材库,马住。

请收藏好这6个免费可商用的视频素材网站&#xff0c;以后再也不用为找素材而烦恼了&#xff0c;这些就够了&#xff01; 菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 可以称之为最大素材库&#xff0c;在这里你可以找到设计、办公、图片、视频、音频等各种素材。…

【科普】干货!带你从0了解移动机器人(三) ——自主导航系统及上位机软件设计与实现

随着机器人技术的不断发展&#xff0c;我们可以在许多简单重复&#xff0c;危险的岗位上看到机器人的身影&#xff0c;移动机器人凭借其在复杂环境下工作&#xff0c;具有自行感知、自行规划、自我决策功能的能力&#xff0c;它可以在不同的环境中移动并执行任务&#xff0c;在…

泉州银行:面向业务场景的赋能型数据中台

关 注gzh"大数据食铁兽"&#xff0c;了解更多银行大数据案例 案例简介 作为支持数字经济发展和高质量发展的一份子&#xff0c;数字化转型成为泉州银行当前的重要任务。为加强业务场景数据赋能&#xff0c;数据资产共享流通&#xff0c;我行以“数聚、数用、数智”为…

认识Servlet---2

hi,大家好,今天我们继续来认识Servlet 1.更方便的部署方式 2.访问出错的问题分析 3.Servlet的API之HttpServlet &#x1f368;&#x1f368;&#x1f368;&#x1f368; &#x1f36d;1.更方便的部署方式 在上一期的讲解中,我们已经完整的创建项目并且编写代码并且得到了验…

Linux之进程地址空间

文章目录 前言一、是什么1.例子2.感性的理解虚拟地址空间3.现象的具体解释4.写时拷贝 二、为什么三、怎么办总结 前言 内存区域划分&#xff1a; 在学习C/C时我们都有接触过内存区域划分这个概念&#xff0c;也知道它表示的是程序加载到内存中不同的数据所分布的不同的区域&a…

阿里云服务器数据盘是什么?系统盘和数据盘区别

阿里云服务器系统盘和数据盘有什么区别&#xff1f;系统盘类似Windows电脑的C盘&#xff0c;数据盘相当于其他盘符&#xff0c;数据盘可以有多个而系统盘只能有一个&#xff0c;数据盘可有可无而云服务器系统盘是必须要有的。阿里云服务器网来详细说下阿里云服务器数据盘和系统…

电子企业MES管理系统解决方案

随着信息技术的飞速发展&#xff0c;电子企业面临着日益复杂的数据管理、生产流程和业务决策等问题。如何应对这些问题并提高企业生产效率已成为电子企业的当务之急。本文旨在探讨电子企业MES管理系统的解决方案&#xff0c;以应对电子企业面临的挑战。 在制定电子企业MES管理…

苹果笔不用原装可以吗?推荐性价比最高的平替苹果笔

苹果Pencil的价格令人难以入手&#xff0c;单支就要接近千元&#xff0c;我实在想不通&#xff0c;这款电容笔怎么会以969元的价格出售&#xff1f;尽管苹果的Pencil性能非常不错&#xff0c;但是我认为它的价值还是不值这个价钱。当前国产的平板电容笔正不断完善中&#xff0c…