基于elementui带连接线的树形控件的样式修改

原本样式:

需求样式:

技术难点:

    1.tree树形控件修改小三角图标;

    2.每级标题前面增加icon图标;

    3.添加线。

解决方法:

    1.tree树形控件修改小三角图标

     直接在样式中修改就可以了

/deep/  .el-tree-node__expand-icon.expanded {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
}
/deep/  .el-tree-node__expand-icon.expanded {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
}
/* //有子节点 且未展开 */
/deep/ .el-icon-caret-right:before {
    content: url('/static/image/operationWell/目录树_默认.png');
    display: block;
    width: 20px;
    height: 20px;
    font-size: 16px;
    background-size: 16px;
}
/* //有子节点 且已展开 */
/deep/ .el-tree-node__expand-icon.expanded.el-icon-caret-right:before {
    content: url('/static/image/operationWell/目录树_展开.png');
    display: block;
    width: 20px;
    height: 20px;
    font-size: 16px;
    background-size: 16px;
}
/* //没有子节点 */
/deep/ .el-tree-node__expand-icon.is-leaf::before {
    background: #fff;
    content: '';
    display: block;
    width: 0px;
    height: 0px;
    font-size: 16px;
    background-size: 16px;
}
/* //高亮字体颜色 */
/deep/ .el-tree-node.is-current > .el-tree-node__content {
    color: #409eff !important;
}

2.每级标题前面增加icon图标

找了很多的资料,最后找到一个比较简单的方法,但是有一个bug我也没有解决就是叶子结点的图标无法变成无实体icon图标,只能改成那种实体icon图标

<el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick" class="tree-line" default-expand-all :expand-on-click-node="false" :indent="0">
    <span slot-scope="{ node, data }" class="slot-t-node">
        <template>
            <i :class="{
                'el-icon-folder': !node.expanded,       // 节点收缩时的图标
                'el-icon-folder-opened': node.expanded, // 节点展开时的图标
                'el-icon-s-management': data.type === 2   // data.type是后端配合提供的识别字段,最后一级
            }" 
            style="color:#606266"
            />
            <span>{{ node.label }}</span>
        </template>
    </span>
</el-tree>

children: [{
    id: 4,
    label: '二级 1-1',
    children: [{
        id: 9,
        label: '三级 1-1-1',
        type: 2 //叶子结点添加这个树形可更改叶子结点图标
    }, {
        id: 10,
        label: '三级 1-1-2',
        type: 2
    }]
}]

3.添加线。

这个最难弄,知道现在还有一个莫名其妙的横线我还没有解决。

element的官网由提供一个属性 indent ,该属性可以控制相邻级节点间的水平缩进,单位为像素。我们可以将该属性设置为0,然后我们在css中为所有 el-tree-node 设置 padding-left ,就可以达到缩进的效果了!

由于每一层 el-tree-node 都被上一层的 el-tree-node 包裹着,上一层的padding会影响到下层的div位置,所以每一层的节点就不会撑满整个树形大盒子了,现在就可以直接根据 el-tree-node 定位伪元素了。

因此先在el-tree中加一个 :indent="0",这个时候每个结点的前面的间距就会消失,于是在css中设置间距,

/deep/ .el-tree-node{
    position: relative;
    padding-left: 16px; // 缩进量
}
/deep/ .el-tree-node__children {
    padding-left: 16px; // 缩进量
}

 最后css中设置线条:

//当前层最后一个节点的竖线高度固定
/deep/ .el-tree-node :last-child:before {
    height: 40px;
}
//去掉最顶层的虚线,放最下面样式才不会被上面的覆盖了
/deep/ .el-tree > .el-tree-node:before {
    border-left: none;
}
/deep/ .el-tree > .el-tree-node:after {
    border-top: none;
}
//叶子结点不设置
/deep/ .el-tree-node__children .el-tree-node:before {
    content: "";
    left: -4px;
    position: absolute;
    right: auto;
    border-width: 1px;
}
/deep/ .el-tree-node:after {
    content: "";
    left: -4px;
    position: absolute;
    right: auto;
    border-width: 1px;
}
/deep/ .el-tree-node__expand-icon.is-leaf {
    display: none;
}
//竖线
/deep/ .el-tree-node:before {
    border-left: 1px dashed #dddddd;
    bottom: 0px;
    height: 100%;
    top: -26px;
    width: 1px;
}
//横线
/deep/ .el-tree-node:after {
    border-top: 1px dashed #dddddd;
    height: 20px;
    top: 20px;
    width: 16px;
}

完整代码:

<template>
    <el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick" class="tree-line" default-expand-all :expand-on-click-node="false" :indent="0">
        <span slot-scope="{ node, data }" class="slot-t-node">
            <template>
                <i :class="{
                    'el-icon-folder': !node.expanded,       // 节点收缩时的图标
                    'el-icon-folder-opened': node.expanded, // 节点展开时的图标
                    'el-icon-s-management': data.type === 2   // data.type是后端配合提供的识别字段,最后一级
                }" 
                style="color:#606266"
                />
                <span>{{ node.label }}</span>
            </template>
        </span>
    </el-tree>
</template>
<script>
    export default {
        components: {
        },
        data() {
          return {
            data: [{
                id: 1,
                label: '一级 1',
                children: [{
                    id: 4,
                    label: '二级 1-1',
                    children: [{
                        id: 9,
                        label: '三级 1-1-1',
                        type: 2
                    }, {
                        id: 10,
                        label: '三级 1-1-2',
                        type: 2
                    }]
                }]
            }, {
                id: 2,
                label: '一级 2',
                children: [{
                    id: 5,
                    label: '二级 2-1',
                    type: 2
                }, {
                    id: 6,
                    label: '二级 2-2',
                    type: 2
                }]
            }, {
                id: 3,
                label: '一级 3',
                children: [{
                    id: 7,
                    label: '二级 3-1',
                    type: 2
                }, {
                    id: 8,
                    label: '二级 3-2',
                    type: 2
                }]
            }],
            defaultProps: {
              children: 'children',
              label: 'label'
            }
          };
        },
    methods: {
        handleNodeClick(data) {
        }
    }
  }
