Jump to content

Archived

This topic is now archived and is closed to further replies.

galvin

CSS a:hover not working in IE8, but is working in Firefox

Recommended Posts

I am working on something for work and cannot figure this out and it is time sensitive so if anyone can offer suggestions of what to try, please do.

 

I don't know if the problem is with the CSS or the JS, so if anyone has any inklings, please share.

 

The site has a menu across the top and when you hover, a sub-menu "unfolds".  When you hover over a submenu option, it turns from red to orange-ish.  Once the full submenu is there, in Firefox, hovering works fine, always.  But in IE8, the hovering color change does NOT work once the menu is fully generated (for the few seconds as it unfolds, the hovering works right, but after the submenu is done generating, the hovering doesn't work).

 

This file is chrome.js which makes the menu work....

//** Chrome Drop Down Menu- Author: Dynamic Drive (http://www.dynamicdrive.com)

//** Updated: July 14th 06' to v2.0
//1) Ability to "left", "center", or "right" align the menu items easily, just by modifying the CSS property "text-align".
//2) Added an optional "swipe down" transitional effect for revealing the drop down menus.
//3) Support for multiple Chrome menus on the same page.

//** Updated: Nov 14th 06' to v2.01- added iframe shim technique

//** Updated: July 23rd, 08 to v2.4
//1) Main menu items now remain "selected" (CSS class "selected" applied) when user moves mouse into corresponding drop down menu. 
//2) Adds ability to specify arbitrary HTML that gets added to the end of each menu item that carries a drop down menu (ie: a down arrow image).
//3) All event handlers added to the menu are now unobstrusive, allowing you to define your own "onmouseover" or "onclick" events on the menu items.
//4) Fixed elusive JS error in FF that sometimes occurs when mouse quickly moves between main menu items and drop down menus

//** Updated: Oct 29th, 08 to v2.5 (only .js file modified from v2.4)
//1) Added ability to customize reveal animation speed (# of steps)
//2) Menu now works in IE8 beta2 (a valid doctype at the top of the page is required)

var cssdropdown={
disappeardelay: 250, //set delay in miliseconds before menu disappears onmouseout
dropdownindicator: '<img src="down.gif" border="0" />', //specify full HTML to add to end of each menu item with a drop down menu
enablereveal: [true, 5], //enable swipe effect? [true/false, steps (Number of animation steps. Integer between 1-20. Smaller=faster)]
enableiframeshim: 1, //enable "iframe shim" in IE5.5 to IE7? (1=yes, 0=no)

//No need to edit beyond here////////////////////////

dropmenuobj: null, asscmenuitem: null, domsupport: document.all || document.getElementById, standardbody: null, iframeshimadded: false, revealtimers: {},

getposOffset:function(what, offsettype){
var totaloffset=(offsettype=="left")? what.offsetLeft : what.offsetTop;
var parentEl=what.offsetParent;
while (parentEl!=null){
	totaloffset=(offsettype=="left")? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop;
	parentEl=parentEl.offsetParent;
}
return totaloffset;
},

css:function(el, targetclass, action){
var needle=new RegExp("(^|\\s+)"+targetclass+"($|\\s+)", "ig")
if (action=="check")
	return needle.test(el.className)
else if (action=="remove")
	el.className=el.className.replace(needle, "")
else if (action=="add" && !needle.test(el.className))
	el.className+=" "+targetclass
},

showmenu:function(dropmenu, e){
if (this.enablereveal[0]){
	if (!dropmenu._trueheight || dropmenu._trueheight<10)
		dropmenu._trueheight=dropmenu.offsetHeight
	clearTimeout(this.revealtimers[dropmenu.id])
	dropmenu.style.height=dropmenu._curheight=0
	dropmenu.style.overflow="hidden"
	dropmenu.style.visibility="visible"
	this.revealtimers[dropmenu.id]=setInterval(function(){cssdropdown.revealmenu(dropmenu)}, 10)
}
else{
	dropmenu.style.visibility="visible"
}
this.css(this.asscmenuitem, "selected", "add")
},

revealmenu:function(dropmenu, dir){
var curH=dropmenu._curheight, maxH=dropmenu._trueheight, steps=this.enablereveal[1]
if (curH<maxH){
	var newH=Math.min(curH, maxH)
	dropmenu.style.height=newH+"px"
	dropmenu._curheight= newH + Math.round((maxH-newH)/steps) + 1
}
else{ //if done revealing menu
	dropmenu.style.height="auto"
	dropmenu.style.overflow="hidden"
	clearInterval(this.revealtimers[dropmenu.id])
}
},

clearbrowseredge:function(obj, whichedge){
var edgeoffset=0
if (whichedge=="rightedge"){
	var windowedge=document.all && !window.opera? this.standardbody.scrollLeft+this.standardbody.clientWidth-15 : window.pageXOffset+window.innerWidth-15
	var dropmenuW=this.dropmenuobj.offsetWidth
	if (windowedge-this.dropmenuobj.x < dropmenuW)  //move menu to the left?
		edgeoffset=dropmenuW-obj.offsetWidth
}
else{
	var topedge=document.all && !window.opera? this.standardbody.scrollTop : window.pageYOffset
	var windowedge=document.all && !window.opera? this.standardbody.scrollTop+this.standardbody.clientHeight-15 : window.pageYOffset+window.innerHeight-18
	var dropmenuH=this.dropmenuobj._trueheight
	if (windowedge-this.dropmenuobj.y < dropmenuH){ //move up?
		edgeoffset=dropmenuH+obj.offsetHeight
		if ((this.dropmenuobj.y-topedge)<dropmenuH) //up no good either?
			edgeoffset=this.dropmenuobj.y+obj.offsetHeight-topedge
	}
}
return edgeoffset
},

dropit:function(obj, e, dropmenuID){
if (this.dropmenuobj!=null) //hide previous menu
	this.hidemenu() //hide menu
this.clearhidemenu()
this.dropmenuobj=document.getElementById(dropmenuID) //reference drop down menu
this.asscmenuitem=obj //reference associated menu item
this.showmenu(this.dropmenuobj, e)
this.dropmenuobj.x=this.getposOffset(obj, "left")
this.dropmenuobj.y=this.getposOffset(obj, "top")
this.dropmenuobj.style.left=this.dropmenuobj.x-this.clearbrowseredge(obj, "rightedge")+"px"
this.dropmenuobj.style.top=this.dropmenuobj.y-this.clearbrowseredge(obj, "bottomedge")+obj.offsetHeight+1+"px"
this.positionshim() //call iframe shim function
},

positionshim:function(){ //display iframe shim function
if (this.iframeshimadded){
	if (this.dropmenuobj.style.visibility=="visible"){
		this.shimobject.style.width=this.dropmenuobj.offsetWidth+"px"
		this.shimobject.style.height=this.dropmenuobj._trueheight+"px"
		this.shimobject.style.left=parseInt(this.dropmenuobj.style.left)+"px"
		this.shimobject.style.top=parseInt(this.dropmenuobj.style.top)+"px"
		this.shimobject.style.display="block"
	}
}
},

hideshim:function(){
if (this.iframeshimadded)
	this.shimobject.style.display='none'
},

isContained:function(m, e){
var e=window.event || e
var c=e.relatedTarget || ((e.type=="mouseover")? e.fromElement : e.toElement)
while (c && c!=m)try {c=c.parentNode} catch(e){c=m}
if (c==m)
	return true
else
	return false
},

dynamichide:function(m, e){
if (!this.isContained(m, e)){
	this.delayhidemenu()
}
},

delayhidemenu:function(){
this.delayhide=setTimeout("cssdropdown.hidemenu()", this.disappeardelay) //hide menu
},

hidemenu:function(){
this.css(this.asscmenuitem, "selected", "remove")
this.dropmenuobj.style.visibility='hidden'
this.dropmenuobj.style.left=this.dropmenuobj.style.top="-1000px"
this.hideshim()
},

clearhidemenu:function(){
if (this.delayhide!="undefined")
	clearTimeout(this.delayhide)
},

addEvent:function(target, functionref, tasktype){
if (target.addEventListener)
	target.addEventListener(tasktype, functionref, false);
else if (target.attachEvent)
	target.attachEvent('on'+tasktype, function(){return functionref.call(target, window.event)});
},

startchrome:function(){
if (!this.domsupport)
	return
this.standardbody=(document.compatMode=="CSS1Compat")? document.documentElement : document.body
for (var ids=0; ids<arguments.length; ids++){
	var menuitems=document.getElementById(arguments[ids]).getElementsByTagName("a")
	for (var i=0; i<menuitems.length; i++){
		if (menuitems[i].getAttribute("rel")){
			var relvalue=menuitems[i].getAttribute("rel")
			var asscdropdownmenu=document.getElementById(relvalue)
			this.addEvent(asscdropdownmenu, function(){cssdropdown.clearhidemenu()}, "mouseover")
			this.addEvent(asscdropdownmenu, function(e){cssdropdown.dynamichide(this, e)}, "mouseout")
			this.addEvent(asscdropdownmenu, function(){cssdropdown.delayhidemenu()}, "click")
			try{
				menuitems[i].innerHTML=menuitems[i].innerHTML+" "+this.dropdownindicator
			}catch(e){}
			this.addEvent(menuitems[i], function(e){ //show drop down menu when main menu items are mouse over-ed
				if (!cssdropdown.isContained(this, e)){
					var evtobj=window.event || e
					cssdropdown.dropit(this, evtobj, this.getAttribute("rel"))
				}
			}, "mouseover")
			this.addEvent(menuitems[i], function(e){cssdropdown.dynamichide(this, e)}, "mouseout") //hide drop down menu when main menu items are mouse out
			this.addEvent(menuitems[i], function(){cssdropdown.delayhidemenu()}, "click") //hide drop down menu when main menu items are clicked on
		}
	} //end inner for
} //end outer for
if (this.enableiframeshim && document.all && !window.XDomainRequest && !this.iframeshimadded){ //enable iframe shim in IE5.5 thru IE7?
	document.write('<IFRAME id="iframeshim" src="about:blank" frameBorder="0" scrolling="no" style="left:0; top:0; position:absolute; display:none;z-index:90; background: transparent;"></IFRAME>')
	this.shimobject=document.getElementById("iframeshim") //reference iframe object
	this.shimobject.style.filter='progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)'
	this.iframeshimadded=true
}
} //end startchrome

}

 

 

This file is the CSS file...

.chromestyle{
  width: 99%;
  font-weight: bold;
}

.chromestyle:after{ /*Add margin between menu and rest of content in Firefox*/
content: "."; 
display: block; 
height: 0; 
clear: both; 
visibility: hidden;
}

.chromestyle ul{
width: 100%;
background: url(chromebg.gif) center center repeat-x; /*THEME CHANGE HERE*/
padding: 4px 0;
margin: 0;
text-align: center; /*set value to "left", "center", or "right"*/
}

.chromestyle ul li{
display: inline;
}

.chromestyle ul li a{
color: #fff;
padding: 4px 7px;
margin: 0;
text-decoration: none;
}
.chromestyle ul li a:hover{
color: #000;
padding: 4px 7px;
margin: 0;
text-decoration: none;
}

.chromestyle ul li a:hover, .chromestyle ul li a.selected{ /*script dynamically adds a class of "selected" to the current active menu item*/
background: url(chromebg-over.gif) center center repeat-x; /*THEME CHANGE HERE*/
}

/* ######### Style for Drop Down Menu ######### */

.dropmenudiv{
position:absolute;
top:0;
border:1px solid #fff; /*THEME CHANGE HERE*/
border-bottom-width: 0;
font:normal 11px tahoma;
line-height:18px;
z-index:100;
width: 200px;
visibility: hidden;
background:#f26532;
width:140px;
visibility: hidden;
filter:alpha(opacity=80);
-moz-opacity:.80;
opacity:.80; 
}


.dropmenudiv a{
width: 138px;
height: 20px;
display: block;
text-indent: 3px;
border-bottom: 1px solid #ffffff; /*THEME CHANGE HERE*/
padding: 2px 0;
text-decoration: none;
font-weight: bold;
color: black;

}

* html .dropmenudiv a{ /*IE only hack*/
width: 100%;
}

.dropmenudiv a:hover{ /*THEME CHANGE HERE*/
background-color: #f99e36;
}

 

 

This is the HTML...

 

<div class="chromestyle" id="chromemenu">

<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About Us</a></li>
<li><a href="#" rel="dropmenu1">Contact Us</a></li>
<li><a href="#" rel="dropmenu2">Employment</a></li>
<li><a href="#">Toastmasters  </a></li>
<li><a href="#" rel="dropmenu3">Credit Application </a></li>
<li><a href="#">Employee Log in</a></li>
</ul>
</div>

<!--1st drop down menu -->
<div id="dropmenu1" class="dropmenudiv">
<a href="#">SFS</a>
<a href="#">FRESNO</a>
<a href="#">SJ</a>
<a href="#">SM</a>
<a href="#">SAC</a>
<a href="#">LV</a>
<a href="#">PORT</a>
<a href="#">TEMPE</a>
</div>


<!--2nd drop down menu -->
<div id="dropmenu2" class="dropmenudiv" style="width: 150px;">
<a href="#">Benefits</a>
<a href="#">Positions</a>
<a href="#">Application (pdf)</a>
</div>

<!--3rd drop down menu -->
<div id="dropmenu3" class="dropmenudiv" style="width: 150px;">
<a href="creditapp.asp">Web Form</a>
</div>

Share this post


Link to post
Share on other sites

did you tried asking dynamic drive whether it works in IE8 or not.

 

vineet

Share this post


Link to post
Share on other sites

Just did, thanks for giving me that idea.  Found that "filter:alpha(opacity=80);" was the culprit.  Took that out and it works now. Thanks!

Share this post


Link to post
Share on other sites

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.