用JS写二级导航(下拉菜单)

昨天学的新知识。工作有点多,没来得及总结。

今天耐心整理一下吧。

先看下效果,目前网站没有上线,凑合着看看图片吧。

下面是代码:

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>下拉导航</title>
<style type="text/css">
/*reset*/
html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary, time, mark, audio, video { margin:0; padding:0; border:0; outline:0; font-size:100%; vertical-align:baseline; background:transparent;}
body { line-height:1;}
*{word-wrap:break-word;word-break:break-all;}
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display:block; }
nav ul, ol, li, menu { list-style:none; }
blockquote, q { quotes:none; }
blockquote:before, blockquote:after, q:before, q:after { content:''; content:none; }
a { margin:0; padding:0; font-size:100%; vertical-align:baseline; background:transparent; }
/* change colours to suit your needs */
ins { background-color:#ff9; color:#000; text-decoration:none; }
/* change colours to suit your needs */
mark { background-color:#ff9; color:#000; font-style:italic; font-weight:bold; }
del { text-decoration: line-through; }
abbr[title], dfn[title] { border-bottom:1px dotted; cursor:help; }
table { border-collapse:collapse; border-spacing:0;}
/* change border colour to suit your needs */
hr { display:block; height:1px; border:0; border-top:1px solid #cccccc; margin:1em 0; padding:0; }
address, caption, cite, code, dfn, em, th, var { font-weight: normal; font-style: normal; }
caption, th { text-align: left; }
h1, h2, h3, h4, h5, h6 { font-weight: normal; font-size: 100%; }
q:before, q:after { content: ''; }
abbr, acronym { border: 0; }
/* Clear Fix */
.clearfix:after,
.rwp:after{ content:"."; display:block; height:0; clear:both; visibility:hidden; }
.clearfix { display:inline-block; }
.clearfix { display:block; }
.clear { clear:both; height:0px; font-size:0px; line-height:0px; }
/*上面这一堆全是reset不用管*/
body{ background:#fff; font-family:"微软雅黑", "黑体", arial, sans-serif; font-size:12px;}
.main{ width:960px; margin:0 auto; background:#f0f0f0; border:solid #ccc; border-width:0 1px; height:800px; padding:20px 0; }
.side{ float:left; width:240px; padding:10px;}
.menu{ border:2px solid #c00; background:#fff;}
.menu dl{}
.menu dt,
.menu dd{border-bottom:1px solid #ccc;}
.menu dl a{ display:block; color:#900;text-decoration:none;}
.menu dl a:hover{ color:#d00; text-decoration:none; background:#f6f6f6;}
.menu dt a{ padding-left:12px;}
.menu dd a{ padding-left:24px;}/*左边的padding值分开一级和二级导航*/
.menu dt{ height:26px; line-height:26px; font-size:14px;}
.menu dd{ display:none;/*默认隐藏的dd是二级菜单*/ font-size:12px; height:22px; line-height:22px; }
.menu dl:hover dd,
.menu dl.hover dd{ display:block;}/*标准的浏览器用:hover 就可以控制了,.hover类是给ie6以下浏览器看的*/
</style>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>
$(function(){
menu();
});
function menu(){
//如果是IE6才执行
if($.browser.msie && $.browser.version <= 6){
$("#menu dl").hover(
function(){
$(this).addClass("hover");
},
function(){
$(this).removeClass("hover");
}
);
//end if
}
};
</script>
</head>
<body>
<div class="main">
<div class="side">
<div class="menu" id="menu">
<dl>
<dt><a href="#nogo">主导航一</a></dt>
<dd><a href="#nogo">副标题11</a></dd>
<dd><a href="#nogo">副标题12</a></dd>
<dd><a href="#nogo">副标题13</a></dd>
</dl>
<dl>
<dt><a href="#nogo">主导航二</a></dt>
<dd><a href="#nogo">副标题21</a></dd>
<dd><a href="#nogo">副标题22</a></dd>
<dd><a href="#nogo">副标题33</a></dd>
</dl>
<dl>
<dt><a href="#nogo">主导航一</a></dt>
<dd><a href="#nogo">副标题11</a></dd>
<dd><a href="#nogo">副标题12</a></dd>
<dd><a href="#nogo">副标题13</a></dd>
</dl>
<dl>
<dt><a href="#nogo">主导航三</a></dt>
<dd><a href="#nogo">副标题31</a></dd>
<dd><a href="#nogo">副标题32</a></dd>
<dd><a href="#nogo">副标题33</a></dd>
</dl>
</div>
</div>
</div>
</body>

</html>

注释中写得满清楚,ie6不支持hover效果。

如果想让IE也支持HOVER效果,那么在文件中要链上这段JS代码:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>
/*
*该文件解决ie6普通标签hover支持
*/
(function($){
var csshoverReg = /(^|\s)(([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active)/i,
currentSheet, doc = window.document, hoverEvents = [], activators = {
onhover:{on:'onmouseover', off:'onmouseout'},
onactive:{on:'onmousedown', off:'onmouseup'}
}
function parseStylesheets() {
if(!/MSIE (5|6)/.test(navigator.userAgent))
return;
window.attachEvent('onunload', unhookHoverEvents);
var sheets = doc.styleSheets, l = sheets.length;
for(var i=0; i<l; i++)
parseStylesheet(sheets[i]);
}
function parseStylesheet(sheet) {
if(sheet.imports) {
try {
var imports = sheet.imports, l = imports.length;
for(var i=0; i<l; i++)
parseStylesheet(sheet.imports[i]);
} catch(securityException) {
}
}
try {
var rules = (currentSheet = sheet).rules, l = rules.length;
for(var j=0; j<l; j++)
parseCSSRule(rules[j]);
} catch(securityException) {
}
}
function parseCSSRule(rule) {
var select = rule.selectorText, style = rule.style.cssText;
if(!csshoverReg.test(select) || !style)
return;
var pseudo = select.replace(/[^:]+:([a-z-]+).*/i, 'on$1');
var newSelect = select.replace(/(\.([a-z0-9_-]+):[a-z]+)|(:[a-z]+)/gi, '.$2' + pseudo);
var className = (/\.([a-z0-9_-]*on(hover|active))/i).exec(newSelect)[1];
var affected = select.replace(/:(hover|active).*$/, '');
var elements = getElementsBySelect(affected);
if(elements.length == 0)
return;
currentSheet.addRule(newSelect, style);
for(var i=0; i<elements.length; i++)
new HoverElement(elements[i], className, activators[pseudo]);
}
function HoverElement(node, className, events) {
if(!node.hovers)
node.hovers = {};
if(node.hovers[className])
return;
node.hovers[className] = true;
hookHoverEvent(node, events.on, function() {
node.className += ' ' + className;
});
hookHoverEvent(node, events.off, function() {
node.className = node.className.replace(new RegExp('\\s+'+className, 'g'),'');
});
}
function hookHoverEvent(node, type, handler) {
node.attachEvent(type, handler);
hoverEvents[hoverEvents.length] = {
node:node, type:type, handler:handler
};
}
function unhookHoverEvents() {
for(var e,i=0; i<hoverEvents.length; i++) {
e = hoverEvents[i];
e.node.detachEvent(e.type, e.handler);
}
}
function getElementsBySelect(rule) {
var parts, nodes = [doc];
parts = rule.split(' ');
for(var i=0; i<parts.length; i++) {
nodes = getSelectedNodes(parts[i], nodes);
}
return nodes;
}
function getSelectedNodes(select, elements) {
var result, node, nodes = [];
var identify = (/\#([a-z0-9_-]+)/i).exec(select);
if(identify) {
var element = doc.getElementById(identify[1]);
return element? [element]:nodes;
}
var classname = (/\.([a-z0-9_-]+)/i).exec(select);
var tagName = select.replace(/(\.|\#|\:)[a-z0-9_-]+/i, '');
var classReg = classname? new RegExp('\\b' + classname[1] + '\\b'):false;
for(var i=0; i<elements.length; i++) {
result = tagName? elements[i].all.tags(tagName):elements[i].all;
for(var j=0; j<result.length; j++) {
node = result[j];
if(classReg && !classReg.test(node.className))
continue;
nodes[nodes.length] = node;
}
}
return nodes;
}
$(parseStylesheets);
})(jQuery);
</script> 

现在就可以放心大胆的使用hover了!

posted @ 2011-04-28 10:49  美第其  阅读(10928)  评论(0编辑  收藏  举报