使用CSS过渡设置最大高度动画

xnifntxz  于 2023-08-09  发布在  其他
关注(0)|答案(7)|浏览(164)

我想创建一个展开/折叠动画,它只由类名驱动(JavaScript用于切换类名)。
我给一个类max-height: 4em; overflow: hidden;
另一个max-height: 255em;(我还尝试了值none,它根本没有动画)
这是动画:transition: max-height 0.50s ease-in-out;
我使用CSS过渡在它们之间切换,但浏览器似乎正在动画所有那些额外的em的,所以它在折叠效果中创建了延迟。
有没有一种方法可以做到这一点(在同样的精神-与css类名),没有副作用(我可以把一个较低的像素数,但显然有缺点,因为它可能会切断合法的文本-这就是大价值的原因,所以它不会切断合法的长文本,只有荒谬的长文本)
查看jsFiddle -http://jsfiddle.net/wCzHV/1/(单击文本容器)

ugmeyewa

ugmeyewa1#

修复延迟解决方案:
为元素设置三次Bezier(0,1,0,1)过渡函数。

scss

.text {
  overflow: hidden;
  max-height: 0;
  transition: max-height 0.5s cubic-bezier(0, 1, 0, 1);

  &.full {
    max-height: 1000px;
    transition: max-height 1s ease-in-out;
  }
}

字符串

css

.text {
  overflow: hidden;
  max-height: 0;
  transition: max-height 0.5s cubic-bezier(0, 1, 0, 1);
}

.text.full {
  max-height: 1000px;
  transition: max-height 1s ease-in-out;
}

hrirmatl

hrirmatl2#

这是一个老问题,但我只是想出了一个方法来做,并希望坚持它的地方,所以我知道在哪里找到它,我应该再次需要它:o)
因此,我需要一个 accordion 与可点击的“sectionHeading”div,显示/隐藏相应的“sectionContent”div。部分内容div具有可变高度,这会产生一个问题,因为您无法将高度设置为100%。我看到其他的答案建议动画max-height代替,但这意味着有时你会得到延迟时,max-height你使用的是大于实际高度。
这个想法是在加载时使用jQuery来查找并显式设置“sectionContent”div的高度。然后添加一个css类'noHeight'到每个点击处理程序来切换它:

$(document).ready(function() {
    $('.sectionContent').each(function() {
        var h = $(this).height();
        $(this).height(h).addClass('noHeight');
    });
    $('.sectionHeader').click(function() {
        $(this).next('.sectionContent').toggleClass('noHeight');
    });
});

字符串
为了完整起见,相关的css类:

.sectionContent {
    overflow: hidden;
    -webkit-transition: all 0.3s ease-in;
    -moz-transition: all 0.3s ease-in;
    -o-transition: all 0.3s ease-in;
    transition: all 0.3s ease-in;
}
.noHeight {
        height: 0px !important;
}


现在,高度过渡工作,没有任何延迟。

ocebsuys

ocebsuys3#

如果有人正在阅读这篇文章,我还没有找到一个解决方案,并且使用了仅扩展的效果(这是通过将transition样式移动到扩展的类定义来实现的)

c8ib6hqw

c8ib6hqw4#

使用display:flex。这将工作:

.parent > div {
  display: flex;
  flex-direction: column;
  height: 0px;
  max-height: 0px;
  opacity: 0;
  overflow: hidden;
  transition: all 0.3s;
}

.parent > div.active {
  opacity: 1; 
  height: 100%;
  max-height: none; /* important for animation */
}

字符串

zqry0prt

zqry0prt5#

解决办法其实很简单。创建一个包含内容的子div。父div将是展开/折叠的div。
在加载时,父div将有一个max-height。切换时,你可以通过写document.querySelector('.expand-collapse-inner').clientHeight;来检查子高度,并使用JavaScript设置maxheight。
在你的CSS中,你会有这个

.parent {
transition: max-height 250ms;
}

字符串

g2ieeal7

g2ieeal76#

有一个新的纯CSS解决方案,解决了所有的问题,其他CSS解决方案。您可以使用grid-template-rows: 0fr;进行折叠,使用1fr;进行展开。查看代码以了解详细信息:

/* theme */

.panel-expand {
  background-color: black;
  color: white;
  padding: 20px;
  width: 400px;
  transition: all 200ms ease-in-out;
}

/* mechanism */

.panel-expand {
  display: grid;
  grid-template-rows: 0fr;
}

.panel-expand:hover {
    grid-template-rows: 1fr;
}

.panel-expand__content {
  overflow: hidden;
}

个字符
我在Kevin Powell的视频https://www.youtube.com/watch?v=B_n4YONte5A中发现了它

sdnqo3pr

sdnqo3pr7#

您可以使用jQuery Transit来很好地完成此操作:

$(function () {
    $(".paragraph").click(function () {
        var expanded = $(this).is(".expanded");
        if (expanded) 
        {
            $(this).transition({ 'max-height': '4em', overflow: 'hidden' }, 500, 'in', function () {$(this).removeClass("expanded"); });
        } 
        else 
        {
            $(this).transition({ 'max-height': $(this).get(0).scrollHeight, overflow: ''}, 500, 'out', function () { $(this).addClass("expanded"); });
        }
    });
});

字符串
你绝对可以按照你的喜好整理一下,但那应该能做到你想要的。

JS Fiddle Demo

相关问题