【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
}

<div id="groupView" class="groupView panel-body" data-panel="tree">
  <div class="tree-folder last"><b></b><a class="folder" href="/Favorite/index/0" id="0">全部[0]</a></div>
  <div class="tree-child">
    <div class="tree-only"><i></i><a class="folder" href="/Favorite/index/0" id="0">未分组[1]</a></div>
    <div class="tree-folder"><i></i><b></b><a class="folder" href="/Favorite/index/6" id="6">客户[1]</a></div>
    <div class="tree-child">
      <div class="tree-only"><i></i><a class="folder" href="/Favorite/index/8" id="8">西方客户[1]</a></div>
      <div class="tree-only last"><i></i><a class="folder empty" href="/Favorite/index/9" id="9">东方客户[0]</a></div>
    </div>
    <div class="tree-only"><i></i><a class="folder" href="/Favorite/index/13" id="13">修改分组名称[2]</a></div>
    <div class="tree-folder"><i></i><b></b><a class="folder" href="/Favorite/index/16" id="16">计算机[0]</a></div>
    <div class="tree-child">
      <div class="tree-only"><i></i><a class="folder empty" href="/Favorite/index/17" id="17">硬件工程师[0]</a></div>
      <div class="tree-only last"><i></i><a class="folder empty" href="/Favorite/index/18" id="18">软件工程师[0]</a></div>
    </div>
    <div class="tree-only last"><i></i><a class="folder empty" href="/Favorite/index/40" id="40">最新添加[0]</a></div>
  </div>
</div>

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

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


分析HTML代码结果




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

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

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


通过HTML代码可以看出图片上有四个last选择器,而我们通过这张图片只看出三个。 想知道原因请看下图


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

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

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


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

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

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

你可能感兴趣的:(【JS 设计模式 】用组合模式来实现树形导航--代码结构思路分析(一))