html 原生js手写树 仿照antd 样式

news2024/11/23 15:24:09

效果如图

在这里插入图片描述

<!doctype html>
<html>

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>

<body style="height:100%;width:100%;">
    <ul id="tree" class="tree"></ul>

    <script>
        var opensvg = '<span class="svg"><svg viewBox="64 64 896 896" data-icon="plus-square" width="1em" height="1em" fill="currentColor" aria-hidden="true" focusable="false" class=""><path d="M328 544h152v152c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V544h152c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H544V328c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v152H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z"></path><path d="M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"></path></svg></span>'
        var closesvg = '<span class="svg"><svg viewBox="64 64 896 896" data-icon="minus-square" width="1em" height="1em" fill="currentColor" aria-hidden="true" focusable="false" class=""><path d="M328 544h368c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z"></path><path d="M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"></path></svg></span>'
        var filesvg = '<svg viewBox="64 64 896 896" data-icon="file" width="1em" height="1em" fill="currentColor" aria-hidden="true" focusable="false" class=""><path d="M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216a42 42 0 0 0 42 42h216v494z"></path></svg>'
        // 递归函数生成树的节点
        function createNode(data) {
            var li = document.createElement("li");
            var div = document.createElement("div");
            div.classList.add("nodetree");
            if (data.children) {
                div.innerHTML = opensvg + '<span>' + data.name + '</span>';
            } else {
                div.innerHTML = filesvg + '<span>' + data.name + '</span>';
            }

            li.appendChild(div);
            if (data.children) {
                var ul = document.createElement("ul");
                for (var i = 0; i < data.children.length; i++) {
                    ul.appendChild(createNode(data.children[i]));
                }
                li.appendChild(ul);
            }
            return li;
        }

        // 生成树的节点并添加到树的容器中
        var treeData = [
            {
                name:'测试1',
                children:[
                    {
                        name:'测试1-1'
                    }
                ]
            },
            {
                name:'测试2',
                children:[
                    {
                        name:'测试2-1'
                    }
                ]
            }
        ]
        var tree = document.getElementById("tree");
        for (var i = 0; i < treeData.length; i++) {
            tree.appendChild(createNode(treeData[i]));
        }
        // 定义节点的样式和事件
        var nodes = document.querySelectorAll("#tree li");
        for (var i = 0; i < nodes.length; i++) {
            nodes[i].classList.add("node");
            nodes[i].addEventListener("click", function (e) {
                if (this.getAttribute('class').indexOf('open') > -1) {
                    this.querySelector(".nodetree .svg").innerHTML = opensvg;
                } else {
                    this.querySelector(".nodetree .svg").innerHTML = closesvg;
                }
                e.stopPropagation();
                this.classList.toggle("open");
            });
        }
    </script>
</body>
<style>
    .tree {
        display: inline-block;
        height: 24px;
        margin: 0;
        padding: 0 5px;
        color: rgba(0, 0, 0, .65);
        line-height: 24px;
        text-decoration: none;
        vertical-align: top;
        border-radius: 2px;
        cursor: pointer;
        transition: all .3s;
        font-size: 14px;
        font-variant: tabular-nums;
        font-feature-settings: "tnum";
    }

    .node {
        cursor: pointer;
    }

    .nodetree {
        display: flex;
        align-items: center;
    }

    .nodetree svg {
        margin-right: 5px;
        vertical-align: middle;
    }

    .node>ul {
        display: none;
    }

    .node.open>ul {
        display: block;
        margin: 0;
        padding: 0 0 0 18px;
    }

    ul>li {
        position: relative;
        margin: 0;
        padding: 4px 0;
        white-space: nowrap;
        list-style: none;
        outline: 0;
    }

    ul li:not(:last-child):before {
        position: absolute;
        left: 7px;
        width: 1px;
        height: 100%;
        height: calc(100% - 22px);
        margin: 22px 0 0;
        border-left: 1px solid #d9d9d9;
        content: " ";
    }
</style>

</html>

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

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

相关文章

