如何设置包装 div 的高度以防止响应式滑块/自动收录器后内容跳转?

Posted

技术标签:

【中文标题】如何设置包装 div 的高度以防止响应式滑块/自动收录器后内容跳转?【英文标题】:How to set the height of a wrapping div to prevent jumps in the content after a responsive slider/ticker? 【发布时间】:2013-05-06 09:06:27 【问题描述】:

我只用几行代码做了一个超级简单的股票/滑块东西,它有点响应。

请参阅the code at jsBin 和 the Demo(调整屏幕大小,观察自动收报机的大小调整。)

基本的 html 结构是:

<div id="tickerwrap">
    <ul id="ticker">
        <li>Item 1</li>
        <li>Item 2</li>
        etc.
    </ul>
</div>
<div>Another div content</div> 

而 jQuery 只是:

function ticker () 
    $('#ticker li:first').slideUp (function () 
        $ (this).appendTo ($ ('#ticker')).slideDown ();
    );


setInterval (function () ticker (); , 2500);

我的问题是计算包装 div 的高度 (#tickerwrap)...

    如何防止“跳转”后跟另一个div?见this demo。

    添加到DOM时如何计算或设置div的高度?

我曾尝试添加ticker.stopPropagation();ticker.preventDefault();,但效果不佳。

我也希望高度/位置响应。

【问题讨论】:

【参考方案1】:

如果不假设代码项目的数量或高度(除非我们假设有超过 2 个),您几乎需要使用 javascript 来设置 #tickerwrap 的大小。要使其响应窗口大小调整,请使用带有时间延迟的 jQuery 的 .resize()

所以,添加此代码 (See the demo):

function sizeTickerwrap () 
    var tickerUL        = $('#ticker');
    var numTickerItems  = tickerUL.children ('li').length;
    if (numTickerItems  < 3)
        return;

    //-- The second item will not be in a slide animation.
    var itemHeight      = tickerUL.children ('li:eq(1)').outerHeight (true);
    //-- Adjust for the containing <ul>
    var wrapHeightAdjst = tickerUL.outerHeight (true) - tickerUL.height ();

    $("#tickerwrap").height (numTickerItems * itemHeight + wrapHeightAdjst);


//-- Initial call after a settling delay
setTimeout (sizeTickerwrap, 1200);

$(window).resize ( function () 
    /*-- Time-delay the resize response to give browser a chance to settle
        and avoid bogging down the UI.
    */
    this.resizeTimer    = this.resizeTimer || null;
    if (this.resizeTimer)
        clearTimeout (this.resizeTimer);

    this.resizeTimer    = setTimeout (sizeTickerwrap, 200);
 );

【讨论】:

谢谢,看起来.. 很棒。而且比我预期的要复杂得多..(或我的技能)。谢谢 。它实际上与我尝试做的事情相同的想法,但没有完成的技能:jQuery("#tickerwrap").css( "height", jQuery("#k99-scroll-samurai first:li") *4); 不客气。请注意,我在代码中有一个小错字(是+;应该是-;见the edit)。 嗨,我花时间研究了你的 sctipt(只是在学习更好的 js 的阶段,并试图学习 .. ),我注意到你的脚本假设所有 li 元素都会高度相同(通过测量第二个li(eq:1) 并相乘)。我只是想知道你为什么不把所有元素的高度放在一起?是因为他们正在改变吗?有没有办法在滑动动作开始之前测量元素?因为否则当元素高度不同时脚本计算错误。(jsbin.com/exahaz/11/edit) 您可以在滑动动作开始前一次测量高度。但是在此之后测量调整大小的高度变得非常棘手。可能最好为此要求打开一个新问题。 好的,非常感谢您的帮助,我从您的代码中学到了很多 :-)

以上是关于如何设置包装 div 的高度以防止响应式滑块/自动收录器后内容跳转?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 div 的高度匹配响应内容?

如何正确设置 100% DIV 高度以匹配文档/窗口高度?

固定位置:滚动

CSS如何设置div高度100%减去nPx [重复]

如何防止Ajax元素包装?

图片侧宽度为 100% 的 div 并修复响应式网站的高度