22

在我页面的一部分上,我使用 css3 过渡来显示/隐藏一些具有良好滑动效果的 div

.service_status {
        max-height: 0;
    -webkit-transition: max-height 1s ease-in-out;
    -moz-transition: max-height 1s ease-in-out;
    -ms-transition: max-height 1s ease-in-out;
    -o-transition: max-height 1s ease-in-out;
    transition: max-height 1s ease-in-out;
}

.service_status.open {
    max-height: 500px;
    -webkit-transition: max-height 1s ease-in-out;
    -moz-transition: max-height 1s ease-in-out;
    -ms-transition: max-height 1s ease-in-out;
    -o-transition: max-height 1s ease-in-out;
    transition: max-height 1s ease-in-out;
}

我想在某些表格行上使用相同的技术,但 max-height 和 height 没有任何效果(我猜是由于表格的 CSS 规范)。有没有一种方法可以仅使用 CSS3 过渡而不使用 js 来显示/隐藏带有动画的表格行?

4

7 回答 7

18

更新:

事实上,我之前的回答确实回答了这个问题!但不是绝对明确。这就像:“嘿,想法就在这里,只要将它应用到任何你想要的地方”。我认为解决方案的本质很清楚,任何人都可以使用它......但无论如何,我会以最清晰的方式公开整个想法,并将解决方案应用于一个简单的表(因为 OP 没有显示任何结构)。


解决方案:

精简版:

使用 Div 将内容包装到单元格中,我们可以使用 max-height 属性以及 max-height 转换。使用自定义过渡曲线,我们可以“屏蔽”使用高最大高度的延迟。

在这里演示:http: //jsfiddle.net/1rnc9bbm/4/


长版:

整个问题是表格单元格的高度是适合其内容的最小值,而表格行的高度是所有单元格所需的最小高度(因此,表格行的高度是其最高单元格所需的最小高度)。

从 W3(关于表格单元格高度):

在 CSS 2.1 中,单元格框的高度是内容所需的最小高度。

从 W3(关于表行高度):

'table-row' 元素框的高度是在用户代理拥有该行中的所有单元格可用时计算的:它是该行计算的“高度”的最大值,该行中每个单元格的计算“高度”,以及单元格所需的最小高度 (MIN)

在这种情况下,我们唯一的选择是使用内部标记间接限制高度,通常是 div 元素。因为 Div 元素尊重最大高度,它会拉伸我们的内容,并且我们的表格单元格也将尊重“div 的最大高度”,因为这是它所需的所有高度。

最大高度转换的问题只是延迟,由转换的计算方式引起。在表格中,通常您显示的动态内容具有动态且不可预测的长度(变为表格单元格高度),因此我们不知道我们的表格需要精确的最大高度才能完全适合展开的内容。因此,我们需要设置一个更高的最大高度,这将超过某些单元格的需要。当它发生时,我们的过渡计算错误(基于最大高度而不是将显示/动画的总高度),并且动画变得奇怪和不精确。为了向用户展示一个漂亮而平滑的过渡,我找到了一个使用自定义过渡曲线的绝妙解决方案。有关此问题及其解决方案的更多详细信息在此答案的末尾。

好吧,我们有我们的“最大高度尊重元素”,我们最大高度动画的平滑过渡,以及我们的桌子......现在是时候把所有东西放在一起了:


html:

<table>
    <tr>
        <td>
            <div>
                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris ac lorem ante. Vestibulum quis magna pretium, lacinia arcu at, condimentum odio. Ut ultrices tempor metus, sit amet tristique nibh vestibulum in. Pellentesque vel velit eget purus mollis placerat sed sit amet enim. Sed efficitur orci sapien, ac laoreet erat fringilla sodales.
            </div>
        </td>
    </tr>
</table>

CSS:

table{
    border: 1px solid #ddd;
}


div{
    background-color: #ddd;
    width: 400px;

    overflow: hidden;
    -webkit-transition: max-height 1.5s cubic-bezier(0, 1.05, 0, 1);
    -moz-transition: max-height 1.5s cubic-bezier(0, 1.05, 0, 1);
    transition: max-height 1.5s ease cubic-bezier(0, 1.05, 0, 1);

    max-height: 38px;
}

div:hover{
    -webkit-transition: max-height 2s ease;
    -moz-transition: max-height 2s ease;
    transition: max-height 2s ease;

    max-height: 400px;
}