百度Apollo视频学习笔记

APOLLO视频学习笔记 一、总览 无人驾驶车的运作方式 五个核心部件&#xff1a; 计算机视觉&#xff1a;弄清楚周围的世界是怎样的传感器融合&#xff1a; 合并来自其他传感器的数据&#xff0c;如激光和雷达&#xff0c;更加深入了了解我们周围的环境定位&#xff1a;精确地…

一级建造师执业资格考试--工程法规--速学36记--联想法

第一记&#xff1a;法的效力层级 第二记&#xff1a;法人的分类 【速记方法】口诀&#xff1a;赚钱营利和特别 关键词&#xff1a;营利、特别 【速记内容】 1、营利法人:以取得利润并分配给股东等出资人为目的成立的法人,为营利法人; 如有限责任公司、股份有限公司。经依法登记…

什么牌子电容笔性价比高?iPad触屏笔推荐

电容笔已经成为日常生活中不可或缺的一部分。它可以用于书写&#xff0c;绘画&#xff0c;甚至玩游戏。使用电容笔可以代替传统无纸化书写&#xff0c;提高工作效率。市面上有许多不同价格的电容笔品牌可供选择。本文将介绍四款性价比高的平替电容笔&#xff0c;有需要入手的小…

常用的三种拖拽方法(内置方法 + 接口 + Event Trigger组件)

前言 在Unity中实现拖拽的方法有多种&#xff0c;以下是几种常见的方法和它们的优缺点&#xff1a; Input.GetMouseButtonDown Input.GetMouseButtonDown 方法可以监测用户鼠标按键的点击事件&#xff0c;通过检测鼠标按钮的状态来实现拖拽效果。用户通过鼠标进行拖拽操作。…

Web基本概念

一、前言 World Wide Web的简称&#xff0c;是一个由许多互相链接的超文本组成的系统&#xff0c;通过互联网访问 &#xff08;为用户提供信息&#xff09; 静态网页 仅适用于不能经常更改内容的网页&#xff1b; 动态网页 网络编程技术创建的页面&#xff1b;通过在传统的静态…

MongoDB安装与使用

目录 一、MongoDB介绍与安装 什么是MongoDB 为什么要用MongoDB MongoDB下载 MongoDB安装完成 二、MongoDB Compass MongoDB Compass使用 三、使用mongoose连接数据库 使用MongoDB Compass 创建数据库 使用mongoose 连接数据库 每日一课&#xff1a;MongoDB 常用命令…

Vue项目打包dist目录介绍

如下 CSS目录&#xff1a; ① .css文件是项目要用到的css文件,当你做webpack打包的时候&#xff0c;会把所有的css样式打包到这里 ② .css.map文件是一个Source map文件&#xff0c;Source map就是一个信息文件&#xff0c;里面储存着位置信息。也就是说&#xff0c;转换后的代…

ChatGPT扩展系列之使用pandora本地搭建ChatGPT

ChatGPT扩展系列之使用pandora本地搭建ChatGPT 1. 为什么要本地搭建 主要解决使用上的几个痛点,我们可以看一下下面就是我们最常遇到的几个问题,这里我们重点提一下就是我们本地搭建好了之后,我们获取Access Token,这个Token的有效期长达14天,也就是这14天中,我们都不需…

【沐风老师】3DMAX径向对称插件使用方法应解

3DMAX径向对称插件使用教程 3DMAX径向对称插件&#xff0c;允许你对径向结构建模并查看最终结果。它的功能类似于3dMax自带的“对称”修改器&#xff0c;但它可以在三个轴的任意角度径向对象&#xff0c;这可以创造出很多我们意想不到的建模艺术效果&#xff0c;也可以理解它是…

【前端 - HTML】第 6 课 - 表单标签

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、表单标签 2.1、input 标签基本使用 2.2、input 标签占位文本 2.3、单选框 radio 2.4、上传文件 2.5、多选框 …

Vue.js中的动态组件和异步组件

