原生js+div+css,动态画结构图/流程图

前面用highchart尝试画了一次,但是因为种种因素,还是用js+div+css实现起来比较方便。

代码如下,可直接复制粘贴

html部分:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>动态绘制结构图</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        div.rect {
            height: 40px;
            border-radius: 10px;
            background: pink;
            text-align: center;
            padding: 5px;
            margin: 5px 5px;
        }

        div.rect:hover {
            cursor: pointer;
        }

        div.rect p {
            font-size: 14px;
            overflow: hidden;
            text-overflow: ellipsis;
            display: -webkit-box;
            -webkit-box-orient: vertical;
            -webkit-line-clamp: 2;
        }

        div.flex {
            display: flex;
            justify-content: center;
            flex-wrap: wrap
        }

        div.flex > div {
            width: 25%;
        }

        div.arrow {
            margin: 0 10px 0;
        }

        div.arrow-body {
            width: 20px;
            height: 50px;
            background: #ccc;
            margin: 0 auto;
        }

        div.arrow-footer {
            width: 0;
            height: 0;
            border-width: 30px 30px 0;
            border-style: solid;
            border-color: #ccc transparent transparent; /*灰 透明 透明 */
            margin: 0 auto;
        }

        #container {
            width: 650px;
            /*height: 450px;*/
            margin: 50px auto;
            /*padding-top: 10px;*/
            /*padding-right: 10px;*/
            /*overflow-y: auto*/
        }
    </style>
</head>
<body>
<div id="container"></div>
</body>
</html>

js部分:

<script>
    let data = {
        root: [
            {title: '根节点1', color: 'red'},
            {title: '根节点2', color: 'yellow'},
            {title: '根节点3', color: 'skyblue'},
        ],
        child: [
            {title: '节点', color: '#cca057'}
        ],
        child2: [
            {title: '子节点1'},
            {title: '子节点2阿诗阿范德萨士大夫士大夫实打实地方的所得税法的萨芬撒地方丹顿'},
            {title: '子节点3子节点3子节点3子节点3'},
            {title: '子节点4'},
            {title: '子节点5'},
            {title: '子节点6'},
            {title: '子节点7'},
            {title: '子节点8'}
        ]
    };

    let pic = {
        load(domName, datas) {
            let num = Object.keys(datas).length;
            Object.keys(datas).forEach((i, j) => {
                pic.rect('container', datas[i], (j + 1) === num);
            });
            this.bindEvents()
        },
        rect(domName, data, isEnd) {
            let div = document.createElement("div");
            div.classList.add("flex");
            for (let i in data) {
                div.innerHTML += '<div>\n' +
                    '            <div class="rect" style="background: ' + data[i].color + '" data="' + data[i].title + '" p-data="' + data.root + '">\n' +
                    '                <p>' + data[i].title + '</p>\n' +
                    '            </div>\n' +
                    '        </div>';
            }
            document.getElementById(domName).appendChild(div);
            if (!isEnd) {
                let arrow = document.createElement("div");
                arrow.classList.add("arrow");
                arrow.innerHTML +=
                    '        <div class="arrow-body"></div>\n' +
                    '        <div class="arrow-footer"></div>\n';
                document.getElementById(domName).appendChild(arrow)
            }
        },
        bindEvents() {
            let rect = document.getElementsByClassName('rect');
            for (let i = 0, rule; rule = rect[i++];) {
                rule.addEventListener('click', () => {
                    let title = rule.getAttribute('data');
                    alert(title);
                });
            }
        }
    };

    window.onload = function () {
        pic.load('container', data);
    };
</script>

效果图:

总结:

想比highchart自由绘图,该种方案最省时省力省心。?

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值