【问题标题】:Using CSS transition and class toggle to show/hide table rows使用 CSS 过渡和类切换来显示/隐藏表格行
【发布时间】:2021-08-16 20:35:16
【问题描述】:

我有许多包含许多行的表。我想最初只显示前三个表格行。当用户单击显示/隐藏链接时,所有隐藏的行都将被切换。到目前为止,我已经通过 CSS3 和 JavaScript (see Fiddle) 实现了这一点。

CSS(默认只显示三行):

.hide tr:nth-child(n+4) {
  display:none;
}

JavaScript(切换上面的类以显示所有行):

function ShowHide() {
  var tables = document.getElementsByClassName('foo');
  for(i=0; i<tables.length; i++) {
    tables[i].classList.toggle("hide");  
  }
}

是否可以使用 CSS3 的 transition 功能使行缓慢而不是立即出现?例如,淡入/淡出超过 2 秒?

我知道这可以在 JQuery 中轻松完成,但我正在寻找一个纯 CSS 解决方案。

【问题讨论】:

  • 您无法转换 display 属性 - stackoverflow.com/questions/3331353/…
  • display 不是可转换的属性。您可以将高度设置为 0 并隐藏溢出以“隐藏”这些行,但您也不能转换到 height:auto,因此您要么必须使用指定的高度(只有在您知道有多高时才有意义)行将是预先的),或者至少在那时涉及 JS 以确定过渡到的必要目标高度。
  • 您可以过渡 opacity css 属性,使项目慢慢呈现底层背景的颜色,这与褪色效果基本相同。然后,您可以添加一个transitionend 事件处理程序,以便在不透明度达到 0 时实际将显示设置为无,反之亦然。

标签: javascript html css


【解决方案1】:

做到这一点的最佳方法确实是使用高度和不透明度。 但是你不能在表格元素上设置高度(tr/td)

所以这里是一个关于如何只使用 CSS 的示例

#expand {
 /* hide the checkbox */
 display: none
}

label {
  /* style as a button (you can't use button inside label with for attribute) */
  padding: 2px 5px;
  border: 1px solid rgba(0,0,0,.2);
  border-radius: 5px;
  font-size: .7rem;
  cursor: pointer;
}

table {
  border-spacing: 0;
  border-collapse: collapse;
}

table tr:nth-child(n+4)>td {
  padding: 0;
}

table tr:nth-child(n+4)>td>div {
  opacity: 0;
  max-height: 0;
  transition: all 250ms ease-in;
}

#expand:checked + table tr:nth-child(n+4)>td {
  padding: 1px;
  /* default */
}

#expand:checked + table tr:nth-child(n+4)>td>div {
  opacity: 1;
  /* try to use something just slightly above the true height */
  max-height: 20px;
  overflow: hidden;
  transition-timing-function: ease-out;
}
<input type="checkbox" id="expand"/>
<table id="table">
  <tbody>
    <tr>
      <td>
        <div>Row 1</div>
      </td>
    </tr>
    <tr>
      <td>
        <div>Row 2</div>
      </td>
    </tr>
    <tr>
      <td>
        <div>Row 3</div>
      </td>
    </tr>
    <tr>
      <td>
        <div>Row 4</div>
      </td>
    </tr>
    <tr>
      <td>
        <div>Row 5</div>
      </td>
    </tr>
    <tr>
      <td>
        <div>Row 6</div>
      </td>
    </tr>
    <tr>
      <td>
        <div>Row 7</div>
      </td>
    </tr>
    <tr>
      <td>
        <div>Row 8</div>
      </td>
    </tr>
    <tr>
      <td>
        <div>Row 9</div>
      </td>
    </tr>
    <tr>
      <td>
        <div>Row 10</div>
      </td>
    </tr>
  </tbody>
</table>
<br/>
<label for="expand">Toggle</label>

编辑

隐藏列的类似技巧:

#expand {
  /* hide the checkbox */
  display: none
}

label {
  /* style as a button (you can't use button inside label with for attribute) */
  padding: 2px 5px;
  border: 1px solid rgba(0, 0, 0, .2);
  border-radius: 5px;
  font-size: .7rem;
  cursor: pointer;
}