Vue.js中的动态组件和异步组件 在Vue.js中&#xff0c;动态组件和异步组件是两个常用的技术&#xff0c;用于处理动态加载和渲染组件的需求。虽然它们都可以实现动态加载和渲染组件的功能&#xff0c;但它们的实现方式和使用方法有所不同。本文将详细介绍Vue.js中的动态组件和…

短视频账号矩阵系统技术开发难度之.框架底层逻辑

申请流程&#xff1a;注册官方开放平台账号----申请服务商-----关联应用----申请权限-----等待审核通过 接入开发------开发功能列表&#xff1a; 数据归纳箱&#xff08;账号数据对比概览内含视频总数、播放总数、点赞总数、分享总数、粉丝总数数据统计概览统计&#xff09;…

CMU15-445 2022 Fall 通关记录 —— Project 0

Project 0 Project #0 - C Primer | CMU 15-445/645 :: Intro to Database Systems (Fall 2022) — 项目 #0 - C 入门 | CMU 15-445/645 :: 数据库系统简介&#xff08;2022 年秋季&#xff09; 前期准备 为完成该项目做的一些准备&#xff1a; 创建个人项目FarewellYi/BusT…

【半监督医学图像分割 2023 CVPR】BCP

【半监督医学图像分割 2023 CVPR】BCP 论文题目&#xff1a;Bidirectional Copy-Paste for Semi-Supervised Medical Image Segmentation 中文题目&#xff1a;双向复制粘贴半监督医学图像分割 论文链接&#xff1a;https://arxiv.org/abs/2305.00673 论文代码&#xff1a;http…

EXCEL和VBA里的通配符和转义符

1 EXCEL里的通配符 1.1 EXCEL里常见通配符 通配符必须是英文半角的&#xff0c;中文输入下的不行&#xff01;* 可代表任意数量的字符&#xff1f; 可代表任一个的字符 1.2 使用举例 EXCEL的查找框&#xff0c;也可以使用 通配符只有部分内置函数可…

如何做架构设计?

也许您对软件设计存在一些疑惑&#xff0c;或者缺乏明确思路&#xff0c;那么本文将非常适合您。 1、设计很重要 我们可以看一下周边的事物&#xff0c;那些好的东西&#xff0c;他们并不会天然存在&#xff0c;都是被设计出来的&#xff0c;因此设计就是创造和改善事物的重要…

JavaSE03_流程控制语句

JavaSE-03 [流程控制语句] 第一章 流程控制 1.1 流程概述 在一个程序执行的过程中&#xff0c;每条语句的执行顺序对程序的结果是由直接影响的&#xff0c;也就是&#xff0c;语句的流程对运行结果有着直接的影响&#xff0c;所以&#xff0c;必须清楚知道每条语句的执行流程…

【Python】Python系列教程-- Python3 命名空间和作用域(二十九)

文章目录 前言作用域全局变量和局部变量global 和 nonlocal关键字 前言 往期回顾&#xff1a; Python系列教程–Python3介绍&#xff08;一&#xff09;Python系列教程–Python3 环境搭建&#xff08;二&#xff09;Python系列教程–Python3 VScode&#xff08;三&#xff09…

Vue.js 中的 v-bind 和 v-on 简写

Vue.js 中的 v-bind 和 v-on 简写 在 Vue.js 中&#xff0c;v-bind 和 v-on 是两个常用的指令&#xff0c;用于绑定属性和事件。在本文中&#xff0c;我们将介绍 v-bind 和 v-on 的简写形式&#xff0c;以及如何使用它们。 v-bind 简写形式 在 Vue.js 中&#xff0c;v-bind 用…

Java 进阶—死锁造成原因及其解决

今天我们来了解一下线程死锁&#xff0c;死锁很好理解&#xff0c;从字面上来看就是锁死了&#xff0c;解不开&#xff0c;在大街上看到一对卧龙凤雏的情侣&#xff0c;怎么说&#xff0c;你们给我锁死&#xff0c;不要分开去霍霍别人 之前我们不是说过&#xff0c;解决线程安…