Cây trong Twitter Bootstrap [đã đóng]


108

Tôi đã cố gắng làm việc để tạo một cây (như cây thư mục) sử dụng càng nhiều CSS và càng ít JS càng tốt (chỉ cho các trạng thái, v.v.) và tôi muốn biết liệu có một số plugin cây hiện có tốt cho bootstrap không hoặc jquery-ui bootstrap .


Để tham khảo hoặc cho những người bối rối về câu hỏi này, tôi đang tìm kiếm một cái gì đó như dynatree cho bootstrap.

Câu trả lời:


181

Dựa trên CSS của VitaliyjQuery của Mehmet , tôi đã thay đổi các athẻ thành spanthẻ và kết hợp một số Glyphicons và huy hiệu vào tiện ích cây Bootstrap của tôi .

Thí dụ: tôi sử dụng tiện ích cây Bootstrap

Để có thêm tín dụng, tôi đã tạo một Biểu tượng Githubdự án GitHub để lưu trữ mã jQuery và LESS để thêm thành phần cây này vào Bootstrap. Vui lòng xem tài liệu dự án tại http://jhfrench.github.io/bootstrap-tree/docs/example.html .

Ngoài ra, đây là nguồn ÍT để tạo CSS đó (JS có thể được chọn từ 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;
    }
}

làm tốt. Tất nhiên, ngoại trừ những hành vi kỳ quặc của những đứa trẻ li ti .parent_limất màu nền và trở nên xám xịt khi bố mẹ chúng được di chuột qua (trong cây thứ hai của bạn).
kumarharsh

Cảm ơn @Harsh. Hành vi di chuột mà bạn cho là kỳ lạ tuân theo lập trình của Vitaliy để cung cấp cho người dùng chỉ báo trực quan về các nút nào sẽ bị thu gọn.
Jeromy French

1
@JeromyFrench Cây này trải nghiệm rất đẹp, mượt mà. Chính xác là những gì tôi đang theo đuổi khi tôi tìm kiếm. Làm tốt lắm.
Nathan Moos

5
cảm ơn vì mã. làm thế nào để bạn thu gọn mặc định? khi bạn truy cập trang tôi muốn nó được thu gọn? bạn có thể giúp tôi? cảm ơn.
Erdem Ece

5
jsfiddle.net/jayhilwig/hv8vU :: Tôi đã cập nhật mã và fork một fiddle mới tại đây cho bootstrap 3.0:
jayseattle

79

Bạn có thể tin rằng treeview trong hình ảnh dưới đây không sử dụng bất kỳ JavaScript nào mà chỉ dựa vào CSS3? Hãy xem CSS3 TreeView này , nó tốt với Twitter BootStrap:

TreeView

Bạn có thể biết thêm thông tin về điều này tại đây http://acidmartin.wordpress.com/2011/09/26/css3-treevew-no-javascript/ .


wow ... Đây là một trong những tốt ... tôi sẽ phải nhìn vào này ... cảm ơn ...
kumarharsh

1
@Harsh Chắc chắn rồi, bootstrap của nó đã sẵn sàng và vui lòng chấp nhận câu trả lời của tôi nếu nó hữu ích. :) PS: Chúng tôi đang sử dụng nó. :)
Praveen Kumar Purushothaman

Giải pháp này có vẻ tốt, nhưng có một vài tính năng mà chúng tôi muốn và không được cung cấp trong phiên bản này, chẳng hạn như làm nổi bật nhánh, v.v. Nhưng dù sao, nó là một ví dụ rất tốt về cách tạo kiểu cây
kumarharsh

1
tìm thấy một đẹp dụ thecssninja.com/demo/css_tree
Surya

1
Đáng chú ý là bài đăng trên blog được đề cập trong câu trả lời chứa một số CSS đơn giản, không hoạt động với tôi, nhưng bản demo thực tế chứa một số CSS phức tạp hơn (và không được giải thích).
Robin Green

53

Nếu ai đó muốn phiên bản treeview theo chiều dọc từ câu trả lời của Harsh, bạn có thể tiết kiệm thời gian:

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
Đơn giản và thanh lịch. Bình chọn :)
thefourtheye

1
Chỉ là giải pháp hoàn hảo!
CORSAIR

Chà, giải pháp tuyệt vời - và có thể mở rộng dễ dàng!
rkallensee

Chức năng mở rộng thu gọn ở đâu?
Syed Aqeel Ashiq

41

Đối với những người vẫn đang tìm kiếm một cây với CSS3, đây là một đoạn mã tuyệt vời mà tôi tìm thấy trên mạng:

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: ngoài mã, tôi cũng thích cách trang web hiển thị nó trong hoạt động ... thực sự sáng tạo.


5
Đây không thực sự là bất cứ thứ gì giống như loại cây mà bạn đã đề xuất trong câu hỏi của mình. Tôi tin Praveen Kumar nên được trao tặng với câu trả lời của ông
Blowsie

2
Tôi đang tìm kiếm một cái cây giống như cái đầu tiên, thấy câu trả lời này và quyết định sử dụng cái này thay thế. Thật buồn cười làm sao cảm hứng có thể thay đổi một giải pháp!
Eric

2
@Blowsie: Tôi đã xem xét đề xuất của bạn và công lý đã được thực thi, lol. Thật tốt khi thấy một dự án độc lập phát triển do một số yêu cầu ngẫu nhiên của một số người ngẫu nhiên.
kumarharsh


36

Nếu ai đó muốn phiên bản treeview có thể mở rộng / thu gọn từ câu trả lời của Vitaliy Bychik, bạn có thể tiết kiệm thời gian :)

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();
    });
});

:) đẹp! Ý kiến ​​hay +1.
Alex

1
Tôi đã thêm $ ('. Tree> ul> li: first-child'). Show (); để hỗ trợ nhiều cây trên trang. Cảm ơn
lạc84

8

Một plugin jquery Treeview tuyệt vời khác là http://www.jstree.com/

Để xem trước, bạn nên kiểm tra jquery-treetable
http://ludo.cubicphuse.nl/jquery-plugins/treeTable/doc/


Theo trang web, nó không được hỗ trợ nữa kể từ tháng 4 năm 2010
levelnis

Ồ, thật tiếc khi nó không được hỗ trợ ... có vẻ tốt.
kumarharsh

3
Xin chào, cả hai thư viện đều được cập nhật và được hỗ trợ
Gal Margalit

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.