ต้นไม้ใน Twitter Bootstrap [ปิด]


108

ฉันพยายามสร้างทรี (เช่นไดเร็กทอรีทรี) ที่ใช้ CSS ให้มากที่สุดและ JS ให้น้อยที่สุด (เฉพาะสำหรับสถานะ ฯลฯ ) และฉันต้องการทราบว่ามีปลั๊กอินทรีที่ดีสำหรับbootstrap หรือไม่หรือjQuery UI-บูต


สำหรับการอ้างอิงหรือสำหรับคนที่สับสนเกี่ยวกับคำถามนี้ฉันกำลังมองหาบางอย่างเช่นdynatreeสำหรับ bootstrap

คำตอบ:


181

อาคารในCSS Vitaliy ของและเมห์เม็ตของ jQuery , ผมเปลี่ยนaแท็กspanแท็กและ บริษัท บางGlyphiconsและbadgingเข้าไปใช้เวลาของฉันในเครื่องมือต้นไม้ Bootstrap

ตัวอย่าง: ฉันใช้วิดเจ็ตต้นไม้ Bootstrap

สำหรับเครดิตเพิ่มเติมฉันได้สร้างไอคอน Githubโปรเจ็กต์ GitHub เพื่อโฮสต์โค้ด 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;
    }
}

ทำได้ดี. ยกเว้นพฤติกรรมแปลก ๆ ของเด็ก ๆ.parent_liที่สูญเสียสีพื้นหลังและกลายเป็นสีเทาเมื่อพ่อแม่ของพวกเขาลอยอยู่เหนือ (ในต้นไม้ที่สองของคุณ)
kumarharsh

ขอบคุณ @Harsh พฤติกรรมโฮเวอร์ที่คุณคิดว่าแปลกเป็นไปตามการเขียนโปรแกรมของ Vitaliy เพื่อให้ผู้ใช้เห็นภาพบ่งชี้ว่าโหนดใดจะถูกยุบ
Jeromy French

1
@JeromyFrench ต้นไม้นี้มีประสบการณ์ที่ดีมากและราบรื่น สิ่งที่ฉันเป็นหลังจากค้นหา การทำงานที่ดี.
Nathan Moos

5
ขอบคุณสำหรับรหัส คุณจะยุบค่าเริ่มต้นได้อย่างไร เมื่อคุณเยี่ยมชมเพจฉันต้องการให้ยุบ? คุณช่วยฉันได้ไหม ขอบคุณ.
Erdem Ece

5
jsfiddle.net/jayhilwig/hv8vU :: ฉันอัปเดตโค้ดและแยกซอใหม่ที่นี่สำหรับ bootstrap 3.0:
jayseattle

79

คุณเชื่อไหมว่า Treeview ในภาพด้านล่างไม่ได้ใช้ JavaScript ใด ๆ แต่อาศัย CSS3 เท่านั้น ลองดูCSS3 TreeViewซึ่งดีกับ Twitter BootStrap:

TreeView

คุณจะได้รับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่http://acidmartin.wordpress.com/2011/09/26/css3-treevew-no-javascript/


ว้าว ... เป็นสิ่งที่ดี ... ฉันจะต้องดู ... ขอบคุณ ...
kumarharsh

1
@Harsh แน่นอนว่า bootstrap พร้อมแล้วและโปรดยอมรับคำตอบของฉันหากเป็นประโยชน์ :) PS: เรากำลังใช้มัน :)
Praveen Kumar Purushothaman

วิธีแก้ปัญหาดูเหมือนจะดี แต่มีคุณสมบัติบางอย่างที่เราต้องการและไม่มีให้ในเวอร์ชันนี้เช่นการไฮไลต์สาขาเป็นต้น แต่อย่างไรก็ตามมันเป็นตัวอย่างที่ดีมากในการจัดแต่งทรงต้นไม้
kumarharsh

1
พบตัวอย่างที่ดีthecssninja.com/demo/css_tree
surya

1
เป็นที่น่าสังเกตว่าโพสต์บล็อกที่อ้างถึงในคำตอบมี CSS แบบง่ายบางอย่างซึ่งไม่ได้ผลสำหรับฉัน แต่การสาธิตจริงมี CSS ที่ซับซ้อนกว่า (และไม่ได้อธิบาย)
Robin Green

53

หากมีใครต้องการ Treeview ในแนวตั้งจากคำตอบของ 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
เรียบง่ายและสง่างาม โหวตแล้ว :)
thefourtheye

1
โซลูชั่นที่สมบูรณ์แบบ!
CORSAIR

ว้าววิธีแก้ปัญหาที่ยอดเยี่ยม - และขยายได้ง่าย!
rkallensee

ยุบขยายฟังก์ชันการทำงานอยู่ที่ไหน
Syed Aqeel Ashiq

41

สำหรับผู้ที่ยังคงค้นหาต้นไม้ด้วย 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
นี่ไม่ใช่ประเภทของต้นไม้ที่คุณแนะนำในคำถามของคุณ ฉันเชื่อว่า Praveen Kumar ควรได้รับคำตอบของเขา
Blowsie

2
ฉันกำลังมองหาต้นไม้เหมือนต้นแรกเห็นคำตอบนี้จึงตัดสินใจใช้สิ่งนี้แทน ตลกดีว่าแรงบันดาลใจสามารถเปลี่ยนทางออกได้อย่างไร!
Eric

2
@Blowsie: ฉันได้นำข้อเสนอแนะของคุณไปพิจารณาแล้วและได้รับความยุติธรรมแล้วฮ่า ๆ เป็นเรื่องดีที่ได้เห็นโครงการแบบสแตนด์อโลนที่พัฒนาขึ้นเนื่องจากมีการร้องขอแบบสุ่มโดยคนสุ่ม
kumarharsh

การสาธิตด่วน: jsfiddle.net/pdcmoreira/6Lghm43a
Pedro Moreira

36

หากมีคนต้องการ Treeview เวอร์ชันขยาย / พับได้จากคำตอบของ 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.
Alex

1
ฉันเพิ่ม $ ('. tree> ul> li: first-child'). show (); เพื่อรองรับต้นไม้หลาย ๆ ต้นในเพจ ขอบคุณ
เผ่า 84

8

ปลั๊กอิน Treeview jquery ที่ยอดเยี่ยมอีกตัวคือhttp://www.jstree.com/

สำหรับมุมมองล่วงหน้าคุณควรตรวจสอบ jquery-treetable
http://ludo.cubicphuse.nl/jquery-plugins/treeTable/doc/


ตามเว็บไซต์นี้ไม่ได้รับการสนับสนุนอีกต่อไปตั้งแต่เดือนเมษายน 2010
levelnis

น่าเสียดายที่ไม่ได้รับการสนับสนุน ... ดูดีนะ
kumarharsh

3
สวัสดีห้องสมุดทั้งสองเป็นข้อมูลล่าสุดและได้รับการสนับสนุน
Gal Margalit

ได้รับการสนับสนุน - ดูที่github.com/ludo/jquery-treetable/releases
Bartek Jablonski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.