原本样式:
需求样式:
技术难点:
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>