jquery - 切换表 - 增加行跨度以容纳额外的切换行

标签 jquery css css-tables

我有一个表格,可以通过按钮或单击行进行切换。问题是当第一列跨越 2 行或更多行时,一切都会不同步。还希望底部边框在切换区域下方移动,并且悬停区域背景颜色与其他行对齐(由于 rowspan,目前仅适用于第一行)。希望这是有道理的,并且有人可以为此提供帮助。

$(document).ready(function() {
  $("#hide").click(function() {
    $(".toggle").hide();
  });
  $("#show").click(function() {
    $(".toggle").show();
  });
  $("#data tr td").click(function() {
    $(this).parents(".pointer").next().toggle();
  });
});
table {
  border-collapse: collapse;
  margin-top: 20px;
}

table,
th {
  border: solid 1px;
  padding: 10px;
}

tr:hover td {
    background: #e5e5e5;
}

.toggle {
  display: none;
}

.toggle.active {
  display: table-row;
}

.pointer {
  cursor: pointer;
  border: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<button id="hide">Hide All</button>
<button id="show">Show All</button>
<table>
  <tr>
    <th>header</th>
    <th>header</th>
    <th>header</th>
    <th>header</th>
    <th>header</th>
  </tr>
  <tbody id="data">
  <tr class="pointer">
      <td style="border-bottom:1px solid;" >DATA1</td>
      <td style="border-bottom:1px solid;">data1</td>
      <td style="border-bottom:1px solid;">data1</td>
      <td style="border-bottom:1px solid;">data1</td>
      <td style="border-bottom:1px solid;">data1</td>
    </tr>
    <tr class="toggle">
      <td></td>
      <td colspan="4">toggled area 1a</td>
    </tr>
    <tr class="pointer">
      <td  style="border-bottom:1px solid;" rowspan="2">DATA2</td>
      <td>data2</td>
      <td>data2</td>
      <td>data2</td>
      <td>data2</td>
    </tr>
    <tr class="toggle">
      <td></td>
      <td colspan="4">toggled area 2a</td>
    </tr>
    <tr class="pointer">
      <td style="border-bottom:1px solid;">data2</td>
      <td style="border-bottom:1px solid;">data2</td>
      <td style="border-bottom:1px solid;">data2</td>
      <td style="border-bottom:1px solid;">data2</td>
    </tr>
    <tr class="toggle">
      <td></td>
      <td colspan="4">toggled area 2b</td>
    </tr>
    <tr class="pointer">
      <td rowspan="3">DATA3</td>
      <td>data3</td>
      <td>data3</td>
      <td>data3</td>
      <td>data3</td>
    </tr>
    <tr class="toggle">
      <td></td>
      <td colspan="4">toggled area 3a</td>
    </tr>
    <tr class="pointer">
      <td>data3</td>
      <td>data3</td>
      <td>data3</td>
      <td>data3</td>
    </tr>
    <tr class="toggle">
     <td></td>
      <td colspan="4">toggled area 3b</td>
    </tr>
    <tr class="pointer">
      <td>data3</td>
      <td>data3</td>
      <td>data3</td>
      <td>data3</td>
    </tr>
    <tr class="toggle">
      <td></td>
      <td colspan="4">toggled area 3c</td>
    </tr>
  </tbody>
</table>

最佳答案

  • 首先将每个数据区域包裹在<tbody>中.
  • 所有 tr.toggle应该只有一个<td> 它应该有 colspan='4'
  • 只有第一个<td>每个 <tbody>有课.pointer和一个 rowspan等于所述 <tbody> 的初始可见行数. 例如 第一个<tbody>最初有一排所以td.pointer在那<tbody>有一个 rowspan='1'
  • <td>除了 <td>嵌套在 tr.toggle 中被点击并且现在可见,相应的.pointer rowspan增加 1。
  • .pointer rowspantr.toggle 时减 1不可见。
  • 最后<tr>数据区 1 和 2 有一个不可点击的 <td colspan='5'>其中包含 <hr> .

$("#all").on('click', function(e) {
  $(this).toggleClass('show hide');
  toggleRow(e);
});

$('.pointer').on('click', toggleRow);
$("td").not('.toggle > td').on('click', toggleRow);

function toggleRow(e) {
  if (e.target.matches('td')) {
    var toggle = $(this).parent().next('.toggle');
    var data = $(this).closest('tbody');
    var pointer = data.find('.pointer');
    var rowspan = Number(pointer.attr('rowspan'));
    toggle.toggle();
    if (toggle.is(':visible')) {
      pointer.prop('rowspan', `${rowspan+=1}`);
      if (e.target.matches('.borderA')) {
        data.find('.borderA').css('border-width', '0');
      }
    } else {
      pointer.prop('rowspan', `${rowspan-=1}`);
      if (e.target.matches('.borderA')) {
        data.find('.borderA').css('border-width', '1px');
      }
    }
  } else if (e.target.matches('#all')) {
    $('tbody').each(function() {
      var pointer = $(this).find('.pointer');
      var rows = $(this).children().length;
      var rowspan = Number(pointer.attr('rowspan'));
      if ($('#all').hasClass('hide')) {
        $('.toggle').show();
        pointer.attr('rowspan', rows);
        $(this).find('.borderA').css('border-width', '0');
      } else {
        $('.toggle').hide();
        pointer.attr('rowspan', rowspan);
        $(this).find('.borderA').css('border-width', '1px');
      }
    });
  }
  return false;
};
table {
  margin-top: 20px;
  border-spacing: 0;
}

table,
th {
  border: solid 1px #000;
}

tr:hover td,
tbody:hover .pointer {
  background: #e5e5e5;
}

.toggle {
  display: none;
  text-align: center
}

.pointer {
  border: 0;
  border-bottom: 1px solid #000;
}

.border,
.borderA {
  border-bottom: 1px solid #000;
}

#all {
  width: 10ch;
}

