我來分享一下使用table來做出tree結構。這篇文章目的只是提供給大家一個思路,還有各種各樣的類似方法可以達到同樣的效果。
這個主要用於需要顯示層級結構,同時每一個層級也要顯示多個屬性,比如名稱,排序。。。比如下面這個商品分類的層級:
主要的思想就是table嵌套table,先把html代碼放出來再做解釋:
- <table id="listTable" class="list">
- <thead>
- <tr>
- <th>名稱</th>
- <th>排序</th>
- </tr>
- </thead>
- <tbody>
- <tr class="outer">
- <td><span class="switch"></span><span class="ico"></span><span class="name">A</span></td>
- <td>1</td>
- </tr>
- <tr class="inner">
- <td colspan="2">
- <table class="list">
- <tr class="outer">
- <td><span class="text-indent"></span><span class="switch"></span><span class="ico"></span><span class="name">B</span></td>
- <td>2</td>
- </tr>
- <tr class="inner">
- <td colspan="2">
- <table class="list">
- <tr class="leaf">
- <td><span class="text-indent"></span><span class="text-indent"></span><span class="switch"></span><span class="ico"></span><span class="name">C</span></td>
- <td>3</td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr class="leaf">
- <td><span class="switch"></span><span class="ico"></span><span class="name">D</span></td>
- <td>4</td>
- </tr>
- <tr class="outer">
- <td><span class="switch"></span><span class="ico"></span><span class="name">E</span></td>
- <td>5</td>
- </tr>
- <tr class="inner">
- <td colspan="2">
- <table class="list">
- <tr class="leaf">
- <td><span class="text-indent"></span><span class="switch"></span><span class="ico"></span><span class="name">F</span></td>
- <td>6</td>
- </tr>
- </table>
- </td>
- </tr>
- </tbody>
- </table>
從代碼里可以看出,我們用outer或者leaf來寫每一個層級,然后用inner來包含前一個outer的子集,需要注意的是,有一個outer,那么下一個必須是inner,這樣子才符合層級關系。
然后里面的text-indent,switch,icon用來控制縮進空間和圖片。第一層沒有text-indent,第二層一個text-indent,以此類推。。。
然后就是css:
css沒什么說的,主要一點是下面的代碼。用來確保inner和outer的每一個單元格大小一樣,對齊
- .list td,
- .list th {
- box-sizing: border-box;
- }
這里一點不好的是,table的寬度必須為定寬,如果不是的話,可能會造成單元格不對其。。。然后就是處理各種情況下的switch和icon
最后是js:
- function resize(){
- $(".list thead th").each(function(index){
- var width = $(this).width();
- $(".list .outer td:nth-child(" + index + ")").css("width", width);
- $(".list .leaf td:nth-child(" + index + ")").css("width", width);
- });
- }
- resize();
- $(window).resize(resize);
- $(".switch").click(function(){
- if($(this).parents(".outer").is(".open")){
- $(this).parents(".outer").removeClass("open").next(".inner").removeClass("open");
- }else{
- $(this).parents(".outer").addClass("open").next(".inner").addClass("open");
- }
- });
- $("tr.outer, tr.leaf").click(function(){
- $("tr.focus").removeClass("focus");
- $(this).addClass("focus");
- });
js中首先最重要要做的就是處理每一格的寬度,保證inner和outer每一個單元格大小一樣,對齊。
然后其實就是增加和刪除Open。
使用table來生成類tree結構有一個極大地缺點,根據文章:http://www.gbtags.com/gb/share/5546.htm 得知,table在瀏覽器渲染的時候,是需要通過多次渲染的,所以這么多的table使用極大地影響了頁面速度。或許可以考慮使用ul, li的組合也不錯。或者dt, dl, dd都可以嘗試。
原文鏈接:http://www.gbtags.com/gb/share/5561.htm


