Деревья в Твиттере Bootstrap

110

Я пытаюсь работать над созданием дерева (например, дерева каталогов), которое использует как можно больше CSS и как можно меньше JS (только для состояний и т.д.), и я хочу знать, есть ли какое-то хорошее существующее дерево плагины для bootstrap или jquery-ui bootstrap.


Для справки или для людей, смущенных этим вопросом, я ищу что-то вроде dynatree для начальной загрузки.

6 ответов

171
Лучший ответ

Основываясь на Vitaliy CSS и Mehmet jQuery, я сменил теги a на span и добавили некоторые Glyphicons и прошивка в мой захват виджета Bootstrap.

Пример: Изображение 2393

Для дополнительного кредита я создал проект Изображение 2394GitHub для размещения кода jQuery и LESS, который добавляется в этот компонент дерева в Bootstrap. См. Проектную документацию на http://jhfrench.github.io/bootstrap-tree/docs/example.html.

В качестве альтернативы, здесь LESS-источник генерирует этот CSS (JS можно выбрать из jsFiddle):

@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;
    }
}
  • 0
    отлично сработано. За исключением, конечно, странного поведения детей li из .parent_li которые теряют цвет фона и становятся серыми, когда их родитель находится над (во втором дереве).
  • 0
    Спасибо @Harsh. Поведение при наведении, которое вы считаете странным, следует за программированием Виталия, чтобы дать пользователю визуальный индикатор того, какие узлы будут свернуты.
Показать ещё 15 комментариев
78

Вы можете поверить, что древовидное изображение на изображении ниже не использует JavaScript, но полагается только на CSS3? Посмотрите этот CSS3 TreeView, что хорошо с Twitter BootStrap:

Изображение 2395

Вы можете получить более подробную информацию об этом здесь http://acidmartin.wordpress.com/2011/09/26/css3-treevew-no-javascript/.

  • 0
    вау ... это хорошо ... я должен разобраться в этом ... спасибо ...
  • 1
    @ Harsh Конечно, его загрузчик готов, и, пожалуйста, примите мой ответ, если это будет полезно. :) PS: мы его используем. :)
Показать ещё 12 комментариев
52

Если кто-то хочет, чтобы вертикальная версия древовидной структуры из ответа 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;
}
  • 1
    Просто и элегантно. Проголосовал :)
  • 0
    Просто идеальное решение!
Показать ещё 3 комментария
39

Для тех, кто все еще ищет дерево с 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: помимо кода мне также нравится, как сайт показывает его в действии... действительно инновационный.

  • 5
    Это не совсем то же самое, что тип дерева, который вы предложили в своем вопросе. Я считаю, что Правин Кумар должен быть награжден его ответом
  • 2
    Я искал дерево, подобное первому, увидел этот ответ и решил использовать его вместо этого. Забавно, как вдохновение может изменить решение!
Показать ещё 3 комментария
35

Если кто-то хочет разворачивать/сбрасывать версию дерева из ответа Виталия Бычика, вы можете сэкономить некоторое время:)

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();
    });
});
  • 0
    :) отлично! Хорошая идея +1.
  • 1
    Я добавил $ ('. Tree> ul> li: first-child'). Show (); поддерживать несколько деревьев на странице. Спасибо
8

Еще один отличный плагин javascript Treeview - http://www.jstree.com/

Для предварительного просмотра вы должны проверить jquery-treetable
http://ludo.cubicphuse.nl/jquery-plugins/treeTable/doc/

  • 0
    По данным сайта, он больше не поддерживается с апреля 2010 года
  • 0
    о, это позор, что это не поддерживается ... выглядит хорошо, хотя.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню