Javascript/jQuery 动画到动态高度?

Posted

技术标签:

【中文标题】Javascript/jQuery 动画到动态高度?【英文标题】:Javascript/jQuery animate to dynamic height? 【发布时间】:2013-03-01 21:16:54 【问题描述】:

有谁知道为什么这个动画很好:

function setContainerHeight() 
    $(".pagecontainer").animate(
        height: '700px'
    , 500);

即一个固定的高度,但这根本没有动画?

function setContainerHeight() 
    $(".pagecontainer").animate(
        height: 'auto'
    , 500);

它仍然自动调整大小,但没有动画,只是捕捉到它。

我的代码:

JS:

<script>

    function setContainerHeight() 
        $(".pagecontainer").animate(
            height: 'auto'
        , 500);
    

    $('.link').on('click', function(e)
        $('.pagecontainer>div').fadeOut(0);
        setContainerHeight();
        $(this.getAttribute("href")).fadeIn();
    );

</script>

CSS:

.pagecontainer 
min-height:450px;
width:80%;
min-width:800px;
padding:50px 0;
margin: 0 auto;

.pagecontainer>div
display: none; /*wait until page needs to be faded in*/
padding-left:50px;
padding-right:50px;
position:relative;

html

<div class="pagecontainer">

    <a href="#page1" class="link">page 1</a>
    <a href="#page2" class="link">page 2</a>
    <a href="#page3" class="link">page 3</a>

    <div id="page1">TONS OF TEXT HERE</div>

    <div id="page2">A BIT OF TEXT HERE</div>

    <div id="page3">BUNCH OF IMAGES</div>

</div>

有不同的 div 淡入/淡出,每个都需要不同的高度。页面的宽度也是动态的,但不需要动画,只是随着视口拉伸/收缩。

谢谢。

【问题讨论】:

如果不阅读 jquery 代码,我猜 animate 不会知道它的结束高度。修复是找到它,然后给它一个整数动画。 【参考方案1】:

演示http://jsfiddle.net/zbB3Q/

Animate 不知道结束高度。您需要获取它然后制作动画,但要做到这一点,您必须快速设置高度并返回到动画前的状态。

function setContainerHeight() 
    var heightnow=$(".pagecontainer").height();
    var heightfull=$(".pagecontainer").css(height:'auto').height();

    $(".pagecontainer").css(height:heightnow).animate(
        height: heightfull
    , 500);

【讨论】:

var heightfull = $(".pagecontainer").css(height:'auto').height(); 被读取时,这不会触发 FOUC(无样式内容的闪烁)吗? 不,太快了,这不像是浏览器显示了一些内容后js等待body.onload。 我已经编辑了我的问题以包含我的 JS/CSS/HTML。 .pagecontainer 是整体容器,里面有几个 div 页面。页面发生变化,因此 .pagecontainer 应更改高度以反映它。我已经通过 var targetpage = $(this).attr("href"); 尝试了您的代码,然后获取了 targetpage 的高度,但它似乎不起作用。 var targetpage = $(this).attr("href");?那么你在用 targetpage (这是一个字符串)做什么?你是说var targetpage = $($(this).attr("href"));【参考方案2】:

根据经验,我遇到了同样的问题,但您无法为auto 制作动画。但是,您可以事先获取容器高度,然后对其进行动画处理。例如。

function setContainerHeight() 
    newHeight = $('.pagecontainer').height();
    $(".pagecontainer").animate(
        height: newHeight
    , 500);

【讨论】:

这不会改变任何事情。 @popnoodles 啊是的你是对的,它没有,感谢教训。【参考方案3】:

在这里聚会有点晚了,但我的一些代码中遇到了完全相同的问题。我编写了一个小型 jQuery 插件来解决这个问题 - 如果您仍然需要解决这个问题,可以使用 here。

【讨论】:

【参考方案4】:

我做了一个小插件来处理这个问题——应该相当简单,基于 Darcy Clarke 的方法,该方法已发布 here,并进行了一些(imo)非常必要的改进。 jQuery 即插即用:

https://github.com/azaslavsky/jQuery-Animate-Auto-Plugin

【讨论】:

以上是关于Javascript/jQuery 动画到动态高度?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 javascript/jQuery 中最高子元素的高度?

根据内容大小动画和调整 div 动态高度

动画在具有动态单元格高度的单元格中添加子视图

css 动态高度CSS动画

具有调整单元格动画大小的动态单元格大小

前端javascript+jQuery实现360开机时间显示效果