#all.hide::before {
  content: 'Hide ';
}

#all.show::before {
  content: 'Show ';
}
<button id="all" class='show'>All</button>

<table>
  <thead>
    <tr>
      <th>header</th>
      <th>header</th>
      <th>header</th>
      <th>header</th>
      <th>header</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th class="pointer show" rowspan='1'>DATA1</th>
      <td class='borderA'>data1</td>
      <td class='borderA'>data1</td>
      <td class='borderA'>data1</td>
      <td class='borderA'>data1</td>
    </tr>
    <tr class="toggle">
      <td class='border' colspan="4">1A</td>
    </tr>
  </tbody>
  <tbody>
    <tr>
      <th class='pointer show' rowspan="2">DATA2</th>
      <td>data2</td>
      <td>data2</td>
      <td>data2</td>
      <td>data2</td>
    </tr>
    <tr class="toggle">
      <td colspan="4">2A</td>
    </tr>
    <tr>
      <td class='borderA'>data2</td>
      <td class='borderA'>data2</td>
      <td class='borderA'>data2</td>
      <td class='borderA'>data2</td>
    </tr>
    <tr class="toggle">
      <td class='border' colspan="4">2B</td>
    </tr>
  </tbody>
  <tbody>
    <tr>
      <th class="pointer show" rowspan="3">DATA3</th>
      <td>data3</td>
      <td>data3</td>
      <td>data3</td>
      <td>data3</td>
    </tr>
    <tr class="toggle">
      <td colspan="4">3A</td>
    </tr>
    <tr>
      <td>data3</td>
      <td>data3</td>
      <td>data3</td>
      <td>data3</td>
    </tr>
    <tr class="toggle">
      <td colspan="4">3B</td>
    </tr>
    <tr>
      <td class='borderA'>data3</td>
      <td class='borderA'>data3</td>
      <td class='borderA'>data3</td>
      <td class='borderA'>data3</td>
    </tr>
    <tr class="toggle">
      <td class='border' colspan="4">3C</td>
    </tr>
  </tbody>
</table>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

关于jquery - 切换表 - 增加行跨度以容纳额外的切换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56695010/

相关文章:

css - 是否可以在 xHTML strict 1.0 中使用 CSS 渲染空的 <div style ="width:50%"> </div> 而无需以像素为单位设置宽度和高度?

表格 Rowspan 与 Fluid Height 的 CSS 等价物

html - 具有动态大小的 CSS div 表行

css - 如何创建固定标题和 100% 内部容器?

html - 设置其他元素左侧的 float 后,位置粘性不起作用

jquery - 应该测试哪些浏览器功能来选择正确的文件上传插件?

javascript - ScrollTop 适用于 Chrome 和 Edge,但不适用于 Firefox

javascript - selectize js - 用于多选/标记的返回键 [⏎] 分隔符

javascript - CSS 中不规则多边形的悬停效果

javascript - 如何删除数组中的重复项? (不是变成唯一的,而是删除下一个值) PHP