HTML / Javascript - 点击父行以展开和折叠表格行(子行)

13

我已经试了几天来解决一个问题,最终明白如果没有帮助就不可能成功... 我想做一个我们在网上每天都能看到的普通事情:点击表格行以显示更多细节。 但是这里的更多细节并不是一段文本块,而是具有与父行相同形状的子行。

这是一个 HTML 表格示例:

<table class="collapse table">
<tr>
    <th>Age</th>
    <th>Sex</th>
    <th>Name</th>
    <th>From</th>
</tr>
<tr class="parent">
    <td>100</td>
    <td>M</td>
    <td>Dodo</td>
    <td>UK</td>
</tr>
<tr class="cchild">
    <td>10</td>
    <td>M</td>
    <td>Child</td>
    <td>UK</td>
</tr>
<tr class="cchild">
    <td>10</td>
    <td>M</td>
    <td>Child</td>
    <td>UK</td>
</tr>
<tr class="cchild">
    <td>10</td>
    <td>M</td>
    <td>Child</td>
    <td>UK</td>
</tr>
<tr class="parent">
    <td>100</td>
    <td>M</td>
    <td>Dodo</td>
    <td>UK</td>
</tr>
<tr class="cchild">
    <td>10</td>
    <td>M</td>
    <td>Child</td>
    <td>UK</td>
</tr>
<tr class="cchild">
    <td>10</td>
    <td>M</td>
    <td>Child</td>
    <td>UK</td>
</tr>
<tr class="cchild">
    <td>10</td>
    <td>M</td>
    <td>Child</td>
    <td>UK</td>
</tr>

子行和父行的数量是灵活的,我想要一个例子来管理这个特性。当页面加载时,子行必须关闭,并且只有在用户点击父行时才会展开。 如果可能的话,我希望添加一个图标,告诉用户可以点击一行(基本上是“+”和“-”),但不是简单的字符串,而是真正的图标。

我已经看过并尝试了许多例子,但没有一个完美地完成了我的需求,尝试修改这些例子......但都没有成功。其中大多数是基于Datatables的示例,而我不想使用它。

你能帮我吗?我知道我的问题相当复杂,我请求您做很多工作,但是仅使用HTML、CSS、Javascript找到符合我的要求的完整示例非常困难。

谢谢。

在Andrei Gheorghiu回答后进行编辑:

最后,我希望只能点击图标而不是整行,因为同一行还有其他按钮,如果我点击它,就会激活子行的展开。所以,等待更好的解决方案之前,我所做的是:

HTML: 将“tr”更改为特定的“td”类,并在此“td.toto”类中添加图标行。

JS:

$('table').on('click', 'td.toto', function(){
  console.log("Check click works: ");
  $(this).closest('tbody').toggleClass('open');
});

那么,按照您的解决方案结构,只更改点击目标是否可能?通过更好的解决方案,我的意思是现在仅点击图标而不是整个"td"。

谢谢。

1个回答

18

为此,您需要将每个父级+子级组包装在一个<tbody>中,并使用一个小脚本在这个父级<tbody>上切换类名。这是一个例子:

$('table').on('click', 'tr.parent .fa-chevron-down', function(){
  $(this).closest('tbody').toggleClass('open');
});
.parent ~ .cchild {
  display: none;
}
.open .parent ~ .cchild {
  display: table-row;
}
.parent {
  cursor: pointer;
}
tbody {
  color: #212121;
}
.open {
  background-color: #e6e6e6;
}

.open .cchild {
  background-color: #999;
  color: white;
}
.parent > *:last-child {
  width: 30px;
}
.parent i {
  transform: rotate(0deg);
  transition: transform .3s cubic-bezier(.4,0,.2,1);
  margin: -.5rem;
  padding: .5rem;
 
}
.open .parent i {
  transform: rotate(180deg)
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">

<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
<link rel="stylesheet"
      href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" />

<div class="container">
    <table class="table">
        <tr>
            <th>Age</th>
            <th>Sex</th>
            <th>Name</th>
            <th colspan="2">From</th>
        </tr>

        <tbody>
        <tr class="parent">
            <td>100</td>
            <td>M</td>
            <td>Dodo</td>
            <td>UK</td>
            <td><i class="fa fa-chevron-down"></i></td>
        </tr>
        <tr class="cchild">
            <td>10</td>
            <td>M</td>
            <td>Child</td>
            <td colspan="2">UK</td>
        </tr>
        <tr class="cchild">
            <td>10</td>
            <td>M</td>
            <td>Child</td>
            <td colspan="2">UK</td>
        </tr>
        <tr class="cchild">
            <td>10</td>
            <td>M</td>
            <td>Child</td>
            <td colspan="2">UK</td>
        </tr>
        </tbody>
        <tbody>
        <tr class="parent">
            <td>100</td>
            <td>M</td>
            <td>Dodo</td>
            <td>UK</td>
            <td><i class="fa fa-chevron-down"></i></td>
        </tr>
        <tr class="cchild">
            <td>10</td>
            <td>M</td>
            <td>Child</td>
            <td colspan="2">UK</td>
        </tr>
        <tr class="cchild">
            <td>10</td>
            <td>M</td>
            <td>Child</td>
            <td colspan="2">UK</td>
        </tr>
        <tr class="cchild">
            <td>10</td>
            <td>M</td>
            <td>Child</td>
            <td colspan="2">UK</td>
        </tr>
        </tbody>
    </table>
</div>


抱歉回复晚了,我今天会尝试一下并告诉你它是否有效。谢谢。 - C.Brn
非常感谢你,Andrei。你的解决方案几乎完美地满足了我的需求。我在提供一般示例时没有考虑到一个问题,我在编辑后的帖子中给出了一些说明,请问你能帮我吗?@AndreiGheorghiu - C.Brn
@C.Brn:如果你想要箭头点击后才出现切换效果,请将 jQuery 代码中的 'tr.parent' 改为 'tr.parent .fa-chevron-down'。回答已更新。你可能还需要增加其填充值(当前很小,不容易点击),可以使用 .parent i {margin: -.5rem;padding:.5rem} 来实现。 - tao
哇,我不知道它可以这么容易地被修正。非常感谢你的帮助。似乎没有任何点击错误,完美运行。关于你的CSS修正,已经很好了,但还是谢谢你提供进一步的信息。 - C.Brn
这只是语言问题,@C.Brn。一旦你掌握了它们,它们就会很容易理解。你会成功的。重新阅读你编辑过的答案,是的,你提出的选择器也可以工作,但要保留.parent 部分(仅当它在 .parent 中时才需要)。祝编码愉快! - tao
@tao,您的答案是否可以集成嵌套可折叠行?也就是说,一个可折叠的行内部有多个可折叠的行。 - JoaoBM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接