jQuery - 垂直向上切换(即不向下)

Posted

技术标签:

【中文标题】jQuery - 垂直向上切换(即不向下)【英文标题】:jQuery - vertical up toggle (i.e. not down) 【发布时间】:2011-01-01 15:24:16 【问题描述】:

我需要创建一个向上而不是向下动画的切换,换句话说,与“正常”切换相反。也许更简单的是切换应该在菜单项(它是一个菜单)上方滑动以变得可见,而不是像正常的 slideToggle 等那样向下滑动。我快到了:

var opened = false;
$("#coltab li").click(function()
    if(opened)
        $(this).children('ul').animate("top": "+=300px");
     else 
        $(this).children('ul').animate("top": "-=300px");
    
    $(this).children('ul').children().slideToggle('slow');
    $(this).children('ul').toggle();
    opened = opened ? false : true;
);

但是如果你“切换”一个项目然后另一个项目第二个项目(向下滑动)下降 300 像素而不是向上滑动(提升)300 像素。我想要实现的一个很好的例子(讨厌该网站)是http://market.weogeo.com/#/home 和底部的“标签”。

我的 html 代码正在使用

<ul id="#coltab">
<li>Item 1
<ul>
<li>This bit needs to toggle up</li>
</ul>
</li>
<li>Item 2
<ul>
<li>This bit needs to toggle up</li>
</ul>
</li>
etc ...
</ul>

在 CSS 方面

ul#coltab  position: relative' blah; blah; 

ul#coltab  ul  display: none; position: absolute; blah; blah; 

有什么想法吗?

如果每次“点击”在打开“点击”开关之前关闭前一个开关,那就太好了。

【问题讨论】:

这是我在下面发布的编辑版本:D jsfiddle.net/s7AD8/2 @Cristy Ohhh 我恨你 :-) 那是“正确的”以及我“创造”的很多东西,但我只需使用 slideToggle 就能让它工作 - 不需要动画 - 除非我错过了什么? 是的,不需要动画,我只是使用它,因为下面发布的示例使用它:)) 【参考方案1】:

如果您为列表提供实际的 CSS 而不是填充符,我可以给出更具体的答案。

基本上,您需要将ul#coltab ulbottom 属性设置为0

通用示例: http://jsfiddle.net/s7AD8/

ul#coltab  ul 
    position:absolute;
    bottom:0;
    /*...and so on*/

这将使它向上动画。

【讨论】:

@patrick dw - 抱歉,这个职位是绝对的;底部:0px; @Russell:应该可以。我添加了一个通用示例来演示向上动画。如果您的 bottom:0 没有这样做,那么您需要提供重现问题所需的代码。 @patrick dw - 感谢“去过那里” li>功能Lorem ipsum dolor sit amet,consectetur adipiscing elit。 Pellentesque sed neque eu est consequat scelerisque sit amet ac orci。 博客Lorem ipsum dolor sit amet, consectetur adipiscing elit. ul#coltab ul 显示:无;位置:绝对; z指数:998;边距:0px;底部:0px;填充:0px;列表样式:无; @patrick dw - 继续... ul#coltab li ul li.test 位置:相对; line-height: normal; 它不是说“向上”切换不起作用,如果您切换“两次”,即切换项目已经打开,那么 JQuery 会“反转”代码 在我 (ofc) 之前得到它,但我自己做了,作为概念证明。 :) jsfiddle.net/66YCv【参考方案2】:

试试这个:

$("#coltab li ul").each(function (index) 
  $(this).data('height', $(this).outerHeight());    
);

$("#coltab li").click(function () 

    $("#coltab li ul.open").animate("top": 0, function () 
        $(this).removeClass('open');  
    );

    var itemHeight = $(this).children('ul').data('height');
    $(this).find('ul:not(.open)').animate("top": -itemHeight).addClass('open');

);

并添加一个新的 css 类:

#coltab ul.open  display: block; 

Test it here

【讨论】:

我看过 .data('');之前但不确定它是什么,但从你的例子我可以猜到它计算“内容”或数据的高度,但即使 css 不显示? 查看文档:api.jquery.com/jQuery.data - “存储与指定元素关联的任意数据。” |所以这段代码 sn-p 存储了需要切换的项目的原始高度,以便稍后动画到适当的顶部位置。【参考方案3】:

"-=300px" 作为一个预先计算的变量会感觉更好。(你甚至可以处理字符串中的计算吗?)

此外,如果您希望独立操作它们,我想您可以通过为要处理的部分提供 ID 来轻松得多

【讨论】:

yes +/-=300px 作为预先计算的 var 会更好,但是由于 UL 在切换之前显示为 none,所以它没有高度,所以你(好吧,我做不到)height();预先计算它如果可以做到 - 通常 - 很想知道和学习。谢谢评论 “你甚至可以处理字符串中的计算吗?” 是的,jQuery 可以让你在动画中做到这一点。 @Patrick:我明白了...这确实为我的项目提供了一些新选择^^谢谢【参考方案4】:

如果你需要释放 ul 和 li 做其他事情,你也可以使用不同的方式:

<style>
body  margin: 100px 50px; 

#coltab  position: relative; text-align: center; 

#coltab > li 
    background: #ccc;
    color: #444;
    cursor: pointer;
    display: block;
    float: left;
    margin: 0 10px;
    padding: 10px 20px;
    position: relative;
    width: 100px;


#coltab span 
    background: #eee;
    color: #222;
    display: none;
    padding: 5px;
    position: absolute;
    left: 0;
    right; 0;
    top: 0;
    z-index: -1;


#coltab span.open  display: block; 

</style>

<head>

<script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js"> </script>

</head>

<body>



<div id="coltab">
    <li>Item 1<br/>(click me)
            <span>This first item needs to toggle up</span>
    </li>
    <li>Item 2<br/>(click me)
            <span>This second item needs to toggle up</span>
    </li>
</div>

<script>
$(document).ready(function() 
$("#coltab li span").each(function (index) 
  $(this).data('height', $(this).outerHeight());    
);

$("#coltab li").click(function () 

    $("#coltab li span.open").animate("top": 0, function () 
        $(this).removeClass('open');  
    );

    var itemHeight = $(this).children('span').data('height');
    $(this).find('span:not(.open)').animate("top": -itemHeight).addClass('open');

);
);
</script>
</body>

【讨论】:

以上是关于jQuery - 垂直向上切换(即不向下)的主要内容,如果未能解决你的问题,请参考以下文章

向上方向的jquery SlideToggle效果?

底部固定 div 的 JQuery 切换将所有 div 向上移动

如何在反应组件(打字稿+ css)中使用向上和向下键切换div焦点

滑动切换 jQuery 函数

jQuery滑动

用jQuery.touchSwipe插件实现手机端场景滑动切换效果