这里的简单演示(上面显示的代码):http: //jsfiddle.net/1rnc9bbm/3/,这里有一个更完整(和常见)的表格演示:http: //jsfiddle.net/1rnc9bbm/4/

我不认为反对票是公平的,但我同意这个版本现在更加完整,并且确实以明确的方式回答了 OP 的问题。如果您有任何问题或需要我澄清的观点,您无需投票(请),只需在上方提问/评论即可。如果可以的话,我会很乐意提供帮助。

Obs:OP没有提供Html,也没有提供他想要扩展的表格的详细信息,所以我的整个解决方案都是基于通常的表格使用。


上一个(原始)答案:

我只是在这里的另一个问题中回答了这种确切的情况。在我的具体情况下,我需要完全按照你所说的去做。我有一个表格,当用户悬停它时想要展开一个表格行。

同样的答案适用于您的问题:
https ://stackoverflow.com/a/27773588/3395460


链接答案(具有高于容器需要的最大高度值的平滑过渡):

正如@maskacovnik 所指出的,如果它还包含我的第一个答案的代码以及解释我更新答案的部分解决方案的代码,它将是一个更完整(和完整)的答案。就这个:

[...] 当用户悬停单元格时,我需要在单元格表中显示产品描述的模式详细信息。在没有用户悬停的情况下,最多只显示 2 行描述。一旦用户悬停它,所有行(文本可以是 1 到 8 行,动态且不可预测的长度)必须以某种高度动画显示。

我遇到了同样的困境,并选择使用最大高度过渡(设置一个高最大高度,我确信这不会削减我的文本),因为在我看来这种方法是最干净的动画解决方案高度。

但我对“上滑”动画的延迟不满意,就像你一样。那时我在这里找到了关于过渡曲线的评论:http: //css3.bradshawenterprises.com/animating_height/

这家伙的idea很牛逼,但光是这个解决方案就“截断”了“滑下”动画的效果。所以稍微想了想,我就得出了最终的解决方案。

所以这是我使用 Rhys 的想法的解决方案(上面链接的人):

向下滑动动画(悬停),带有“平滑增长”,向上滑动动画没有(实际上)“延迟”:

div {
  background-color: #ddd;
  width: 400px;
  overflow: hidden;
  -webkit-transition: max-height 1.5s cubic-bezier(0, 1.05, 0, 1);
  -moz-transition: max-height 1.5s cubic-bezier(0, 1.05, 0, 1);
  transition: max-height 1.5s cubic-bezier(0, 1.05, 0, 1);
  max-height: 38px;
}
div:hover {
  -webkit-transition: max-height 2s ease;
  -moz-transition: max-height 2s ease;
  transition: max-height 2s ease;
  max-height: 400px;
}

<div>
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris ac lorem ante. Vestibulum quis magna pretium, lacinia arcu at, condimentum odio. Ut ultrices tempor metus, sit amet tristique nibh vestibulum in. Pellentesque vel velit eget purus mollis
  placerat sed sit amet enim. Sed efficitur orci sapien, ac laoreet erat fringilla sodales.
</div>

这是一个完美的(在我看来)菜单、描述和一切不是非常不可预测的解决方案,但是正如你之前指出的那样,需要设置一个高的最大高度,并且可能会切断一个令人惊讶的高度动态内容。在这种特定情况下,我将使用 jQuery/JavaScript 来为高度设置动画。由于内容的更新已经使用某种 JavaScript 完成,所以我看不出使用 Js 动画方法有什么害处。


希望我有所帮助!

于 2015-01-05T20:34:55.680 回答
9

您不能将高度过渡应用于<td><tr>元素。但是,如果您可以<td>用 a 包裹元素的内容,则<div>可以将 CSS 转换应用于<div>元素。

HTML:

<tr>
  <td><div>Contents</div></td>
  <td><div>Contents</div></td>
</tr>

CSS:

tr div {
  max-height:0;
  transition: max-height 1s ease-in-out;
}
tr.open div {
  max-height: 500px;
}
于 2014-07-27T15:51:47.680 回答
3

Line Height: 干得好。

var doc = document;
var myElements = doc.querySelectorAll("[data-row='047384']");

if(myElements.length > 0){
  myElements[0].addEventListener("click", function(){
    showRows(myElements);
  });
}

