- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个脚本,可以将 Accordion 功能添加到垂直菜单中。我主要使用 this blog 中的代码。我制作的菜单由多个级别组成,我在this jsFiddle中制作的示例只有 3 层深,但我计划使用更多(这是我的客户的要求)。
当一个元素具有“selected”类时,我只想在页面加载时显示该元素及其父元素。在示例中,该元素被涂成绿色,但该元素的父元素当然也应该显示。当用户选择要展开的不同元素时,它应该隐藏第一个元素并显示刚刚单击的元素的内容。
请先看一下示例,然后尝试一下。然后与下面的进行比较。
页面加载后,菜单首先应该是这样的:
- Site 1
- Site 1, page 1
- Site 1, page 2
- Site 1, subsite 1
- Site 1, subsite 1, page 1
- Site 1, subsite 1, page 2
- Site 1, subsite 2
- Site 1, page 3
- Site 2
正如您所看到的,唯一应该立即可见的是 HTML 中包含“selected”类的元素。其余的都应该简单地折叠起来。当然,一旦用户单击另一个子站点,或者站点 1 或站点 2,它应该折叠当前已“选择”的子站点,并打开已单击的另一个元素。它现在的行为绝对不是我想要的,我已经尝试了很多,但到目前为止还没有成功。
我不太明白如何解决这个问题。自上周以来我一直在努力让它发挥作用,但我仍然陷入困境。因此,如果有人能看一下并告诉我我做错了什么以及为什么会出现这样的情况,我将非常感激。
一些附加信息:此菜单将在 SharePoint 2013 环境中使用,它将取代 SharePoint 快速启动菜单。
预先感谢您的宝贵时间!
编辑:
如果 jsFiddle 不可用,这里是 HTML 和 JavaScript 代码。
HTML:
<body>
<div id="sideNavBox">
<ul id="rootMenu" class="static root">
<li class="static level-0 selected"><a class="static menu-item-li" href="#"><span>Site 1</span></a>
<ul class="static level-0-ul selected">
<li class="static level-1"><a class="static menu-item-li" href="#"><span>Site 1, page 1</span></a></li>
<li class="static level-1"><a class="static menu-item-li" href="#"><span>Site 1, page 2</span></a></li>
<li class="static level-1 selected"><a class="static menu-item-li" href="#"><span>Site 1, subsite 1</span></a>
<ul class="static level-1-ul selected">
<li class="static level-2 selected"><a class="static menu-item-li selected" href="#"><span>Site 1, subsite 1, page 1</span></a></li>
<li class="static level-2"><a class="static menu-item-li" href="#"><span>Site 1, subsite 1, page 2</span></a></li>
</ul>
</li>
<li class="static level-1"><a class="static menu-item-li" href="#"><span>Site 1, subsite 2</span></a>
<ul class="static level-1-ul">
<li class="static level-2"><a class="static menu-item-li" href="#"><span>Site 1 subsite 2, page 1</span></a></li>
<li class="static level-2"><a class="static menu-item-li" href="#"><span>Site 1 subsite 2, page 2</span></a></li>
</ul>
</li>
<li class="static level-1"><a class="static menu-item-li" href="#"><span>Site 1, page 3</span></a></li>
</ul>
</li>
<li class="static level-0"><a class="static menu-item-li" href="#"><span>Site 2</span></a>
<ul class="static level-0-ul">
<li class="static level-1"><a class="static menu-item-li" href="#"><span>Site 2, page 1</span></a></li>
<li class="static level-1"><a class="static menu-item-li" href="#"><span>Site 2, subsite 1</span></a>
<ul class="static level-1-ul">
<li class="static level-2"><a class="static menu-item-li" href="#"><span>Site 2, subsite 1, page 1</span></a></li>
</ul>
</li>
<li class="static level-1"><a class="static menu-item-li" href="#"><span>Site 2, subsite 2</span></a>
<ul class="static level-1-ul">
<li class="static level-2"><a class="static menu-item-li" href="#"><span>Site 2, subsite 2, page 1</span></a></li>
<li class="static level-2"><a class="static menu-item-li" href="#"><span>Site 2, subsite 2, page 2</span></a></li>
</ul>
</li>
<li class="static level-1"><a class="static menu-item-li" href="#"><span>Site 2, page 2</span></a></li>
<li class="static level-1"><a class="static menu-item-li" href="#"><span>Site 2, page 3</span></a></li>
</ul>
</li>
</ul>
</div>
JavaScript:
// Set dynamic CSS logic:
if($('#sideNavBox .menu-item-li.selected').length){
// Propagates the selected class, up the three:
$('li.static').removeClass('selected');
$('#sideNavBox .menu-item-li.selected').parents('li.static').addClass('selected');
// Collapses top siblings of selected branch:
$('#sideNavBox .menu-item-li.selected').parents('li.static').last().siblings().find('> ul').hide();
$('#sideNavBox .menu-item-li.selected').parents('li.static').siblings().find('> ul').hide();
}
else {
$('#sideNavBox .root.static > li.static > ul').hide();
}
/* CODE INTENDED FOR COLLAPSING AND EXPANDING THE level-0 AND level-0-ul ELEMENTS */
$('#sideNavBox .root.static > li.static.level-0').each(function(){ // For each element,
if($(this).find('ul').length){ // That has a ul inside it,
$(this).addClass('father').click(function(){ // Add the class 'father' to it.
if($(this).children('ul').css('display') != 'none'){
$(this).removeClass('selected').children('ul').slideUp();
}
else {
/*collapse-siblings*/
$(this).siblings().removeClass('selected').children('ul').slideUp();
/*expand*/
$(this).addClass('selected').children('ul').slideDown();
}
});
}
});
/* SAME CODE AS ABOVE BUT NOW INTENDED FOR COLLAPSING AND EXPANDING THE level-1 AND level-1-ul ELEMENTS */
$('#sideNavBox .root.static > li.static > ul.static > li.static').each(function(){
if($('#sideNavBox .root.static > li.static > ul.static > li.static').find('ul').length){
$(this).addClass('father2').click(function(){
if($(this).children('ul').css('display') != 'none'){
$(this).removeClass('selected').children('ul').slideUp();
}
else {
/*collapse-siblings*/
$(this).siblings().removeClass('selected').children('ul').slideUp();
/*expand*/
$(this).addClass('selected').children('ul').slideDown();
}
});
}
});
/* CODE INTENDED FOR DISABLING DEFAULT LINK BEHAVIOR FOR level-0 AND level-0-ul ELEMENTS */
$('#sideNavBox .root.static > li.static > a.static').click(function(e) {
/*Prevent the link from activating*/
e.preventDefault();
/*Upon clicking header, show contents*/
$('#sideNavBox .root.static > li.static').addClass('selected').children('ul').slideUp();
});
/* CODE INTENDED FOR DISABLING DEFAULT LINK BEHAVIOR BUT NOW FOR level-1 AND level-1-ul ELEMENTS */
$('#sideNavBox .root.static > li.static.level-0 > ul.static.level-0-ul > li.static.level-1 > a.static').click(function(e) {
/*Prevent the link from activating*/
e.preventDefault();
/*Upon clicking header, show contents*/
$('#sideNavBox .root.static > li.static.level-0 > ul.static.level-0-ul > li.static.level-1').addClass('selected');
$('#sideNavBox .root.static > li.static.level-0 > ul.static.level-0-ul > li.static.level-1').children('ul.level-1-ul').slideUp();
});
最佳答案
这是我的老同学:http://jsfiddle.net/wxu6f/6/
花了一些时间,但至少它正在工作......我认为?
function accordionMe(selector, initalOpeningClass) {
var speedo = 300;
var $this = selector;
var accordionStyle = true; // fancy or not as fancy.. (just set it to true)
// disable all links with # as href, or the page will jump like a chicken on coce
$this.find("li").each(function(){
// Find all these links
if ($(this).find("ul").size() != 0) {
// and disable them if needed
if ($(this).find("a:first").attr('href') == '#') {
$(this).find("a:first").click(function(){ return false; });
}
}
});
// Hide every ul first
$("#rootMenu li>ul").hide();
// Open all items (depending on the class you chose)
$this.find("li."+initalOpeningClass).each(function(){
$(this).parents("ul").slideDown(speedo);
});
// and now.. time for magic
$this.find("li a").click(function(){
if ($(this).parent().find("ul").size() != 0) {
if (accordionStyle) {
if(!$(this).parent().find("ul").is(':visible')){
// get all parents
parents = $(this).parent().parents("ul");
// get all visible ul's'
visible = $this.find("ul:visible");
// Loop through
visible.each(function(visibleIndex){
// check if parent was closed
var close = true;
parents.each(function(parentIndex){
if(parents[parentIndex] == visible[visibleIndex]){
close = false;
return false;
}
});
// if closed, close parent
if(close)
if($(this).parent().find("ul") != visible[visibleIndex])
$(visible[visibleIndex]).slideUp(speedo);
});
}
}
// if the parent was shown at first, hide him and vica versa
if($(this).parent().find("ul:first").is(":visible"))
$(this).parent().find("ul:first").slideUp(speedo);
else
$(this).parent().find("ul:first").slideDown(speedo);
}
}); // einde klik event
}
accordionMe($("#rootMenu"), "selected");
关于jQuery垂直 Accordion 菜单: parent nodes collapse when clicking child node,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15617549/
我有这个左侧站点菜单: Typography Name 1
我有两个问题: 是否有合理的解释,为什么会这样? 是否有针对这种情况的 CSS 解决方法? 谢谢! table { border-collapse: collapse; pad
我想知道为什么我的类“panel-collapse”“collapse”不起作用。 我刚刚将文件上传到我的服务器上,当我单击链接区域时,它们不起作用(它们不会放下隐藏内容)。但是,它们在我的 Drea
在这种情况下,我完全感到困惑。当我使用 border-collapse: collapse; 从 1px (#1) 到 大 值 (#2) 并回到 1px (#3),我有视觉缺陷。 #1 和#3 相同,
我有两个表,想要使用 Javascript 同步它们的列宽。只要我不为表格设置 CSS 属性 border-collapse:collapse;,它就能在 Google Chrome 中按预期工作。
我正在前端使用 Bootstrap 编写一个个人提要阅读器,并想添加一个“折叠/全部展开”按钮。 这是我的第一个 JavaScript/JQuery 代码,所以除了在 Firefox Develope
我正在使用以下模块:https://roszpun.github.io/vue-collapse/#/ 我似乎无法弄清楚如何正确地将类添加到包装元素,因为我首先考虑在 onStatusChange 上
在我的代码中,您将看到一个按钮和一个可折叠元素。如果单击该按钮,页面将滚动到可折叠状态。 用户点击按钮后是否可以打开折叠?我考虑过使用视口(viewport),但每次在视口(viewport)中时,折
我有一个 Collapsible-set(有 5-10 个可折叠)并使用此代码查找已打开的: $("#mySet").on("collapsibleexpand", function (e) {
我正在使用 jQuery Collapse在通过 Ajax 插入的元素上。 当我应用下面的行时,它删除了 collapse 类。我需要保留该类,以便在需要关闭 Ajax 内容时调用 collapse(
我正在尝试使用 隐藏表格中的列和 visibility:collapse如此处所述: Is it possible to hide / show table columns by changing
我在格式化 nav navbar-nav 无序列表中的列表项时遇到问题。当页面为全尺寸时,我想保留格式不变。但是,我想在页面缩小时格式化/自定义列表项,并且列表项“消失”并且仅在用户单击切换按钮后“重
出于某种原因,即使我第一次执行完全相同的操作,我也无法再次触发显示。 基本上,我有一个表单,用户可以从下拉列表中选择前两个字段(商家提供商和银行)或添加新条目。因此,我在 Javascript 中使用
我使用了 jsfiddle 68RXP 中的示例collapse-group 创建一个可扩展的 div: HTML: Heading Lorem ipsum View
我有以下问题:当我翻译表格中的标题单元格并且表格设置为 border-collapse:collapse 时,单元格将移动但不会移动它们的边框。我创建了一个测试: 标记:
我是 CSS 和 Bootstrap 3.0 的新手。下面是我可以在很多地方找到的代码,现在我可以毫无问题地编写它。但我真的不知道幕后情况如何。 Company
我有一个包含多行的表格,例如: Line1 Line2 Line3 现在,在 javascript(基于单选输入字段)中,我想通过添加 visibility:collapse 来
我有一个网页,我在其中尝试使所有浏览器的边框正确。参见 http://dl.dropbox.com/u/17256431/SpreadsheetConverter/border-3/border-3.
我正在尝试使用 javascript 来创建 Bootstrap 我只需要更新 javascript 文件,而不是在网站的各个页面上管理导航栏。 这是横幅的代码: document.write( "
给定以下 HTML 页面,表格顶部出现一条水平线,其中第一行将包含第二和第三个单元格(如果已定义)。 Test Page table { margin:10px 0 10px 0;
我是一名优秀的程序员,十分优秀!