下拉菜单

(思路:先把二级定位到屏幕外,鼠标悬停重新定位回来;另一个就是ul浮动,li也浮动)

下拉菜单的一般思路就是把子导航嵌套在无序列表中,把列表定位到屏幕之外,当鼠标悬停在其父列表项上时,重新定位它。

有两个问题需要注意,

第一个问题,列表项设置了float浮动,因此列表也要浮动已防止列表收缩:

ul.nav,ul.nav ul{float:left}

ul.nav li{float:left}

第二个问题,子导航的定位

ul.nav li ul{position:absolute;left:-999em}

ul.nav li:hover ul{left:auto}

一、CSS+JS下拉菜单

原理:一级菜单的li中包含二级菜单ul。在鼠标没有移上去时,二级菜单的ul是display:none的状态,鼠标一移上去变成display:block。改变这个display属性值是通过JS来实现。鼠标hover时,把整个二级菜单的ul给display出来,用到的事件onmouseonver。鼠标移出又把整个二级菜单的ul 给隐藏掉。

nav-js.html文件

<!DOCTYPE html >
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title></title>
<link href="nav-js.css" rel="stylesheet">
<script type="text/javascript">
//显示子菜单
function showSubMenu(li){
var subMenu = li.getElementsByTagName("ul")[0];
subMenu.style.display = "block";
} //隐藏子菜单
function hideSubMenu(li){
var subMenu = li.getElementsByTagName("ul")[0];
subMenu.style.display = "none";
}
</script>
</head>
<body>
<ul id="navigation">
<li><a href="#">首页</a></li>
<li onmouseover="showSubMenu(this)" onmouseout="hideSubMenu(this)"><a href="#">我们的服务</a>
<ul>
<li><a href="#">服务一</a></li>
<li><a href="#">服务二</a></li>
<li><a href="#">服务三</a></li>
<li><a href="#">服务四</a></li>
<li><a href="#">服务五</a></li>
</ul>
</li>
<li onmouseover="showSubMenu(this)" onmouseout="hideSubMenu(this)"><a href="#">我们的团队</a>
<ul>
<li><a href="#">服务一</a></li>
<li><a href="#">服务二</a></li>
<li><a href="#">服务三</a></li>
<li><a href="#">服务四</a></li>
<li><a href="#">服务五</a></li>
</ul>
</li>
<li><a href="#">我们的方向</a></li>
<li><a href="#">关于我们</a></li>
</ul>
</body>
</html>

nav-css.css文件

 @charset "UTF-8";
*{
margin:;
padding:;
} body{
font-size: 14px;
font-family: sans-serif;
}
#navigation,#navigation li ul{
list-style-type: none;
}
#navigation li{
float: left;
text-align: center;
position: relative;
}
#navigation li a:link,#navigation li a:visited{
display: block;
text-decoration: none;
color: #000;
width: 120px;
height: 40px;
line-height: 40px;
border: 1px solid #fff;
background: #c5dbf2;
border-width: 1px 1px 0 0;
}
#navigation li a:hover{
color: #fff;
background: #2687eb;
}
#navigation li ul li{
float: none;
}
#navigation li ul{
display: none;
position: absolute; /*二级ul使用绝对定位,宽度大于一级菜单时,才不会撑大一级*/

}
#navigation li ul li a:link,#navigation li ul li a:visited{
display: block;
width: 160px;
}

在46行,如果一级li的宽度小于二级li的宽度,那么就会撑大一级li的宽度,如图:

显示和隐藏二级UL的JS函数:

//显示子菜单
function showSubMenu(li){
var subMenu = li.getElementsByTagName("ul")[0]; /*传了一个参数li进来,表示当前鼠标经过的li,
再通过查找当前li下面的第一个ul,注意数组从0开始*/
subMenu.style.display = "block";
} //隐藏子菜单
function hideSubMenu(li){
var subMenu = li.getElementsByTagName("ul")[0];
subMenu.style.display = "none";
}

