【问题标题】:Trees in Twitter Bootstrap [closed]Twitter Bootstrap 中的树 [关闭]
【发布时间】:2012-06-25 10:15:11
【问题描述】:

我一直在努力创建一个使用尽可能多的 CSS 和尽可能少的 JS(仅用于状态等)的树(如目录树),我想知道是否有一些好的现有树bootstrapjquery-ui bootstrap 的插件。


作为参考或对这个问题感到困惑的人,我正在寻找类似dynatree 的引导程序。

【问题讨论】:

    标签: javascript jquery twitter-bootstrap css jquery-ui


    【解决方案1】:

    Vitaliy's CSSMehmet's jQuery 的基础上,我将a 标签更改为span 标签,并将一些Glyphiconsbadging 合并到my take on a Bootstrap tree widget 中。

    示例:

    为了获得额外的荣誉,我为 Bootstrap 创建了一个GitHub project to host the jQuery and LESS code that goes into adding this tree component。请参阅http://jhfrench.github.io/bootstrap-tree/docs/example.html 的项目文档。

    或者,这里是生成该 CSS 的 LESS 源(可以从 jsFiddle 获取 JS):

    @import "../../../external/bootstrap/less/bootstrap.less"; /* substitute your path to the bootstrap.less file */
    @import "../../../external/bootstrap/less/responsive.less"; /* optional; substitute your path to the responsive.less file */
    
    /* collapsable tree */
    .tree {
        .border-radius(@baseBorderRadius);
        .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
        background-color: lighten(@grayLighter, 5%);
        border: 1px solid @grayLight;
        margin-bottom: 10px;
        max-height: 300px;
        min-height: 20px;
        overflow-y: auto;
        padding: 19px;
        a {
            display: block;
            overflow: hidden;
            text-overflow: ellipsis;
            width: 90%;
        }
        li {
            list-style-type: none;
            margin: 0px 0;
            padding: 4px 0px 0px 2px;
            position: relative;
            &::before, &::after {
                content: '';
                left: -20px;
                position: absolute;
                right: auto;
            }
            &::before {
                border-left: 1px solid @grayLight;
                bottom: 50px;
                height: 100%;
                top: 0;
                width: 1px;
            }
            &::after {
                border-top: 1px solid @grayLight;
                height: 20px;
                top: 13px;
                width: 23px;
            }
            span {
                -moz-border-radius: 5px;
                -webkit-border-radius: 5px;
                border: 1px solid @grayLight;
                border-radius: 5px;
                display: inline-block;
                line-height: 14px;
                padding: 2px 4px;
                text-decoration: none;
            }
            &.parent_li > span {
                cursor: pointer;
                /*Time for some hover effects*/
                &:hover, &:hover+ul li span {
                    background: @grayLighter;
                    border: 1px solid @gray;
                    color: #000;
                }
            }
            /*Remove connectors after last child*/
            &:last-child::before {
                height: 30px;
            }
        }
        /*Remove connectors before root*/
        > ul > li::before, > ul > li::after {
            border: 0;
        }
    }
    

    【讨论】:

    • 干得好。当然,除了.parent_li 的 li 孩子的奇怪行为,当他们的父母悬停在他们的父母(在你的第二棵树中)时,他们失去了背景颜色并变成灰色。
    • 感谢@Harsh。您认为奇怪的悬停行为遵循 Vitaliy 的编程,为用户提供了哪些节点将被折叠的视觉指示。
    • @JeromyFrench 这棵树的体验非常好,流畅。正是我搜索时所追求的。干得好。
    • 感谢您的代码。你如何折叠默认?当您访问我希望它被折叠的页面?你可以帮帮我吗?谢谢。
    • jsfiddle.net/jayhilwig/hv8vU :: 我更新了代码并在此处为 bootstrap 3.0 创建了一个新小提琴:
    【解决方案2】:

    你能相信下图中的树形视图没有使用任何 JavaScript,而是仅依赖于 CSS3 吗?看看这个 CSS3 TreeView,它很适合 Twitter BootStrap:

    你可以在这里http://acidmartin.wordpress.com/2011/09/26/css3-treevew-no-javascript/获得更多信息。

    【讨论】:

    • 哇...这是一个很好的...我得研究一下...谢谢...
    • @Harsh 当然,它的引导程序已准备就绪,如果有帮助,请接受我的回答。 :) PS:我们正在使用它。 :)
    • 这个解决方案看起来不错,但是有一些我们想要但在这个版本中没有提供的功能,例如分支突出显示等。但无论如何,这是一个很好的例子做树造型
    • 找到了一个很好的例子thecssninja.com/demo/css_tree
    • 值得注意的是,答案中提到的博文包含一些简单的 CSS,这对我不起作用,但实际演示包含一些更复杂(且未解释)的 CSS。
    【解决方案3】:

    如果有人想从 Harsh 的回答中获得垂直版本的树视图,您可以节省一些时间:

    http://jsfiddle.net/Fh47n/

    .tree li {
        margin: 0px 0;
    
        list-style-type: none;
        position: relative;
        padding: 20px 5px 0px 5px;
    }
    
    .tree li::before{
        content: '';
        position: absolute; 
        top: 0;
        width: 1px; 
        height: 100%;
        right: auto; 
        left: -20px;
        border-left: 1px solid #ccc;
        bottom: 50px;
    }
    .tree li::after{
        content: '';
        position: absolute; 
        top: 30px; 
        width: 25px; 
        height: 20px;
        right: auto; 
        left: -20px;
        border-top: 1px solid #ccc;
    }
    .tree li a{
        display: inline-block;
        border: 1px solid #ccc;
        padding: 5px 10px;
        text-decoration: none;
        color: #666;
        font-family: arial, verdana, tahoma;
        font-size: 11px;
        border-radius: 5px;
        -webkit-border-radius: 5px;
        -moz-border-radius: 5px;
    }
    
    /*Remove connectors before root*/
    .tree > ul > li::before, .tree > ul > li::after{
        border: 0;
    }
    /*Remove connectors after last child*/
    .tree li:last-child::before{ 
          height: 30px;
    }
    
    /*Time for some hover effects*/
    /*We will apply the hover effect the the lineage of the element also*/
    .tree li a:hover, .tree li a:hover+ul li a {
        background: #c8e4f8; color: #000; border: 1px solid #94a0b4;
    }
    /*Connector styles on hover*/
    .tree li a:hover+ul li::after, 
    .tree li a:hover+ul li::before, 
    .tree li a:hover+ul::before, 
    .tree li a:hover+ul ul::before{
        border-color:  #94a0b4;
    }
    

    【讨论】:

    • 简洁优雅。赞成:)
    • 完美解决方案!
    • 哇,很棒的解决方案 - 并且易于扩展!
    • 折叠展开功能在哪里?
    【解决方案4】:

    对于那些仍在使用 CSS3 搜索树的人,这是我在网上找到的一段很棒的代码:

    http://thecodeplayer.com/walkthrough/css3-family-tree

    HTML

    <div class="tree">
      <ul>
        <li>
          <a href="#">Parent</a>
          <ul>
            <li>
              <a href="#">Child</a>
              <ul>
                <li>
                  <a href="#">Grand Child</a>
                </li>
              </ul>
            </li>
            <li>
              <a href="#">Child</a>
              <ul>
                <li><a href="#">Grand Child</a></li>
                <li>
                  <a href="#">Grand Child</a>
                  <ul>
                    <li>
                      <a href="#">Great Grand Child</a>
                    </li>
                    <li>
                      <a href="#">Great Grand Child</a>
                    </li>
                    <li>
                      <a href="#">Great Grand Child</a>
                    </li>
                  </ul>
                </li>
                <li><a href="#">Grand Child</a></li>
              </ul>
            </li>
          </ul>
        </li>
      </ul>
    </div>
    

    CSS

    * {margin: 0; padding: 0;}
    
    .tree ul {
      padding-top: 20px; position: relative;
    
      transition: all 0.5s;
      -webkit-transition: all 0.5s;
      -moz-transition: all 0.5s;
    }
    
    .tree li {
      float: left; text-align: center;
      list-style-type: none;
      position: relative;
      padding: 20px 5px 0 5px;
    
      transition: all 0.5s;
      -webkit-transition: all 0.5s;
      -moz-transition: all 0.5s;
    }
    
    /*We will use ::before and ::after to draw the connectors*/
    
    .tree li::before, .tree li::after{
      content: '';
      position: absolute; top: 0; right: 50%;
      border-top: 1px solid #ccc;
      width: 50%; height: 20px;
    }
    .tree li::after{
      right: auto; left: 50%;
      border-left: 1px solid #ccc;
    }
    
    /*We need to remove left-right connectors from elements without 
    any siblings*/
    .tree li:only-child::after, .tree li:only-child::before {
      display: none;
    }
    
    /*Remove space from the top of single children*/
    .tree li:only-child{ padding-top: 0;}
    
    /*Remove left connector from first child and 
    right connector from last child*/
    .tree li:first-child::before, .tree li:last-child::after{
      border: 0 none;
    }
    /*Adding back the vertical connector to the last nodes*/
    .tree li:last-child::before{
      border-right: 1px solid #ccc;
      border-radius: 0 5px 0 0;
      -webkit-border-radius: 0 5px 0 0;
      -moz-border-radius: 0 5px 0 0;
    }
    .tree li:first-child::after{
      border-radius: 5px 0 0 0;
      -webkit-border-radius: 5px 0 0 0;
      -moz-border-radius: 5px 0 0 0;
    }
    
    /*Time to add downward connectors from parents*/
    .tree ul ul::before{
      content: '';
      position: absolute; top: 0; left: 50%;
      border-left: 1px solid #ccc;
      width: 0; height: 20px;
    }
    
    .tree li a{
      border: 1px solid #ccc;
      padding: 5px 10px;
      text-decoration: none;
      color: #666;
      font-family: arial, verdana, tahoma;
      font-size: 11px;
      display: inline-block;
    
      border-radius: 5px;
      -webkit-border-radius: 5px;
      -moz-border-radius: 5px;
    
      transition: all 0.5s;
      -webkit-transition: all 0.5s;
      -moz-transition: all 0.5s;
    }
    
    /*Time for some hover effects*/
    /*We will apply the hover effect the the lineage of the element also*/
    .tree li a:hover, .tree li a:hover+ul li a {
      background: #c8e4f8; color: #000; border: 1px solid #94a0b4;
    }
    /*Connector styles on hover*/
    .tree li a:hover+ul li::after, 
    .tree li a:hover+ul li::before, 
    .tree li a:hover+ul::before, 
    .tree li a:hover+ul ul::before{
      border-color:  #94a0b4;
    }
    

    PS:除了代码之外,我还喜欢网站展示它的方式......真的很创新。

    【讨论】:

    • 这与您在问题中建议的树类型完全不同。我相信 Praveen Kumar 应该得到他的回答
    • 我正在寻找一棵像第一棵树一样的树,看到了这个答案,并决定改用它。有趣的是灵感如何改变解决方案!
    • @Blowsie:我已经考虑了您的建议,并且已经伸张正义,哈哈。很高兴看到一个独立项目由于某个随机人的一些随机请求而不断发展。
    【解决方案5】:

    如果有人想要 Vitaliy Bychik 的回答中的树视图的可扩展/可折叠版本,您可以节省一些时间 :)

    http://jsfiddle.net/mehmetatas/fXzHS/2/

    $(function () {
        $('.tree li').hide();
        $('.tree li:first').show();
        $('.tree li').on('click', function (e) {
            var children = $(this).find('> ul > li');
            if (children.is(":visible")) children.hide('fast');
            else children.show('fast');
            e.stopPropagation();
        });
    });
    

    【讨论】:

    • :) 不错!好主意 +1。
    • 我添加了 $('.tree > ul > li:first-child').show();支持页面上的多个树。谢谢
    【解决方案6】:

    另一个很棒的 Treeview jquery 插件是 http://www.jstree.com/

    对于高级视图,您应该检查 jquery-treetable
    http://ludo.cubicphuse.nl/jquery-plugins/treeTable/doc/

    【讨论】:

    • 据该网站称,自 2010 年 4 月起不再支持它
    • 哦,很遗憾它不受支持...不过看起来不错。
    • 您好,这两个库都是最新的并受支持
    • 它们受支持 - 请参阅 github.com/ludo/jquery-treetable/releases
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 2012-04-04
    • 1970-01-01
    • 2012-09-14
    • 2014-01-04
    相关资源
    最近更新 更多