【JS 设计模式 】用组合模式来实现树形导航--代码结构思路分析(一)

树导航效果图:

【JS 设计模式 】用组合模式来实现树形导航--代码结构思路分析(一)_第1张图片


组合模式的描述:

将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

我们把部分用Leaf表示, 把整体用Composite表示。组合模式是有一定规律的,在实现树导航的情况下,Composite需要包含一个以上Leaf,也可以包含一个以上Leaf和一个以Composite,为什么说要包含一个以上的,如果Composite不包含任何子child的话那么它就是Leaf,Leaf表示是最后一层结节。

【JS 设计模式 】用组合模式来实现树形导航--代码结构思路分析(一)_第2张图片


树形导航代码片段:

[data-panel="tree"] .tree-folder, [data-panel="tree"] .tree-only, [data-panel="tree"] .tree-child {
    padding-left: 20px;
}
[data-panel="tree"] .tree-root, [data-panel="tree"] .tree-folder, [data-panel="tree"] .tree-only, [data-panel="tree"] .tree-child {
    position: relative;
}
[data-panel="tree"] .folder {
    display: block;
    position: relative;
    padding: 4px 6px;
    color: #333;
    cursor: pointer;
    overflow: hidden;
}
[data-panel="tree"] b {
    float: left;
    margin-top: 4px;
    background-position: 0 -35px;
    width: 20px;
    height: 16px;
}
[data-panel="tree"] i, [data-panel="tree"] b {
    background-image: url("../image/tree/tree_icon.png");
    background-repeat: no-repeat;
}
[data-panel="tree"] .tree-only > i {
    background-position: 0 -151px;
}
[data-panel="tree"] i {
    position: absolute;
    top: 50%;
    left: 0;
    height: 28px;
    width: 16px;
    margin-top: -14px;
}
[data-panel="tree"] .tree-folder > i {
    background-position: 0 -61px;
    cursor: pointer;
}
[data-panel="tree"] .tree-child:not(:last-child) {
    background-image: url("../image/tree/tree_line.png");
    background-position: 0 0;
    background-repeat: repeat-y;
}
[data-panel="tree"] .tree-folder.last > i {
    background-position: 0 -91px;
}
[data-panel="tree"] .tree-only.last > i {
    background-position: 0 -181px;
}
[data-panel="tree"] .folder.empty {
    color: #999;
}
[data-panel="tree"] .tree-root > .toolbar, [data-panel="tree"] .tree-folder > .toolbar, [data-panel="tree"] .tree-only > .toolbar {
    position: absolute;
    top: 0;
    right: 0;
    display:none;
}
[data-panel="tree"] .tree-root > .toolbar > a, [data-panel="tree"] .tree-folder > .toolbar > a, [data-panel="tree"] .tree-only > .toolbar > a {
    display: inline-block;
    padding: 4px 6px;
    color: #00a0e9;
}
[data-panel="tree"] .tree-root:hover > .folder, [data-panel="tree"] .tree-folder:hover > .folder, [data-panel="tree"] .tree-only:hover > .folder {
    background-color: #fafafa;
}
[data-panel="tree"] .tree-root:hover > .toolbar, [data-panel="tree"] .tree-folder:hover > .toolbar, [data-panel="tree"] .tree-only:hover > .toolbar {
  display: block
}

tree_icon.png图片地址:https://img-blog.csdn.net/20160424123943829

tree_line.png图片地址:https://img-blog.csdn.net/20160424123959314


分析HTML代码结果
【JS 设计模式 】用组合模式来实现树形导航--代码结构思路分析(一)_第3张图片




我们从HTML代码中找到一些规律,从图中看几个框框:

第一个红色的内的第一个元素标签div.tree-child, 红框外距离红框最近的一个元素是div.tree-folder.
通过这个红框来看,我们不难分析出粉红框 和黑框内的代码和红框的是相似的。

我们在来看看还有没有其它的规律,
也许你已经看出来了一个了,有的div的class属性值是tree-only而有的是tree-only last,他们的区别是什么呢?
通过下图来看,带圈的是表示是有last选择器的。
【JS 设计模式 】用组合模式来实现树形导航--代码结构思路分析(一)_第4张图片


通过HTML代码可以看出图片上有四个last选择器,而我们通过这张图片只看出三个。 想知道原因请看下图
【JS 设计模式 】用组合模式来实现树形导航--代码结构思路分析(一)_第5张图片

原本通过代码看到的应该是这张图片,原因我不希望第一个节点元素显示它前面的那个节点图片,所以我们是通过程序控制掉了它。

我们来看下一张图片,红框里的代码是,我们再看一下其它的div.tree-folder元素内的第一个元素怎么是呢?第二元素才是,原因很简单,显示的是节点图片。原因我不希望显示第一个节点图片,所以我们就没有把它添加到DOM元素中.
【JS 设计模式 】用组合模式来实现树形导航--代码结构思路分析(一)_第6张图片

那么我们再来找下一个规律:我们看一下HTML代码又发现一个那就是div中有带empty的,有的就不带empty,empty是空的意思,在这里说明没有数据。它是在效果中那里体现的呢?请看一下图


【JS 设计模式 】用组合模式来实现树形导航--代码结构思路分析(一)_第7张图片

大家明白了吗?,这个红框里的代码是带有empty选择器的元素。empty是用来控制是否有数据的样式。这些都是通过js来控制的。

【JS 设计模式 】用组合模式来实现树形导航--JS代码结构思路分析(二)

你可能感兴趣的:(JS常用设计模式,设计模式与数据结构)