需要js帮助这个。一个页面上有两个导航,一个导航和一个顶部导航一起工作。单击并选择时,侧导航活动状态和顶部导航当前状态将突出显示,但单击第二个和第三个顶部导航链接时将删除侧导航活动/选定状态。
这是HTML:
<div id="nav">
<ul>
<li class="active"><a href="#SideNav1">Side Nav 1</a></li>
<li><a href="#SideNav2">Side Nav 2</a></li>
</ul><br />
<div id="SideNav1">
<ul>
<li class="current">Side Nav 1 Top Nav 1</li>
<p>Content here</p> <br />
<li><a href="#SideNav1TopNav2">Side Nav 1 Top Nav 2</a></li>
<p>Content here</p> <br />
<li><a href="#SideNav1TopNav3">Side Nav 1 Top Nav 3</a></li>
<p>Content here</p> <br />
</ul>
</div>
<div id="SideNav2">
<ul>
<li class="current">Side Nav 2 Top Nav 2</li>
<p>Content here</p> <br />
<li><a href="#SideNav2TopNav2">Side Nav 2 Top Nav 2</a></li>
<p>Content here</p> <br />
<li><a href="#SideNav3TopNav3">Side Nav 2 Top Nav 3</a></li>
<p>Content here</p> <br />
</ul>
</div>
<div id="SideNav1TopNav2">
<ul>
<li><a href="#SideNav1">Side Nav 1 Top Nav 1</a></li>
<p>Content here</p> <br />
<li class="current">Side Nav 1 Top Nav 2</li>
<p>Content here</p> <br />
<li><a href="#SideNav1TopNav3">Side Nav 1 Top Nav 3</a></li>
<p>Content here</p> <br />
</ul>
</div>
<div id="SideNav1TopNav3">
<ul>
<li><a href="#SideNav1">Side Nav 1 Top Nav 1</a></li>
<p>Content here</p> <br />
<li><a href="#SideNav1TopNav3">Side Nav 1 Top Nav 2</a></li>
<p>Content here</p> <br />
<li class="current">Side Nav 1 Top Nav 3</li>
<p>Content here</p> <br />
</ul>
</div>
<div id="SideNav2TopNav2">
<ul>
<li><a href="#SideNav2">Side Nav 2 Top Nav 1</a></li>
<p>Content here</p> <br />
<li class="current">Side Nav 2 Top Nav 2</li>
<p>Content here</p> <br />
<li><a href="#SideNav2TopNav3">Side Nav 2 Top Nav 3</a></li>
<p>Content here</p> <br />
</ul>
</div>
<div id="SideNav2TopNav3">
<ul>
<li><a href="#SideNav2">Side Nav 2 Top Nav 1</a></li>
<p>Content here</p> <br />
<li><a href="#SideNav2TopNav3">Side Nav 2 Top Nav 2</a></li>
<p>Content here</p> <br />
<li class="current">Side Nav 2 Top Nav 3</li>
<p>Content here</p> <br />
</ul>
</div>
</div>
这是js:
$(function() {
$('#nav div').hide();
$('#nav div:first').show();
$('#nav ul li:first').addClass('active');
$('#nav ul li a').click(function(){
var currentTab = $(this).attr('href');
var vis = $(currentTab).is(':visible');
$('#nav div').hide();
$('#nav ul li').removeClass('active');
$(this).parent().addClass('active');
if(vis) {
$(currentTab).hide();
} else {
$(currentTab).show();
}
});
});
CSS:
.active {
background:#008CDC;
}
.current {
background:#ECEDED;
}
动态代码:
答案 0 :(得分:1)
这是一个例子,其中描述要求将有很多成果。出于某种原因,Stack Overflow社区(以及那些遵循JavaScript标记的社区)喜欢一个好的“隐藏我,给我看”的问题。 ;-)据我所知,要求是这些:
就个人而言,我觉得如果“Tabs”是你想要的方式,你称之为“顶级导航”,但我将称之为“Subnav”,你可以很容易地使用jQuery UI。我的示例不使用jQuery UI。
(以下是以下样本的小提琴:http://jsfiddle.net/tqhHA/85/)
关于原始代码的首要注意事项是它缺少逻辑标记结构。 ID为SideNav1
的div与SideNav1TopNav2
处于同一级别。它没有意义。然后在nav
中有两个项目,它们应该是您的侧导航,但在名称方面不匹配。在“内容”区域中,当前选项卡具有“当前”类(很棒!)但是没有自己的锚链接用于切换内容(哎呀!)。
不仅如此,它还是无效的标记(您的<p>
元素中没有穿插<li>
元素。
让我们通过以下方式清理这一切:
nav
列表)HTML:
<ul id="nav">
<li><a href="#content1">Item 1</a></li>
<li class="active"><a href="#content2">Item 2</a></li>
</ul>
<div id="content1" class="content">
<ul>
<li class="active"><a href="#tab1_1">Subnav 1</a></li>
<li><a href="#tab1_2">Subnav 2</a></li>
<li><a href="#tab1_3">Subnav 3</a></li>
</ul>
<div id="tab1_1">
<p>This content should only be visible when Item 1 is selected from the
main nav, and Subnav 1 is selected in the content area.</p>
</div>
<div id="tab1_2">
<p>This content should only be visible when Item 1 is selected from the
main nav, and Subnav 2 is selected in the content area. This <a href="#">fake anchor</a>
shows that you can add anchors inside the tabs.</p>
</div>
<div id="tab1_3">
<p>This content should only be visible when Item 1 is selected from the
main nav, and Subnav 3 is selected in the content area.</p>
</div>
</div>
<div id="content2" class="content">
<ul>
<li><a href="#tab2_1">Subnav 1</a></li>
<li><a href="#tab2_2">Subnav 2</a></li>
<li class="active"><a href="#tab2_3">Subnav 3</a></li>
</ul>
<div id="tab2_1">
<p>This content should only be visible when Item 2 is selected from the
main nav, and Subnav 1 is selected in the content area.</p>
</div>
<div id="tab2_2">
<p>This content should only be visible when Item 2 is selected from the
main nav, and Subnav 2 is selected in the content area.</p>
</div>
<div id="tab2_3">
<p>This content should only be visible when Item 2 is selected from the
main nav, and Subnav 3 is selected in the content area.</p>
</div>
</div>
CSS也进行了修订:
active
)。您需要做的就是以不同方式设置它们的具体方式.active { background:navy; }
.active a { color: white }
.content .active { background:yellow; }
.content .active a { color: black; }
/* we're demoing sidebars... let's make it a SIDE bar! */
#nav, .content { float: left }
#nav { width: 100px; }
.content { width: 300px; margin-left: 24px;}
/* make the Subnav horizontal... more "tab"-like! */
.content li { display: inline-block }
好的,现在我们有一份文件。这就是......所有这些都可能不是最好的方法。关于拥有如此多的ID以便于导航,我发出了警钟。我把它们留在了,因为它与你的方法非常匹配,但它甚至不像它可能的模块化。无论如何,只是承认记录它不一定是理想的,但它会起作用。
JS也是全新的。重要的是,如果我们已经有适当的HTML结构,那么编写JS很容易!内联评论已经提供了我认为足够的文档,所以让我们正确对待它:
var updateMain = function() {
// just hide ALL content areas first, rather than micro-managing
$('.content, .content div').hide();
// with all hidden, reveal only the content areas that have become active
var activeLinks = $('.active a');
activeLinks.each(function() {
var activeArea = $(this).attr('href');
$(activeArea).show();
});
};
$(document).ready(function() {
updateMain();
// Bind a click event to the all navigation items (both main and sub)
$('#nav a, .content > ul a').on('click', function(event) {
event.preventDefault(); // prevent default anchor behaviour
var $parent = $(this).parent(); // jQ object of the list item containing the anchor clicked
// only do stuff if user has not just clicked a nav that's already active
if (!($parent.hasClass('active'))) {
$parent.siblings().removeClass('active');
$parent.addClass('active');
}
updateMain(); // with new active classes in place, show the correct content
});
});
底线是:我们所做的只是页面加载,然后在每次点击后,我们都会显示与“有效”导航相关的内容。所有单击操作都是“活动”的更改,然后运行内容更新程序功能。
免责声明:
使用此处使用的技术,您可能会获得“Flash of Unstyled Content”(FOUC),因为它是JavaScript进行隐藏。让JavaScript处理它对于可访问性和SEO更好。但你可以研究破坏FOUC的技术。我没有进入那里。
希望您能看到如何构建内容和捕获事件。然后你可以发现改进的机会!显示/隐藏相关内容的一种流行方式是再次对其进行不同的结构化,以便每个链接都在内容之前,例如,您可以执行$(this).next().show()
。有很多种方法可以给这只猫上皮。