table {
  border-spacing: 0;
  border-collapse: collapse;
}

tr>*:nth-child(n+2)>div {
  opacity: 0;
  max-width: 0;
  overflow: hidden;
  white-space: nowrap;
  transition: all 250ms ease-in;
}

#expand:checked+table tr>*:nth-child(n+2)>div {
  max-width: 100%;
  opacity: 1;
  transition-timing-function: ease-out;
}
<input type="checkbox" id="expand" />
<table id="table">
  <thead>
    <tr>
      <th>Column1</th>
      <th>
        <div>Column2</div>
      </th>
      <th>
        <div>Column3</div>
      </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>
        <div>Cell 1-1</div>
      </td>
      <td>
        <div>Cell 1-2</div>
      </td>
      <td>
        <div>Cell 1-3</div>
      </td>
    </tr>
    <tr>
      <td>
        <div>Cell 2-1</div>
      </td>
      <td>
        <div>Cell 2-2</div>
      </td>
      <td>
        <div>Cell 2-3</div>
      </td>
    </tr>
    <tr>
      <td>
        <div>Cell 3-1</div>
      </td>
      <td>
        <div>Cell 3-2</div>
      </td>
      <td>
        <div>Cell 3-3</div>
      </td>
    </tr>
  </tbody>
</table>
<br/>
<label for="expand">Toggle</label>

【讨论】:

  • 进行了编辑以使用纯 css 解决方案。如果你想要一个带有 javascript 的切换类,你可以查看历史记录
  • 我想知道我是否可以水平地做到这一点
  • @AzharUddinSheikh 你的意思是隐藏一些特定的列?
  • @AzharUddinSheikh 我为列添加了类似的内容
【解决方案2】:

根据您的 Fiddle 代码实现我的“您可以使用不透明度来模拟褪色”评论。

var theButton = document.getElementById("bar");
theButton.onclick = ShowHide;

function ShowHide() {
  var tables = document.getElementsByClassName('foo');
  for(i=0; i<tables.length; i++) {
  	tables[i].classList.toggle("hide");  
  }
}
td { border-bottom:1px solid #ccc; }

.foo tr:nth-child(n+4) {
  display: block;
  opacity: 1;
  transition: opacity 2s ease-in-out;
}

.foo.hide tr:nth-child(n+4) {
  opacity: 0;
  transition: opacity 2s ease-in-out;
}

.foo.gone tr:nth-child(n+4) {
  display: none;
}
<p>
 <input type="button" id="bar" value="Show/Hide" />
</p>

<h2>Table 1</h2>
<table class="foo hide">
  <tr><td>Text</td></tr>
  <tr><td>Text</td></tr>
  <tr><td>Text</td></tr>
  <tr><td>Text</td></tr>
  <tr><td>Text</td></tr>
  <tr><td>Text</td></tr>
</table>

<h2>Table 2</h2>
<table class="foo hide">
  <tr><td>Text</td></tr>
  <tr><td>Text</td></tr>
  <tr><td>Text</td></tr>
  <tr><td>Text</td></tr>
  <tr><td>Text</td></tr>
  <tr><td>Text</td></tr>
</table>

您可以选择在表格中包含 transitionstarts 和 transitionend 事件,以便在转换完成后切换 .gone 类以切换其显示属性。这样您就可以保留定位等内容,因为不透明度为 0 的元素仍会占用页面空间。

【讨论】:

  • 嗯,很有趣。谢谢你。目标是通过隐藏某些行来减少表使用的空间,因此这不是理想的结果。您引用的事件是 CSS 规范的一部分,还是 JavaScript 的一部分?
  • Javascript。因此我提到了,因为通常确实是为了确保桌子正确折叠。我将添加相关代码。
  • 如果您唯一需要做的就是切换 CSS 属性,那么像 Apollo 显示的那样,将最大高度与不透明度结合起来可能比 transitionend 更适合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 2013-11-16
  • 2014-09-13
  • 2022-12-14
  • 2012-04-29
  • 1970-01-01
相关资源
最近更新 更多