做到了兼容所有的主流浏览器。

二、纯CSS实现的下拉菜单

纯CSS写的下拉菜单,其他浏览器都可以兼容,唯独IE6这家伙不怎么听话不兼容,所以当时IE6时,采用table布局,来达到IE6兼容的目的。

HTML文件

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>纯css下拉菜单,兼容IE6</title>
<link rel="stylesheet" type="text/css" href="nav-css3.css">
<!--[if lte IE 6]>
<style tpye="text/css">
table{
border-collapse: collapse;
margin: 0;
padding: 0;
}
.menu ul li a.hide,.menu ul li a:visited.hide{
display: none;
}
.menu ul li a:hover{
color:#fff;
background: #b3ab79;
}
.menu ul li a:hover ul{
display: block;
position: absolute;
top: 32px;
left: 0;
width: 105px;
}
.menu ul li a:hover ul li a{
background: #faeec7;
color: #000;
width:160px;
}
.menu ul li a:hover ul li a:hover{
background: #dfc184;
color: #000;
}
</style>
<![endif]-->
</head>
<body>
<div class="menu">
<ul>
<li><a class="hide" href="#">我们的服务</a>
<!--[if lte IE 6]>
<a href="#">我们的服务
<table><tr><td>
<![endif]-->
<ul>
<li><a href="#">服务一</a></li>
<li><a href="#">服务一</a></li>
<li><a href="#">服务一</a></li>
<li><a href="#">服务一</a></li>
<li><a href="#">服务一</a></li>
</ul>
<!--[if lte IE 6]>
</td></tr></table>
</a>
<![endif]-->
</li>
<li><a class="hide" href="#">我们的服务</a>
<!--[if lte IE 6]>
<a href="#">我们的服务
<table><tr><td>
<![endif]-->
<ul>
<li><a href="#">服务一</a></li>
<li><a href="#">服务一</a></li>
<li><a href="#">服务一</a></li>
<li><a href="#">服务一</a></li>
<li><a href="#">服务一</a></li>
</ul>
<!--[if lte IE 6]>
</td></tr></table>
</a>
<![endif]-->
</li>
<li><a class="hide" href="#">我们的服务</a>
<!--[if lte IE 6]>
<a href="#">我们的服务
<table><tr><td>
<![endif]-->
<ul>
<li><a href="#">服务一</a></li>
<li><a href="#">服务一</a></li>
<li><a href="#">服务一</a></li>
<li><a href="#">服务一</a></li>
<li><a href="#">服务一</a></li>
</ul>
<!--[if lte IE 6]>
</td></tr></table>
</a>
<![endif]-->
</li>
</ul>
</div>
</body>
</html>

CSS文件

*{
margin:;
padding:;
}
.menu{
font-family: arial,sans-serif;
font-size: 14px;
width: 750px;
}
.menu ul{
padding:;
margin:;
list-style-type: none;
}
.menu ul li{
float: left;
position: relative;
} .menu ul li a, .menu ul li a:visited{
display: block;
text-align: center;
text-decoration: none;
width: 104px;
height: 30px;
color: #000;
border: 1px solid #fff;
border-width: 1px 1px 0 0;
background: #c9c9a7;
line-height: 30px;
font-size: 11px;
}
/*隐藏二级菜单ul*/
.menu ul li ul{
display: none;
}/*隐藏结束*/ .menu ul li:hover a{ /*????????????尝试修改此处*/
color: #fff;
background: #b3ab79;
}
/*显示二级菜单*/
.menu ul li:hover ul{
display: block;
position: absolute;
top: 31px;
left: 0px;
width: 105px;
}/*结束*/ /*添加二级菜单鼠标移过的样式*/
.menu ul li:hover ul li a{
display: block;
background: #faeec7;
color: #000;
width: 160px;
}
.menu ul li:hover ul li a:hover{
background: #dfc184;
color: #000;
}

ok,这样IE6也达到兼容。

