码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2015-10-19 17:31:51      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:js   鼠标   

在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><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 */
技术分享
技术分享
{
技术分享 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><href="#"> lorem </a></li>
技术分享 
<li class="folder">
技术分享 
<href="#" class="submenu"> adipiscing </a>
技术分享 
<ul>
技术分享 
<li><href="#"> dolor </a></li>
技术分享 
<li class="folder">
技术分享 
<href="#" class="submenu"> consectetuer</a>
技术分享 
<ul>
技术分享 
<li><href="#"> elit </a></li>
技术分享 
<li><href="#"> ipsum </a></li>
技术分享 
<li><href="#"> Donec </a></li>
技术分享 
</ul>
技术分享 
</li>
技术分享 
<li><href="#"> vestibulum </a></li>
技术分享 
</ul>
技术分享 
</li>
技术分享 
<li class="folder">
技术分享 
<href="#" class="submenu"> consectetuer</a>
技术分享 
<ul>
技术分享 
<li><href="#"> elit </a></li>
技术分享 
<li><href="#"> ipsum </a></li>
技术分享 
<li><href="#"> Donec </a></li>
技术分享 
</ul>
技术分享 
</li>
技术分享 
<li><href="#"> sit amet </a></li>
技术分享
</ul>
技术分享
</body>
技术分享
</html>


本文出自 “没有水勒鱼” 博客,请务必保留此出处http://javaqun.blog.51cto.com/10687700/1704239

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

标签:js   鼠标   

原文地址:http://javaqun.blog.51cto.com/10687700/1704239

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!