如何使用jQuery将元素动画化为其自然高度

Gre*_*reg 16 javascript css jquery

我试图让一个元素动画到它的"自然"高度 - 即它的高度height: auto;.

我想出来了:

var currentHeight = $this.height();
$this.css('height', 'auto');
var height = $this.height();
$this.css('height', currentHeight + 'px');

$this.animate({'height': height});
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?这感觉有点像黑客.

编辑:这是一个完整的脚本,可供想要测试的任何人使用.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html lang="en"> 
    <head>
        <title>jQuery</title>
        <style type="text/css">
            p { overflow: hidden; background-color: red; border: 1px solid black; }
            .closed { height: 1px; }
        </style>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js"></script>
        <script type="text/javascript">
        $().ready(function()
        {
            $('div').click(function()
            {
                $('p').each(function()
                {
                    var $this = $(this);

                    if ($this.hasClass('closed'))
                    {
                        var currentHeight = $this.height();
                        $this.css('height', 'auto');
                        var height = $this.height();
                        $this.css('height', currentHeight + 'px');

                        $this.animate({'height': height});
                    }
                    else
                    {
                        $this.animate({'height': 1});
                    }

                    $this.toggleClass('closed');
                });
            });
        });
        </script>
    </head>

    <body>

        <div>Click Me</div>
        <p>Hello - I started open</p>
        <p class="closed">Hello - I started closed</p>

    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

Pio*_*oul 11

我允许自己回答这个问题,即使很久以前它已被回答,因为它只是帮助了我.

事实上,我不明白第一个答案:为什么打开一个半封闭的元素来获得它的高度,然后再次关闭它?

在开始时,您隐藏元素,以便只显示其中的一部分,对吧?使用javascript,最好的方式(我相信)是这样做的.因此,当您隐藏元素时,只需将orig高度保存在var中,这样您就不必隐藏(onready)-show-save height-hide以便能够切换元素可见性.

看看我做了什么,它完美地运作:

$(document).ready(function(){
var origHeight = $("#foo").css('height');
$("#foo").css({"height" : "80px"});
$("#foo .toggle").bind("click", function(event){ toggleFoo(event, lastSearchesMidHeight); });
});
Run Code Online (Sandbox Code Playgroud)

在这里,当你调用你的切换功能时,你知道你的原始元素高度是多少,而不是四处游荡.

我写得很快,希望它能帮助将来的某个人.


小智 10

我找到的最简单的解决方案是简单地用一个高度有限的div包装内容元素并设置为overflow:hidden.这会将内部内容元素截断为包装div的高度.当用户点击,悬停等以显示内容元素的完整高度时 - 简单地将包装div设置为内部内容div的高度.


Sam*_*son 6

我可以建议一个同样hackish的解决方案......克隆元素,将其置于视图之外,并获得其高度...然后删除它并为原始动画制作动画.

除此之外,您还可以使用$ .slideUp()和$ .slideDown():

$this.hasClass('closed') ? $(this).slideDown() : $(this).slideUp() ;
Run Code Online (Sandbox Code Playgroud)

如果需要保留1px行,可以将其应用于父元素:

<div style='border-top:1px solid #333333'>
  <div class='toggleMe'>Hello World</div>
</div>
Run Code Online (Sandbox Code Playgroud)

并在.toggleMe div上应用slidingUp/Down.

  • 你决定不使用$ .slideUp()和$ .slideDown()的任何理由? (2认同)