Arbres dans Twitter Bootstrap [fermé]


108

J'ai essayé de créer un arbre (comme une arborescence de répertoires) qui utilise autant de CSS et aussi peu de JS que possible (uniquement pour les états, etc.), et je veux savoir s'il existe de bons plugins d'arborescence existants pour le bootstrap ou bootstrap jquery-ui .


Pour référence ou pour les personnes confuses à propos de cette question, je recherche quelque chose comme dynatree pour bootstrap.

Réponses:


181

En me basant sur le CSS de Vitaliy et le jQuery de Mehmet , j'ai changé les abalises en spanbalises et incorporé des glyphicons et des badges dans ma version d'un widget d'arbre Bootstrap .

Exemple: mon point de vue sur un widget d'arbre Bootstrap

Pour plus de crédit, j'ai créé un Icône Githubprojet GitHub pour héberger le code jQuery et LESS qui sert à ajouter ce composant d'arborescence à Bootstrap. Veuillez consulter la documentation du projet à l' adresse http://jhfrench.github.io/bootstrap-tree/docs/example.html .

Alternativement, voici la source LESS pour générer ce CSS (le JS peut être récupéré à partir du 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;
    }
}

bien joué. Sauf, bien sûr, le comportement étrange des enfants li .parent_liqui perdent leur couleur d'arrière-plan et deviennent gris lorsque leur parent est survolé (dans votre deuxième arbre).
kumarharsh

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.
Jeromy French

1
@JeromyFrench Cet arbre a une expérience très agréable et fluide. Exactement ce que je cherchais quand j'ai cherché. Bon travail.
Nathan Moos le

5
merci pour le code. comment réduisez-vous par défaut? lorsque vous visitez la page, je veux qu'elle soit réduite? pourriez-vous m'aider? Merci.
Erdem Ece

5
jsfiddle.net/jayhilwig/hv8vU :: J'ai mis à jour le code et créé un nouveau violon ici pour bootstrap 3.0:
jayseattle

79

Pouvez-vous croire que l'arborescence de l'image ci-dessous n'utilise pas de JavaScript, mais repose uniquement sur CSS3? Découvrez ce CSS3 TreeView , qui est bon avec Twitter BootStrap:

TreeView

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


wow ... c'est un bon ... je vais devoir examiner ça ... merci ...
kumarharsh

1
@Harsh Bien sûr, son bootstrap est prêt et veuillez accepter ma réponse si cela est utile. :) PS: Nous l'utilisons. :)
Praveen Kumar Purushothaman

La solution semble bien, mais il y a quelques fonctionnalités que nous voulions et ne sont pas fournis dans cette version, comme branche surlignage, etc. Mais de toute façon, il est un très bon exemple de la façon de faire le style de l' arbre
kumarharsh

1
a trouvé un bel exemple thecssninja.com/demo/css_tree
surya

1
Il convient de noter que le billet de blog mentionné dans la réponse contient du CSS simple, ce qui ne fonctionne pas pour moi, mais la démo réelle contient du CSS plus compliqué (et non expliqué).
Robin Green

53

Si quelqu'un veut une version verticale de l'arborescence 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
Simple et élégant. Upvoted :)
thefourtheye

1
Solution tout simplement parfaite!
CORSAIR

Wow, une excellente solution - et facilement extensible!
rkallensee

Où se trouve la fonctionnalité d'extension de réduction?
Syed Aqeel Ashiq

41

Pour ceux qui recherchent toujours un arbre avec CSS3, c'est un morceau de code fantastique 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: à part le code, j'aime aussi la façon dont le site le montre en action ... vraiment innovant.


5
Cela ne ressemble en rien au type d'arbre que vous avez suggéré dans votre question. Je crois que Praveen Kumar devrait être récompensé avec sa réponse
Blowsie

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

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


36

Si quelqu'un veut une version extensible / pliable de l'arborescence 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();
    });
});

:) agréable! Bonne idée +1.
Alex

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

8

Un autre excellent plugin Treeview jquery est http://www.jstree.com/

Pour une vue avancée, vous devriez vérifier jquery-treetable
http://ludo.cubicphuse.nl/jquery-plugins/treeTable/doc/


Selon le site, il n'est plus pris en charge depuis avril 2010
levelnis

oh c'est dommage qu'il ne soit pas pris en charge ... ça a l'air bien cependant.
kumarharsh

3
Salut, les deux bibliothèques sont à jour et sont prises en charge
Gal Margalit

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.