【问题标题】:HTML / Javascript - Expand and collapse table rows (childs) by clicking on a parent rowHTML / Javascript - 通过单击父行展开和折叠表行(子行)
【发布时间】:2017-04-08 18:35:58
【问题描述】:

我一直在尝试解决一个问题,终于明白没有帮助我不会成功......我想做一件我们每天在互联网上看到的常见事情:能够点击表格行以显示更多细节。但是这里的更多细节不是指文本块,而是与父行具有相同形状的子行。

这是一个 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>

孩子和父母的数量是灵活的,我想要一个具有该特性的灵活管理示例。加载页面时必须关闭子行,并且仅当用户单击父行时才展开。 如果还有可能,我想添加一个图标,指示用户可以单击一行(基本上是“+”和“-”),但不是简单的字符串,而是一个真正的图标。

我看过并关注了很多examples,但没有一个人能完美地完成这项工作,并试图修改示例......没有成功。其中大部分是基于 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”。

谢谢。

【问题讨论】:

    标签: javascript jquery html css zurb-foundation


    【解决方案1】:

    为此,您需要将每组父级 + 子级封装在 &lt;tbody&gt; 中,并使用一个小脚本来切换此父级 &lt;tbody&gt; 上的类名。这是一个例子:

    $('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>

    【讨论】:

    • 对不起,我的回答迟了,我今天要试一试,如果它有效,我会告诉你。谢谢。
    • 非常感谢 Andrei,我对您的解决方案非常满意。通过给出我的一般例子,我没有考虑一个问题,我在我编辑的帖子中给了你一些解释,你能帮我吗? @AndreiGheorghiu
    • @C.Brn:如果您希望仅在单击箭头时发生切换,请在我提供的 jQuery 代码中将 'tr.parent' 更改为 'tr.parent .fa-chevron-down'。更新了答案。您可能还想增加它的填充(现在它很小 - 很难点击)。为此使用.parent i {margin: -.5rem;padding:.5rem}
    • 哇哦,我不知道可以这么容易地纠正它。非常感谢你的帮助。似乎完美无缺,没有任何点击错误。关于您的 CSS 更正,这很好,但感谢您提供这些进一步的信息。
    • 这只是语言,@C.Brn。一旦你说出它们,它们就会变得有意义。你会到达那里。重新阅读您对答案的编辑,是的,您提出的选择器会起作用,但保留.parent 部分(您只需要在.parent 内时才需要它):) 编码愉快!
    猜你喜欢
    • 2016-02-02
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多