【问题标题】:jQuery slideDown makes other elements jumpjQuery slideDown 使其他元素跳跃
【发布时间】:2013-05-09 16:18:15
【问题描述】:

我正在尝试构建具有动态高度和数量的元素列表,当用户单击它们时会上下滑动。问题是,当时只需要显示其中一个,而其他的在点击后会自动向上滑动。

我对位于正在滑下的元素下方的元素有疑问。它们似乎向下跳,然后又向上跳到正确的位置,大约 7px(我假设它是 div.text 的 5px 边距顶部 + 边框的 2px)。

滑动div:

<div class="slide">
    <div class="bar">
        <a href="#" class="title">Slide #1</a>
    </div>
    <div class="text">
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum sed odio nulla. Pellentesque auctor molestie ipsum, ut lobortis mauris laoreet id. Praesent ut dolor sed dui euismod mattis a at nisl. Etiam mi dolor, placerat eget feugiat nec, tempus id risus. Ut sed lobortis arcu. Fusce vestibulum enim sed quam tristique sagittis. Etiam at tempor enim. 
    </div>
</div>

我用来上下滑动它们的脚本。

$('.text').hide();
$('.slide .bar a').click(function(){
    if($(this).parent().next('.text').is(':hidden')){
        $('.text').slideUp(200);
        $(this).parent().next('.text').slideDown(200);
    }
    else if($(this).parent().next('.text').is(':visible')){
        $(this).parent().next('.text').slideUp(200);
    }

});

为了更好地说明,小提琴:http://jsfiddle.net/Q682D/1/

有什么简单的方法可以解决这个问题吗?我想保留边框和边距,或者至少让div.texts 看起来和现在一样。

【问题讨论】:

  • 如何使用 jQuery UI 手风琴
  • 我想保持 div 结构与上面显示的 CSS 样式相同,而 UI Accordion 似乎不允许这样做。特别是因为原来的 div.slide 中有更多元素(如按钮或复选框),我在这里省略了,因为它们看起来不像是问题的一部分。
  • 我想我现在可能已经解决了,抱歉我一开始没有看到跳跃,我不得不玩了一下,但我想我现在有一个解决方案。跨度>

标签: jquery slidedown


【解决方案1】:

我能够得到你想要的外观,没有“跳跃”,使用下面的手风琴方法,看起来这可能是两个选项中更好的一个。

手风琴法

jQuery UI Accordion

jsFiddle

css

a {
    text-decoration: none;
    color: #252525;
}
.bar {
    border-radius: 6px;
    box-shadow: 0 0 0 1px #bbb;
    height: 34px;
    border: 1px solid #eacec3 !important;
    background: #ddb09e;
    /* Old browsers */
    filter: none !important;
    box-shadow: inset 0 -17px 30px 0 #c98c75, 0 0 0 1px #84413f;
    width: 400px;
    margin-bottom:0.5em;
}
.text {
    background: #fff;
    border: 1px solid #aaa;
    border-radius: 6px;
    font: 14px'Trebuchet MS', 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Tahoma, sans-serif;
    padding: 10px;
    width: 365px;
}
.title {
    float: left;
    font: bold 17px'Trebuchet MS', 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Tahoma, sans-serif;
    line-height: 35px;
    margin-left: 12px;
    text-decoration: none !important;
    text-shadow: -1px -1px 0px rgba(0, 0, 0, 0.2), 1px 1px 0px rgba(255, 255, 255, 0.3);
    vertical-align: middle;
}
.ui-accordion .ui-accordion-header {
    display: block;
    cursor: pointer;
    position: relative;
    padding:0;
}
.ui-accordion .ui-accordion-content {
    padding: 1em 1.2em;
    border-top: 1px solid #aaa;
    overflow: auto;
}
.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited {
    color: #000;
    text-decoration: none;
}
.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default {
    background:none;
    font-weight: normal;
    color: #fff;
    width:400px;
    border: 1px solid #fff;
}
.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
    position: absolute;
    left: 0;
    top: 40%;
    margin-top: -8px;
}

js

 $(function () {
     $("#accordion").accordion({
         collapsible: true,
         active: false
     });
 });

html

<div id="accordion">
    <div>
        <div class="bar"> <a href="#" class="title">Slide #1</a>
        </div>
    </div>
    <div class="text">Lorem ipsum dolor sit amet, consectetur adipiscing elit.
        <br>
        <form>Text:
            <input type="text">
            <br>
            <input type="checkbox">
            <br>
            <input type="radio">
            <br>
            <input type="button" value="Button">
        </form>
    </div>

slideDown/slideUp 方法

没有那么干净,但我使用box-sizing:border-box; 完成了大部分操作并稍微重新组织了一些东西。仍然有轻微的闪烁,但也许这会引导您朝着正确的方向前进。

jsFiddle2

css

a {
    text-decoration: none;
    color: #252525;
}
.slide {
    padding-bottom: 15px;
    width: 400px;
}
.bar {
    border-radius: 6px;
    box-shadow: 0 0 0 1px #bbb;
    height: 34px;
    border: 1px solid #eacec3 !important;
    background: #ddb09e;
    /* Old browsers */
    filter: none !important;
    box-shadow: inset 0 -17px 30px 0 #c98c75, 0 0 0 1px #84413f;
    width: 400px;
    margin-bottom:0.25em;
}
.text {
    background: #fff;
    border: 1px solid #aaa;
    border-radius: 6px;
    font: 14px'Trebuchet MS', 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Tahoma, sans-serif;
    padding: 10px;
    width: 400px;
    box-sizing:border-box;
    -moz-box-sizing:border-box;
}
.title {
    float: left;
    font: bold 17px'Trebuchet MS', 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Tahoma, sans-serif;
    line-height: 35px;
    margin-left: 12px;
    text-decoration: none !important;
    text-shadow: -1px -1px 0px rgba(0, 0, 0, 0.2), 1px 1px 0px rgba(255, 255, 255, 0.3);
    vertical-align: middle;
}

更新:我怀疑.slideDown().slideUp() 动画计算中可能存在错误, 如果您将其更改为.show().hide(),则跳转消失。

jsFiddle3

【讨论】:

  • 谢谢,这对我帮助很大。通过进一步调整(添加背景图像而不是顶部/底部边框并更改您的方式周围的边距,因此 .text 没有任何),我设法将闪烁减少到只有一个像素。知道剩下的一个像素跳跃可能来自什么吗?
  • @user1170027 你能发一个jsfiddle你现在拥有的东西吗?
  • @user1170027 我怀疑这可能是滑动动画计算中的一个错误,如果你把它改成普通的.show().hide(),最后一点跳跃消失了,检查一下jsFiddle如果一个像素让您如此烦恼,您总是可以使用上面的手风琴方法。
  • 不,没关系,我只是想知道是否有一个简单的解决方法。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多