110 votes

Les arbres dans Twitter Bootstrap

J'ai essayé de travailler sur la création d'un arbre (comme un arbre de répertoire) qui utilise autant de CSS et aussi peu de JS que possible (seulement pour les états, etc), et je veux savoir s'il y a de bons plugins d'arbre existants pour bootstrap o jquery-ui bootstrap .


À titre de référence ou pour les personnes confuses dans cette question, je recherche quelque chose comme dynatree pour le bootstrap.

181voto

Jeromy French Points 3969

Construire sur CSS de Vitaliy y Le jQuery de Mehmet j'ai changé le a balises pour span et incorporé quelques Glyphicons y badgeage en mon point de vue sur un widget d'arbre Bootstrap .

Exemple : my take on a Bootstrap tree widget

Pour un crédit supplémentaire, j'ai créé un Github iconProjet GitHub pour héberger le code jQuery et LESS qui permet d'ajouter ce composant d'arbre. à Bootstrap. Veuillez consulter la documentation du projet à l'adresse suivante http://jhfrench.github.io/bootstrap-tree/docs/example.html .

Sinon, voici la source LESS pour générer ce CSS (le JS peut être récupéré à partir de la page d'accueil). 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 votes

Bien fait. Sauf, bien sûr, le comportement étrange des enfants de li de .parent_li qui perdent leur couleur de fond et deviennent grises lorsque leur parent est survolé (dans votre deuxième arbre).

0 votes

Merci @Harsh. Le comportement de survol que vous trouvez étrange suit la programmation de Vitaliy pour donner à l'utilisateur un indicateur visuel des nœuds qui seront réduits.

0 votes

Quelle est la licence de ce code ? J'aimerais l'utiliser dans mon projet !

79voto

Praveen Kumar Points 29309

Pouvez-vous croire que le treeview de l'image ci-dessous n'utilise aucun JavaScript, mais repose uniquement sur CSS3 ? Regardez cette TreeView CSS3 qui est compatible avec Twitter BootStrap :

TreeView

Vous pouvez obtenir plus d'informations à ce sujet ici http://acidmartin.wordpress.com/2011/09/26/css3-treevew-no-javascript/ .

0 votes

Wow... c'est une bonne idée... je vais devoir y réfléchir... merci...

1 votes

@Harsh Bien sûr, il est prêt pour le bootstrap et veuillez accepter ma réponse si elle est utile :) PS : Nous l'utilisons :)

0 votes

La solution semble bonne, mais il y a quelques fonctionnalités, que nous voulions et qui ne sont pas fournies dans cette version, comme la mise en évidence des branches, etc. Mais quoi qu'il en soit, il s'agit d'un très bon exemple de la manière de styliser un arbre.

55voto

Vitaliy Bychik Points 331

Si quelqu'un veut la version verticale du treeview de la réponse de Harsh, vous pouvez gagner du temps :

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 votes

Simple et élégant. Upvoted :)

1 votes

Une solution parfaite !

0 votes

Wow, excellente solution - et facilement extensible !

41voto

Kumar Harsh Points 3960

Pour ceux qui cherchent encore un arbre avec CSS3, voici un fantastique morceau de code que j'ai trouvé sur le net :

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 : en dehors du code, j'aime aussi la façon dont le site le montre en action... vraiment innovant.

5 votes

Cela ne ressemble pas vraiment au type d'arbre que vous avez suggéré dans votre question. Je crois que Praveen Kumar devrait être récompensé pour sa réponse.

2 votes

Je cherchais un arbre comme le premier, j'ai vu cette réponse et j'ai décidé d'utiliser celle-ci à la place. C'est drôle comme l'inspiration peut changer une solution !

2 votes

@Blowsie : J'ai pris votre suggestion en considération et justice a été rendue, lol. C'est bon de voir un projet autonome évoluer en raison d'une demande aléatoire d'un type aléatoire.

36voto

Mehmet Ataş Points 3560

Si quelqu'un veut une version extensible/collapable du treeview de la réponse de Vitaliy Bychik, vous pouvez gagner du temps :)

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 votes

:) bien ! Bonne idée +1.

1 votes

J'ai ajouté $('.tree > ul > li:first-child').show() ; pour prendre en charge plusieurs arbres sur la page. Merci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X