我来分享一下使用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都可以尝试。