</script>
<style lang='scss' scoped>
.tree{
    padding-left: 8px;
    padding-top: 16px;
    .tree-line{
        /deep/ .el-tree-node{
            position: relative;
            padding-left: 16px; // 缩进量
        }
        /deep/ .el-tree-node__children {
            padding-left: 16px; // 缩进量
        }
        //这是竖线
        /deep/ .el-tree-node :last-child:before {
            height: 40px;
        }
        /deep/ .el-tree > .el-tree-node:before {
        border-left: none;
        border-top: none;
        }
        /deep/ .el-tree > .el-tree-node:after {
        border-top: none;
        border-left: none;
        }
        /deep/ .el-tree-node__children .el-tree-node:before {
        content: "";
        left: -4px;
        position: absolute;
        right: auto;
        border-width: 1px;
        }
        /deep/ .el-tree-node:after {
        content: "";
        left: -4px;
        position: absolute;
        right: auto;
        border-width: 1px;
        }
        /deep/ .el-tree-node__expand-icon.is-leaf {
        display: none;
        }
        /deep/ .el-tree-node:before {
        border-left: 1px dashed #dddddd;
        bottom: 0px;
        height: 100%;
        top: -26px;
        width: 1px;
        }
        /deep/ .el-tree-node:after {
        border-top: 1px dashed #dddddd;
        height: 20px;
        top: 20px;
        width: 16px;
        }
        /deep/ .el-tree-node__content{
            height: 40px !important;
            width: 298px;
        }
        /deep/ .el-tree .el-tree-node__expand-icon.expanded {
            -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
        }
        /deep/ .el-tree .el-tree-node__expand-icon.expanded {
            -webkit-transform: rotate(0deg);
            transform: rotate(0deg);
        }
        /* //有子节点 且未展开 */
        /deep/ .el-icon-caret-right:before {
            content: url('/static/image/operationWell/目录树_默认.png');//树形控件点击图标更改为图片,需要自己设置
            display: block;
            width: 20px;
            height: 20px;
            font-size: 16px;
            background-size: 16px;
        }
        /* //有子节点 且已展开 */
        /deep/ .el-tree-node__expand-icon.expanded.el-icon-caret-right:before {
            content: url('/static/image/operationWell/目录树_展开.png');//树形控件点击图标更改为图片,需要自己设置
            display: block;
            width: 20px;
            height: 20px;
            font-size: 16px;
            background-size: 16px;
        }
        /* //没有子节点 */
        /deep/ .el-tree-node__expand-icon.is-leaf::before {
            background: #fff;
            content: '';
            display: block;
            width: 0px;
            height: 0px;
            font-size: 16px;
            background-size: 16px;
        }
        /* //高亮字体颜色 */
        /deep/ .el-tree-node.is-current > .el-tree-node__content {
            color: #409eff !important;
        }
    }
  }
</style>

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用 layui 的 tree 模块和 form 模块来实现一个树形下拉选择框。具体实现步骤如下: 1. 在 HTML 中定义一个表格,并在其中添加一个下拉选择框的列,如下所示: ``` <table class="layui-table"> <thead> <tr> <th>姓名</th> <th>性别</th> <th>城市</th> <th>爱好</th> <th>操作</th> </tr> </thead> <tbody> <tr> <td>张三</td> <td>男</td> <td> <div class="layui-input-inline"> <select name="city" lay-filter="tree"> <option value="">请选择城市</option> <option value="1">北京</option> <option value="2">上海</option> <option value="3">广州</option> <option value="4">深圳</option> </select> </div> </td> <td>篮球</td> <td> <button class="layui-btn layui-btn-xs">编辑</button> <button class="layui-btn layui-btn-danger layui-btn-xs">删除</button> </td> </tr> </tbody> </table> ``` 2. 在 JavaScript 中初始化 layui 的 tree 模块和 form 模块,并为下拉选择框添加一个事件监听器,如下所示: ``` layui.use(['tree', 'form'], function(){ var tree = layui.tree, form = layui.form; // 初始化树形下拉选择框 tree({ elem: '#tree', nodes: [ { name: '北京', id: 1, children: [ { name: '朝阳区', id: 11 }, { name: '海淀区', id: 12 }, { name: '东城区', id: 13 } ] }, { name: '上海', id: 2, children: [ { name: '浦东新区', id: 21 }, { name: '徐汇区', id: 22 }, { name: '黄浦区', id: 23 } ] }, { name: '广州', id: 3, children: [ { name: '天河区', id: 31 }, { name: '越秀区', id: 32 }, { name: '海珠区', id: 33 } ] }, { name: '深圳', id: 4, children: [ { name: '福田区', id: 41 }, { name: '南山区', id: 42 }, { name: '罗湖区', id: 43 } ] } ] }); // 监听下拉选择框的 change 事件 form.on('select(tree)', function(data){ console.log(data.value); // 输出选中的值 }); }); ``` 3. 在 CSS 中定义一些样式,使树形下拉选择框的样式更美观,如下所示: ``` .layui-tree .layui-tree-txt { padding-left: 20px; } .layui-tree .layui-tree-icon { left: 0; } .layui-form-select .layui-edge { right: 10px; } .layui-form-select dl { max-height: 200px; overflow-y: auto; } ``` 这样就可以实现一个树形下拉选择框了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值