【问题标题】:Selecting multiple li classes in a menu在菜单中选择多个 li 类
【发布时间】:2013-09-09 06:18:19
【问题描述】:

我正在创建一个投资组合网站,并且正在努力使用 JQuery 选择合适的元素。我的目标是在单击.outer(类别)项目时显示/隐藏.inner(任务)项目。我有 .arrows 在菜单展开时旋转。

这是similar question,以及随附的jsfiddle

感谢Tats_innit 的原始回答。

我有这个 HTML:

<li class="outer" hook="01">
    <div class="arrow"></div>
    Category 1
</li>
<li class="inner" id="menu-01">
    Task 1
</li>
<li class="inner" id="menu-01">
    Task 2
</li>
<li class="inner" id="menu-01">
    Task 3
</li>

<li class="outer" hook="02">
    <div class="arrow"></div>
    Category 2
</li>
<li class="inner" id="menu-02">
    Task 1
</li>
    <li class="inner" id="menu-02">
    Task 2
</li>
    <li class="inner" id="menu-02">
    Task 3
</li>

还有这个 jquery:

$(document).ready(function(){
        $('.outer').click(function(){
            var elem = $('#menu-'+$(this).attr('hook')),
                arrow = $(this).children('.arrow')

            if (!elem.is(':visible'))  {
                arrow.rotate({animateTo:90, duration:128});
            } else {
                arrow.rotate({animateTo:0, duration:128});
            }
            elem.slideToggle('128ms', function() {
            });

        return false;
    });
});

我知道我需要更改var elem = $('#menu-'+$(this).attr('hook')),但我不确定如何显示.inner所有 个实例。 我没有嵌套.inner 元素,因为.outer 类有一个悬停状态background-color: #f1f1f1;

【问题讨论】:

  • 究竟是什么不起作用?期望的输出是什么?

标签: javascript jquery html css


【解决方案1】:

这个问题是可以解决的,但是你的方法一开始就有很多问题,所以我想改一下。然后解决问题。

  1. The id attribute is unique。同一页面中不能有多个具有相同id 的元素;因此,请使用class
  2. hook 不是有效的 HTML 属性;虽然这确实不会伤害您并且浏览器很可能会忽略它,但我宁愿看到它standardized as data-hook if you so wish。这样您还可以使用标准 API。
  3. 您应该将.inner 嵌套在.outer 中,因为它在语义上是有意义的,并且会优雅地降级,并且屏幕阅读器也可以理解。你提到的关于悬停背景的问题,我认为可以通过一些好的 CSS 轻松解决:虽然我不了解具体问题,所以我不能说。

但事实是,使用嵌套您可能不需要大多数这些 id、类和随机数据属性(除非您显然需要它们而不只是打开一个列表)。

之后,您的 HTML 将如下所示:

<ul>
    <li class="outer">
         <div class="arrow"></div>
         Category 1
         <ul>
             <li>
                 Task 1
             </li>
             <li>
                 Task 2
             </li>
             <li>
                 Task 3
             </li>
         </ul>
    </li>
    <li class="outer">
         <div class="arrow"></div>
         Category 1
         <ul>
             <li>
                 Task 1
             </li>
             <li>
                 Task 2
             </li>
             <li>
                 Task 3
             </li>
         </ul>
    </li>
</ul>

而你 jQuery 喜欢这样:

$('.outer').click(function(){
    var elem  = $(this).children('ul'),
        arrow = $(this).children('.arrow')

    if (!elem.is(':visible'))  {
        arrow.rotate({animateTo:90, duration:128});
    } else {
        arrow.rotate({animateTo:0, duration:128});
    }
    elem.slideToggle('128ms', function() {
    });

    return false;
});

最后一点,.arrow 不是一个非常语义化的元素,因为它甚至没有用于激活动画(点击绑定到 li.outer)我会完全删除它,而是使用在上述li 上添加一个pseudo-element,也许可以用CSS3 旋转它。

编辑

我不确定您为什么无法使其正常运行;尽管您告诉我您很欣赏有关嵌套的评论,但您的 fiddle 没有使用正确的嵌套。

无论如何,我用我在这里给你的建议为你举了一个例子,基本上我只是复制了我在这里写的代码逐字。不过,我做了一些调整:比如实现 CSS 伪元素并去掉 div.arrow 元素,老实说,它看起来很糟糕。

显然只是一个例子,但它显示了应该如何处理这个问题。希望它能解决你的疑惑:

Working example

【讨论】:

  • 我应该注意到外观。这是jsfiddle,它表明了我想要实现的目标。我只需要出现菜单项。我很欣赏建议 RE:嵌套列表(并且我理解 id/class 的区别),但我仍然无法让它正常运行。
  • 用一个工作示例编辑了我的答案,看看这是否是你要找的。​​span>
  • 非常感谢。这是我第一次涉足 JQuery,所以我只是在使用一个示例(我没有自己制作),它与我正在寻找的内容近似。
  • 没问题。如果这对您有帮助,请考虑 accepting the answer
  • 已接受。如果您对自己帮助创建的内容感兴趣,请联系"final" version
【解决方案2】:

您可以将一组outerinner 嵌套到div

<div>
    <li class="outer">
        <div class="arrow"></div>
        Category 1
    </li>
    <li class="inner">
        Task 1
    </li>
    <li class="inner">
        Task 2
    </li>
    <li class="inner">
        Task 3
    </li>
</div>

那么你的 js 代码就像

$('.outer').click(function(){
    var elem = $(this).siblings('.inner'),
        arrow = $(this).children('.arrow')

    if (!elem.is(':visible'))  {
        arrow.rotate({animateTo:90, duration:128});
    } else {
        arrow.rotate({animateTo:0, duration:128});
    }
    elem.slideToggle('128ms', function() {
    });

    return false;
});

同时不会影响background-colorouter 课程

【讨论】:

  • 非常有用。奇迹般有效!这是我在 js/jquery 中的第一次尝试,这是一场斗争。现在,如果我只能创建一个展开/折叠所有...
  • 使用以下事件处理程序代码 $('.inner:visible').slideToggle('128ms', function(){ /**/ }); 将事件绑定到展开/折叠所有按钮即可
【解决方案3】:
<script>
$(document).ready(function(){
    $('li.inner').hide();
    $('.outer').click(function()
    {
        var elem = $(this).attr('hook');
        $('li.inner').hide();
        $(".menu-"+elem).toggle();
    });
});
</script>
<ul>
<li class="outer" hook="01">
<div class="arrow"></div>
Category 1
</li>
<li class="inner menu-01">
Task 1
</li>
<li class="inner menu-01">
Task 2
</li>
<li class="inner menu-01">
Task 3
</li>

<li class="outer" hook="02">
<div class="arrow"></div>
Category 2
</li>
<li class="inner menu-02">
Task 1
</li>
<li class="inner menu-02">
Task 2
</li>
<li class="inner menu-02">
Task 3
</li>
</ul>

首先将 li id 更改为 class,因为 2 li 没有相同的 id

【讨论】:

  • 我很欣赏您的意见,但我希望它能够制作出精美的动画。 “隐藏”和“显示”非常不和谐。我认为功能应该是第一位的,但审美决定了适当的 jquery 功能。
  • 使用这个脚本
【解决方案4】:

我猜你在找nextUntil()

$(this).nextUntil('.outer').slideToggle('218ms');

http://jsfiddle.net/bf7Ke/53/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    相关资源
    最近更新 更多