CSS实现onMouseOver、onMouseOut效果和层套菜单

在IE中 <a> 标签的。而实际上 WEB 标准里面, 应该对所有元素都支持。
如果使用 Mozilla 或者 Opera, 那么可以看到不需要这个 htc 都可以正常运行的。 因为 htc 是 IE 特有的,别的浏览器不能理解,会忽略掉,不影响结果的显示。

以下这段 htc 是一个老外写的针对 IE 的 hover 行为的一个修正。
有了这个代码就方便多了,而且最可贵的是,以上的这个页面例子是可以兼容 IE, Mozilla 和 Opera 的。

原先在html里都是使用onMouserOver等事件,实现鼠标焦点控制的,从来没有想到过用CSS简化原先繁琐的工作,直到偶然间发现了whatever:hover,才认识到CSS原来可以做很多工作,甚至可是实现繁杂的menubar。

实现的核心部分是csshover.htc文件,它其实就是JScript代码,负责处理所有的CSS格式,根据定制的CSS格式,生成onMouseOver和onMouseOut事件,实现了hover的组件化。使用时只需制定div:hover{ background:#f8f8f8; },就实现了鼠标移动到div图层上时,改变背景色的事件。

csshover.htc

<attach event="ondocumentready" handler="parseStylesheets" />
<script language="JScript">
/**
* Pseudos - V1.30.050121 - hover & active
* ---------------------------------------------
* Peterned - http://www.xs4all.nl/~peterned/
* (c) 2005 - Peter Nederlof
*
* Credits - Arnoud Berendsen
* - Martin Reurings
* - Robert Hanson
*
* howt body { behavior:url("csshover.htc"); }
* ---------------------------------------------
*/

var currentSheet, doc = window.document, activators = {
onhover:{on:‘onmouseover‘, off:‘onmouseout‘},
onactive:{on:‘onmousedown‘, off:‘onmouseup‘}
}

function parseStylesheets() {
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(!(/(^|\s)(([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active)/i).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.*$/, ‘‘);
 var elements = getElementsBySelect(affected);

 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;
node.attachEvent(events.on,
 function() { node.className += ‘ ‘ + className; });
node.attachEvent(events.off,
 function() { node.className =
 node.className.replace(new RegExp(‘\\s+‘+className, ‘g‘),‘‘); });
}

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 classname = (/\.([a-z0-9_-]+)/i).exec(select);
 var identify = (/\#([a-z0-9_-]+)/i).exec(select);
 var tagName = select.replace(/(\.|\#|\:)[a-z0-9_-]+/i, ‘‘);
 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((identify && node.id != identify[1]) || (classname && !(new RegExp(‘\\b‘ +
 classname[1] + ‘\\b‘).exec(node.className)))) continue;
 nodes[nodes.length] = node;
 }
 } return nodes;
}
</script>

Test.htm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<title> New Document </title>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
<meta name="Generator" content="EditPlus">
<meta name="Author" content="Roger Chen">
<meta name="keywords" content="">
<meta name="description" content="">
<style>
body {behavior: url(csshover.htc);}
table#tbl tr:hover {background: #000000; color: #ffffff;}
div.test:hover {background: #000000; color: #ffffff;}
a.test:hover {background: #000000; color: #ffffff;}
input.test2:hover {background: #000000; border: 1px dotted black;}
</style>

<div class="test">haha</div><a href="" class="test">5456456</a>
<p>表格1:</p>
<table id="tbl" border="1" width="100%">
<tr>
<td>OK</td>
<td>yes</td>
<td>no</td>
</tr>
<tr>
<td>haha</td>
<td>fsdfsdf</td>
<td>测试</td>
</tr>
<tr>
<td>木野狐</td>
<td>html/css</td>
<td>javascript</td>
</tr>
</table>
<p>表格2:</p>
<table id="tbl" border="1" width="100%">
<tr>
<td>OK</td>
<td>yes</td>
<td>no</td>
</tr>
<tr>
<td>haha</td>
<td>fsdfsdf</td>
<td>测试</td>
</tr>
<tr>
<td>木野狐</td>
<td>html/css</td>
<td>javascript</td>
</tr>
</table>
<input class="test2">

menubar.htm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>
<head>
<title> whatever:hover cssmenu </title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<style type="text/css">

body {
 behavior:url("csshover.htc");
}

* {
 font-family:arial,tahoma,verdana,helvetica;
 font-size:12px;
}

/* the menu */

ul,li,a {
 display:block;
 margin:0;
 padding:0;
 border:0;
}

ul {
 width:150px;
 border:1px solid #9d9da1;
 background:white;
 list-style:none;
}

li {
 position:relative;
 padding:1px;
 padding-left:26px;
 background:url("images/item_moz.gif") no-repeat;
 z-index:9;
}
 li.folder { background:url("images/item_folder.gif") no-repeat; }
 li.folder ul {
 position:absolute;
 left:120px; /* IE */
 top:5px;
 }
 li.folder>ul { left:140px; } /* others */

a {
 padding:2px;
 border:1px solid white;
 text-decoration:none;
 color:gray;
 font-weight:bold;
 width:100%; /* IE */
}
 li>a { width:auto; } /* others */

li a.submenu {
 background:url("images/sub.gif") right no-repeat;
}

/* regular hovers */

a:hover {
 border-color:gray;
 background-color:#bbb7c7;
 color:black;
}
 li.folder a:hover {
 background-color:#bbb7c7;
 }

/* hovers with specificity */

li.folder:hover { z-index:10; }
 
ul ul, li:hover ul ul {
 display:none;
}

li:hover ul, li:hover li:hover ul {
 display:block;
}

</style>

</head>

<body>

<ul id="menu">
 <li><a href="#"> lorem </a></li>
 <li class="folder">
 <a href="#" class="submenu"> adipiscing </a>
 <ul>
 <li><a href="#"> dolor </a></li>
 <li class="folder">
 <a href="#" class="submenu"> consectetuer</a>
 <ul>
 <li><a href="#"> elit </a></li>
 <li><a href="#"> ipsum </a></li>
 <li><a href="#"> Donec </a></li>
 </ul>
 </li>
 <li><a href="#"> vestibulum </a></li>
 </ul>
 </li>
 <li class="folder">
 <a href="#" class="submenu"> consectetuer</a>
 <ul>
 <li><a href="#"> elit </a></li>
 <li><a href="#"> ipsum </a></li>
 <li><a href="#"> Donec </a></li>
 </ul>
 </li>
 <li><a href="#"> sit amet </a></li>
</ul>
</body>
</html>

时间: 2024-10-16 17:12:32

CSS实现onMouseOver、onMouseOut效果和层套菜单的相关文章

js+css实现带缓冲效果右键弹出菜单

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ

CSS技巧收集——毛玻璃效果

CSS技巧收集--毛玻璃效果 原文地址    http://www.cnblogs.com/ghost-xyx/p/5677168.html 先上 demo和 源码 其实毛玻璃的模糊效果技术上比较简单,只是用到了 css 滤镜(filter)中的 blur 属性.但是要做一个好的毛玻璃效果,需要注意很多细节. 比如我们需要将上图中页面中间的文字区域变成毛玻璃效果,首先想到的是给其设置一个透明度,并添加模糊滤镜: .content { background-color: rgba(0,0,0,0.

Html、CSS、JavaScript 实时效果在线编辑器 - 学习的好工具,算不算?!

关于 二维码 与 NFC 之间的出身贫贱说 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. http://jsfiddle.net/vnkuZ/ 总共四个工作区:左上是 Html 界面组件:左下

HTML和CSS中的居中效果(1)

HTML和CSS中的居中效果 单行上下左右居中 Html: <div class="container"></div> CSS: .container{ width: 600px; height: 300px; text-align: center; line-height: 300px; border: 1px solid green; } 固定高宽上下左右居中 Html: <div class="container"><

css冻结列的效果

<!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8" /><title>css冻结列的效果</title><!-- 1.div里面放table或者其它容器,当子容器的宽度大于父容器时,父容器就会出现滚动条.2.头部固定不动的列让它脱离文档流(position:fixed|absolute),然后给table一个margi

如何使用CSS实现小三角形效果

如何使用CSS实现小三角形效果:建议:尽可能的手写代码,可以有效的提高学习效率和深度.在众多的网页效果中,都有小三角形效果的应用,能够增加特定应用的美观度,下面就给出一段实例代码,里面介绍了两种实现小三角头效果的方式.代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&

css实现文字竖排效果

css实现文字竖排效果:在当前大家都习惯于横向排列的文本,但是绝大多数朋友也是知道的,在古代中国的文本是竖向排列的,本章节通过代码实例介绍一下如何实现文本的竖向排列效果,这样的需求在实际应用中也是有的.代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.so

纯css实现照片墙3D效果

每张照片都有美丽的故事.美好的回忆.家居中的照片墙则帮你展现出这些承载着家庭重要记忆的照片,除了用画框装饰照片挂在墙上外,照片墙还可以演变为手绘照片墙.也经常在网上看到一些关于照片墙的特效案例,决定自己动手试试. v直接上代码 这篇博客呢就是演示一个照片墙的效果.所以废话不多说,直接上代码然后展示特效.有兴趣的道友可以自己练练手试试.也可以改动改动其中的属性多玩玩,自己测试的时候建议用美女的照片,绝对"乐在其中". 1.准备材料:  准备材料就是没什么材料,自己麻溜赶快的去:百度找几张

实用js+css多级树形展开效果导航菜单

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