CSS+JS下拉菜单和纯CSS下拉菜单的更多相关文章

  1. CSS+JS实现兼容性很好的无限级下拉菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DT ...

  2. 不要再纠结css/js/html有没有必要放在WEB-INF下了

    原因 首先,css/js/html没有必要放在WEB-INF下. 最终这些会被原封不动的展现在客户端,所以访问安全根本就不会成为问题. jsp放在web-inf下,原因主要有两个 1. 远古时代的模式 ...

  3. 谈谈一些有趣的CSS题目(十四)-- 纯 CSS 方式实现 CSS 动画的暂停与播放!

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  4. CSS学习笔记(8)--纯CSS绘制三角形(各种角度)

    纯CSS绘制三角形(各种角度) CSS三角形绘制方法,学会了这个,其它的也就简单.   我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多 ...

  5. Django使用本地css/js文件

    Django使用本地css/js文件 在manager.py同层级下创建static文件夹, 里面放上css , js, images等文件或者文件夹 我的文件夹层级 然后只需在settings.py ...

  6. HTML+CSS+JS基础知识

    HTML+CSS+JS基础知识 目录 对HTML+CSS+JS的理解 基础知识 对HTML+CSS+JS的理解 基础知识 插入样式表的三种方式 外部样式表:<link rel="sty ...

  7. 突破css选择器的局限,实现一个css地址选择器?

    首先看一个效果,注意地址栏的变化 然后思考一下,用css如何实现? css选择器的局限 选择器是css中的一大特色,用于选择需要添加样式的元素. 选择器的种类有很多,比如 元素选择器 p {color ...

  8. 谈谈一些有趣的CSS题目(十五)-- 谈谈 CSS 关键字 initial、inherit 和 unset

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  9. 支持多种浏览器的纯css下拉菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. python【第十七篇】jQuery

    1.jQuery是什么? jQuery是一个 JavaScript/Dom/Bom 库. jQuery 极大地简化了 JavaScript 编程. jQuery 很容易学习. 2.jQuery对象与D ...

  2. 缓存 Cache

    Controllers层 public class HomeController : Controller    {        //        // GET: /Home/       // ...

  3. 图片Base64编码 简单使用

    图片在线转换Base64,图片编码base64 http://tool.css-js.com/base64.html HTML5 + js <input type="file" ...

  4. Http 状态码详解

    状态码 含义 100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应.服务器必须在 ...

  5. 点击播放js

    <div class="videobox" id="videobox"> <img src="temp/pic1.jpg" ...

  6. 解决方案:安装wordpress出现500 Internal Server Error

    做一个资讯站点的时候遇到一个wordpress不知道算不算常见的问题:程序安装的时候提示500 Internal Server Error 那么最终百度谷歌找到以下解决方案: 安装新版本wordpre ...

  7. Uva10766 Organising the Organisation

    题目链接戳这里 基尔霍夫矩阵裸题.构建基尔霍夫矩阵(度数矩阵-邻接矩阵),求他的任意\(n-1\)阶主子式的绝对值即为答案. 这题开始用java写,结果BigInteger太慢Tle了. 后来用c++ ...

  8. Stanford CoreNLP--Split Sentence

    分句功能参考 Stanford Tokenizer. 在edu.stanford.nlp.pipeline包中实现了一系列分词分句功能,其中SentenceAnnotator类实现了对文件分句功能. ...

  9. 在openshift上自定义node.js的版本

    https://github.com/ramr/nodejs-custom-version-openshift 由于是线上服务器,一步一步来: 先把上面的工程拉下来,覆盖到初始化的工程里,提交,让服务 ...

  10. IAR ARM、IAR STM8、IAR MSP430共用一个IDE

    转自IAR ARM.IAR STM8.IAR MSP430共用一个IDE 试了安装好多个不同版本不同编译器的IAR,终于明白不同编译器的IAR共用IDE的条件,把几个不同编译器的IAR安装在一起,共用 ...