function showRows(elements){
  for (var i = 0; i < elements.length; i++) {
    if(elements[i].tagName.toLowerCase() !== 'button'){
      elements[i].classList.toggle('show');
    }
  }
}
.table-part-row{
  line-height:0;
  transition: 1s;
  opacity: 0;
}
.table-part-row.show {
  line-height:1em;
  opacity: 1;

}
<br>
<table>
  <tr>
    <th></th>
    <th>Firstname</th>
    <th>Lastname</th> 
    <th>Age</th>
  </tr>
  <tr data-row="047384">
    <td><button data-row="047384"></button></td>
    <td>Jill</td>
    <td>Smith</td> 
    <td>50</td>
  </tr>
  <tr class="table-part-row" data-row="047384">
    <td></td>
    <td>Jill</td>
    <td>Smith</td> 
    <td>50</td>
  </tr>
  <tr class="table-part-row" data-row="047384">
    <td></td>
    <td>Eve</td>
    <td>Jackson</td> 
    <td>94</td>
  </tr>
</table>

于 2017-02-09T00:15:31.920 回答
1

我找到了一种方法来隐藏带有 css 的表格行,它适用于纯文本,而无需添加那些讨厌的 div。这不是“解决所有问题,解决所有问题”的解决方案,但如果您只处理表格中的文本,您可能想尝试一下。

(它也可能适用于其他内容,但我还没有测试过)

  

// just used to toggle the hide class - use what every you fancy
$('button').click(function(){ $('.toggle').toggleClass('hide'); });
td {
  opacity: 1;
  padding: 10px;
  line-height: 20px;
  transition: all 0.2s ease-in-out;
} 
.hide td {
  opacity: 0;
  line-height: 0px;
  padding: 0 10px;
}

/* just some basic setup */
table {
  border-collapse: collapse;
}
td {
  background: #f1f1f1;
}
tr:nth-child(odd) td {
  background: #f9f9f9;
}
<button>Toggle Table Row</button>
<br /><br />

<table>
<tr>
  <td>foo</td>
</tr>
<tr class="toggle">
  <td>Hide Me!</td>
</tr>
<tr>
  <td>foo</td>
</tr>
</table>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

于 2018-02-01T13:37:06.453 回答
0

我刚遇到同样的事情,我的解决方案也是在单元格中使用 div,但是为了制作动画,我使用了内部 div 和 margin-bottom 而不是 max-height。剪断将是:

html:

<tr><td colspan="7">
  <div class="content">
    <div class="amin">
        multi line text
    </div>
   </div>
</td></tr>

CSS:

.content {
    overflow: hidden:
    margin: 0;
    float: left;
}
.anim {
    margin-bottom: -50%; /*use calc() to whatever suits you*/
    transition: all 5s;
}
.content:hover anim {
    margin-bottom: 0;
}

我只在FF中测试过。

于 2017-10-14T19:35:56.513 回答
-2

像这样的东西是你需要的最低限度。工作版本:http: //jsfiddle.net/GCJrd/

<style>
.togglebox {
background-color:#CCC;
height: 100px;
max-height: 100px;
-webkit-transition: max-height 1s ease-in-out;
-moz-transition: max-height 1s ease-in-out;
-ms-transition: max-height 1s ease-in-out;
-o-transition: max-height 1s ease-in-out;
transition: max-height 1s ease-in-out;
}
</style>

<script src="js/jquery-1.7.1.min.js"></script>
<script>
  $(document).ready(function(){
    //Hide the toggle-area when page load
    $(".togglebox").hide();
    //slide up and down when click over id #one
    $("#one").click(function(){
    // slide toggle effect set to 600 you can set it faster too.
    $(".togglebox").slideToggle(600);
    return true;
  });
});
</script>

身体

<button id="one">showLine1</button>
<table id="my_table">
<tbody>
  <tr>
  <td>1</td>
  <td>2</td>
 </tr>
 <tr class="togglebox">
  <td>hidden 1</td>
  <td>hidden 2</td>
  </tr>
</tbody>
</table>
于 2012-04-18T12:15:55.190 回答
-2

在表格行上添加动画,例如:

@keyframes show-row {
    from {
        opacity: 0;
    }
    to {
        opacity: 1;
    }
}

并像这样应用它:

animation: show-row .5s forwards;
于 2020-02-21T12:42:18.547 回答