Log in

View Full Version : Pop up menu with rollover image



cbridges
04-04-2009, 02:23 PM
I am trying to set up a horizontal menu bar made of images. For each menu item I have created an image for normal state and one for rollover. I want the image on each menu item to change when rolled over and at the same time have a drop down menu appear from each item. I am using Dreamweaver and have used the built in code..but its not working. I can get it to either do the rollover image or drop down menu but not both. Is there an easy way to do both..or do I need seperate css for each menu item?:confused: Thanks in advance!

bluewalrus
04-04-2009, 10:59 PM
Dont know what you mean, can you put up coding examples of both things you've made?

cbridges
04-05-2009, 03:14 PM
I have put a copy of the test page at http://www.auburnfireandrescue.org/city

For the drop down menus on the navigation bar I am using DD AnyLink JS Drop Down Menu http://www.dynamicdrive.com/dynamicindex1/dropmenuindex.htm

For the image rollover on the navigation bar I am using Dreamweavers code.

The navigation bar for Emergency Services, weather, links and home work since I do not have drop down menus for these
The navigation bar does not work for the others. For those I want the image to change on rollover and also have the dropdown menus at the same time.

I can get the drop down to work if I remove the code for image change on rollover

I am new to this and may be going at it the wrong way.
Thanks for any help

bluewalrus
04-05-2009, 06:02 PM
This needs a little style work for the tab appearance. I dislike dreamweaver created code.....


<!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-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>
<script type="text/javascript">//** AnyLink JS Drop Down Menu v2.0- (c) Dynamic Drive DHTML code library: http://www.dynamicdrive.com
//** Script Download/ instructions page: http://www.dynamicdrive.com/dynamicindex1/dropmenuindex.htm
//** January 29th, 2009: Script Creation date

var anylinkmenu={

menusmap: {},
effects: {delayhide: 200, shadow:{enabled:true, opacity:0.3, depth: [5, 5]}, fade:{enabled:false, duration:500}}, //customize menu effects

dimensions: {},

getoffset:function(what, offsettype){
return (what.offsetParent)? what[offsettype]+this.getoffset(what.offsetParent, offsettype) : what[offsettype]
},

getoffsetof:function(el){
el._offsets={left:this.getoffset(el, "offsetLeft"), top:this.getoffset(el, "offsetTop"), h: el.offsetHeight}
},

getdimensions:function(menu){
this.dimensions={anchorw:menu.anchorobj.offsetWidth, anchorh:menu.anchorobj.offsetHeight,
docwidth:(window.innerWidth ||this.standardbody.clientWidth)-20,
docheight:(window.innerHeight ||this.standardbody.clientHeight)-15,
docscrollx:window.pageXOffset || this.standardbody.scrollLeft,
docscrolly:window.pageYOffset || this.standardbody.scrollTop
}
if (!this.dimensions.dropmenuw){
this.dimensions.dropmenuw=menu.dropmenu.offsetWidth
this.dimensions.dropmenuh=menu.dropmenu.offsetHeight
}
},

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
},

setopacity:function(el, value){
el.style.opacity=value
if (typeof el.style.opacity!="string"){ //if it's not a string (ie: number instead), it means property not supported
el.style.MozOpacity=value
if (el.filters){
el.style.filter="progid:DXImageTransform.Microsoft.alpha(opacity="+ value*100 +")"
}
}
},

showmenu:function(menuid){
var menu=anylinkmenu.menusmap[menuid]
clearTimeout(menu.hidetimer)
this.getoffsetof(menu.anchorobj)
this.getdimensions(menu)
var posx=menu.anchorobj._offsets.left + (menu.orientation=="lr"? this.dimensions.anchorw : 0) //base x pos
var posy=menu.anchorobj._offsets.top+this.dimensions.anchorh - (menu.orientation=="lr"? this.dimensions.anchorh : 0)//base y pos
if (posx+this.dimensions.dropmenuw+this.effects.shadow.depth[0]>this.dimensions.docscrollx+this.dimensions.docwidth){ //drop left instead?
posx=posx-this.dimensions.dropmenuw + (menu.orientation=="lr"? -this.dimensions.anchorw : this.dimensions.anchorw)
}
if (posy+this.dimensions.dropmenuh>this.dimensions.docscrolly+this.dimensions.docheight){ //drop up instead?
posy=Math.max(posy-this.dimensions.dropmenuh - (menu.orientation=="lr"? -this.dimensions.anchorh : this.dimensions.anchorh), this.dimensions.docscrolly) //position above anchor or window's top edge
}
if (this.effects.fade.enabled){
this.setopacity(menu.dropmenu, 0) //set opacity to 0 so menu appears hidden initially
if (this.effects.shadow.enabled)
this.setopacity(menu.shadow, 0) //set opacity to 0 so shadow appears hidden initially
}
menu.dropmenu.setcss({left:posx+'px', top:posy+'px', visibility:'visible'})
if (this.effects.shadow.enabled){
//menu.shadow.setcss({width: menu.dropmenu.offsetWidth+"px", height:menu.dropmenu.offsetHeight+"px"})
menu.shadow.setcss({left:posx+anylinkmenu.effects.shadow.depth[0]+'px', top:posy+anylinkmenu.effects.shadow.depth[1]+'px', visibility:'visible'})
}
if (this.effects.fade.enabled){
clearInterval(menu.animatetimer)
menu.curanimatedegree=0
menu.starttime=new Date().getTime() //get time just before animation is run
menu.animatetimer=setInterval(function(){anylinkmenu.revealmenu(menuid)}, 20)
}
},

revealmenu:function(menuid){
var menu=anylinkmenu.menusmap[menuid]
var elapsed=new Date().getTime()-menu.starttime //get time animation has run
if (elapsed<this.effects.fade.duration){
this.setopacity(menu.dropmenu, menu.curanimatedegree)
if (this.effects.shadow.enabled)
this.setopacity(menu.shadow, menu.curanimatedegree*this.effects.shadow.opacity)
}
else{
clearInterval(menu.animatetimer)
this.setopacity(menu.dropmenu, 1)
menu.dropmenu.style.filter=""
}
menu.curanimatedegree=(1-Math.cos((elapsed/this.effects.fade.duration)*Math.PI)) / 2
},

setcss:function(param){
for (prop in param){
this.style[prop]=param[prop]
}
},

hidemenu:function(menuid){
var menu=anylinkmenu.menusmap[menuid]
clearInterval(menu.animatetimer)
menu.dropmenu.setcss({visibility:'hidden', left:0, top:0})
menu.shadow.setcss({visibility:'hidden', left:0, top:0})
},

getElementsByClass:function(targetclass){
if (document.querySelectorAll)
return document.querySelectorAll("."+targetclass)
else{
var classnameRE=new RegExp("(^|\\s+)"+targetclass+"($|\\s+)", "i") //regular expression to screen for classname
var pieces=[]
var alltags=document.all? document.all : document.getElementsByTagName("*")
for (var i=0; i<alltags.length; i++){
if (typeof alltags[i].className=="string" && alltags[i].className.search(classnameRE)!=-1)
pieces[pieces.length]=alltags[i]
}
return pieces
}
},

addDiv:function(divid, divclass, inlinestyle){
var el=document.createElement("div")
if (divid)
el.id=divid
el.className=divclass
if (inlinestyle!="" && typeof el.style.cssText=="string")
el.style.cssText=inlinestyle
else if (inlinestyle!="")
el.setAttribute('style', inlinestyle)
document.body.appendChild(el)
return el
},

getmenuHTML:function(menuobj){
var menucontent=[]
var frag=""
for (var i=0; i<menuobj.items.length; i++){
frag+='<li><a href="' + menuobj.items[i][1] + '" target="' + menuobj.linktarget + '">' + menuobj.items[i][0] + '</a></li>\n'
if (menuobj.items[i][2]=="efc" || i==menuobj.items.length-1){
menucontent.push(frag)
frag=""
}
}
if (typeof menuobj.cols=="undefined")
return '<ul>\n' + menucontent.join('') + '\n</ul>'
else{
frag=""
for (var i=0; i<menucontent.length; i++){
frag+='<div class="' + menuobj.cols.divclass + '" style="' + menuobj.cols.inlinestyle + '">\n<ul>\n' + menucontent[i] + '</ul>\n</div>\n'
}
return frag
}
},

addEvent:function(targetarr, functionref, tasktype){
if (targetarr.length>0){
var target=targetarr.shift()
if (target.addEventListener)
target.addEventListener(tasktype, functionref, false)
else if (target.attachEvent)
target.attachEvent('on'+tasktype, function(){return functionref.call(target, window.event)})
this.addEvent(targetarr, functionref, tasktype)
}
},

setupmenu:function(targetclass, anchorobj, pos){
this.standardbody=(document.compatMode=="CSS1Compat")? document.documentElement : document.body
var relattr=anchorobj.getAttribute("rel")
dropmenuid=relattr.replace(/\[(\w+)\]/, '')
var dropmenuvar=window[dropmenuid]
var dropmenu=this.addDiv(null, dropmenuvar.divclass, dropmenuvar.inlinestyle) //create and add main sub menu DIV
dropmenu.innerHTML=this.getmenuHTML(dropmenuvar)
var menu=this.menusmap[targetclass+pos]={
id: targetclass+pos,
anchorobj: anchorobj,
dropmenu: dropmenu,
revealtype: (relattr.length!=dropmenuid.length && RegExp.$1=="click")? "click" : "mouseover",
orientation: anchorobj.getAttribute("rev")=="lr"? "lr" : "ud",
shadow: this.addDiv(null, "anylinkshadow", null) //create and add corresponding shadow
}
menu.anchorobj._internalID=targetclass+pos
menu.anchorobj._isanchor=true
menu.dropmenu._internalID=targetclass+pos
menu.shadow._internalID=targetclass+pos
menu.dropmenu.setcss=this.setcss
menu.shadow.setcss=this.setcss
menu.shadow.setcss({width: menu.dropmenu.offsetWidth+"px", height:menu.dropmenu.offsetHeight+"px"})
this.setopacity(menu.shadow, this.effects.shadow.opacity)
this.addEvent([menu.anchorobj, menu.dropmenu, menu.shadow], function(e){ //MOUSEOVER event for anchor, dropmenu, shadow
var menu=anylinkmenu.menusmap[this._internalID]
if (this._isanchor && menu.revealtype=="mouseover" && !anylinkmenu.isContained(this, e)){ //event for anchor
anylinkmenu.showmenu(menu.id)
}
else if (typeof this._isanchor=="undefined"){ //event for drop down menu and shadow
clearTimeout(menu.hidetimer)
}
}, "mouseover")
this.addEvent([menu.anchorobj, menu.dropmenu, menu.shadow], function(e){ //MOUSEOUT event for anchor, dropmenu, shadow
if (!anylinkmenu.isContained(this, e)){
var menu=anylinkmenu.menusmap[this._internalID]
menu.hidetimer=setTimeout(function(){anylinkmenu.hidemenu(menu.id)}, anylinkmenu.effects.delayhide)
}
}, "mouseout")
this.addEvent([menu.anchorobj, menu.dropmenu], function(e){ //CLICK event for anchor, dropmenu
var menu=anylinkmenu.menusmap[this._internalID]
if ( this._isanchor && menu.revealtype=="click"){
if (menu.dropmenu.style.visibility=="visible")
anylinkmenu.hidemenu(menu.id)

bluewalrus
04-05-2009, 06:02 PM
DONT STOP PART 2

else
anylinkmenu.showmenu(menu.id)
if (e.preventDefault)
e.preventDefault()
return false
}
else
menu.hidetimer=setTimeout(function(){anylinkmenu.hidemenu(menu.id)}, anylinkmenu.effects.delayhide)
}, "click")
},
init:function(targetclass){
var anchors=this.getElementsByClass(targetclass)
for (var i=0; i<anchors.length; i++){
this.setupmenu(targetclass, anchors[i], i)
}
}
}
</script>
<style title="DD CSS" type="text/css">
/* ######### Default class for drop down menus ######### */
.anylinkmenu{
position: absolute;
left: 0;
top: 0;
visibility: hidden;
border: 1px solid black;
border-bottom-width: 0;
font: normal 12px Verdana;
line-height: 18px;
z-index: 100; /* zIndex should be greater than that of shadow's below */
background: lightyellow;
width: 200px; /* default width for menu */
}
.anylinkmenu ul{
margin: 0;
padding: 0;
list-style-type: none;
}
.anylinkmenu ul li a{
width: 100%;
display: block;
text-indent: 3px;
border-bottom: 1px solid black;
padding: 2px 0;
text-decoration: none;
font-weight: bold;
text-indent: 5px;
}
.anylinkmenu a:hover{ /*hover background color*/
background: black;
color: white;
}
/* ######### Alternate multi-column class for drop down menus ######### */
.anylinkmenucols{
position: absolute;
width: 350px;
left: 0;
top: 0;
visibility: hidden;
border: 1px solid black;
padding: 10px;
font: normal 12px Verdana;
z-index: 100; /*zIndex should be greater than that of shadow's below*/
background: #E9E9E9;
}
.anylinkmenucols li{
padding-bottom: 3px;
}
.anylinkmenucols .column{
float: left;
padding: 3px 8px;
margin-right: 5px;
background: #E0E0E0;
}
.anylinkmenucols .column ul{
margin: 0;
padding: 0;
list-style-type: none;
}
/* ######### class for shadow DIV ######### */
.anylinkshadow{ /*CSS for shadow. Keep this as is */
position: absolute;
left: 0;
top: 0;
z-index: 99; /*zIndex for shadow*/
background: black;
visibility: hidden;
}
</style>
<script type="text/javascript">
var anylinkmenu1={divclass:'anylinkmenu', inlinestyle:'', linktarget:''} //First menu variable. Make sure "anylinkmenu1" is a unique name!
anylinkmenu1.items=[
["Dynamic Drive", "http://www.dynamicdrive.com/"],
["CSS Drive", "http://www.cssdrive.com/"],
["JavaScript Kit", "http://www.javascriptkit.com/"],
["Coding Forums", "http://www.codingforums.com/"],
["JavaScript Reference", "http://www.javascriptkit.com/jsref/"] //no comma following last entry!
]


var anylinkmenu2={divclass:'anylinkmenu', inlinestyle:'', linktarget:''} //First menu variable. Make sure "anylinkmenu1" is a unique name!
anylinkmenu2.items=[
["Dynamic Drive", "http://www.dynamicdrive.com/"],
["CSS Drive", "http://www.cssdrive.com/"],
["JavaScript Kit", "http://www.javascriptkit.com/"],
["Coding Forums", "http://www.codingforums.com/"],
["JavaScript Reference", "http://www.javascriptkit.com/jsref/"] //no comma following last entry!
]
var anylinkmenu3={divclass:'anylinkmenu', inlinestyle:'', linktarget:''} //First menu variable. Make sure "anylinkmenu1" is a unique name!
anylinkmenu3.items=[
["Dynamic Drive", "http://www.dynamicdrive.com/"],
["CSS Drive", "http://www.cssdrive.com/"],
["JavaScript Kit", "http://www.javascriptkit.com/"],
["Coding Forums", "http://www.codingforums.com/"],
["JavaScript Reference", "http://www.javascriptkit.com/jsref/"] //no comma following last entry!
]
var anylinkmenu4={divclass:'anylinkmenu', inlinestyle:'', linktarget:''} //First menu variable. Make sure "anylinkmenu1" is a unique name!
anylinkmenu4.items=[
["Dynamic Drive", "http://www.dynamicdrive.com/"],
["CSS Drive", "http://www.cssdrive.com/"],
["JavaScript Kit", "http://www.javascriptkit.com/"],
["Coding Forums", "http://www.codingforums.com/"],
["JavaScript Reference", "http://www.javascriptkit.com/jsref/"] //no comma following last entry!
]
</script>
<style type="text/css">
* {
padding:0;
margin:0;
}
#contain {
width:900px;
margin:auto;
}
#banner {
width:900px;
height:172px;
background:url(city/images/cityheader_02.gif);
}
#nav {
height:20px;
margin-left:145px;
}
#nav p { display:inline;
}
#nav p a {
color:#ffffff;
text-decoration:none;
background:url(cell/update/rsliv.png) bottom right no-repeat #0600AD;
background:url(cell/update/lsliv.png) bottom left no-repeat #0600AD;
display:inline-block;
width:70px;
text-align:center;
}
#nav p a#larger {
width:150px;
}
#nav p a#larger2 {
width:100px;
}
#nav p a#larger3 {
width:100px;
}
#nav p a:hover {
background:#6262FF;
}
#content {
margin-top:5px;
border:6px #0000CC solid;
height:633px;
}
#leftside {
float:left;
height:633px;
background:#999999;
width:177px;
}
</style>
</head>

<body>
<div id="contain">
<div id="banner"></div>
<div id="nav">
<p><a href="http://www.dynamicdrive.com" id="larger3" class="menuanchorclass" rel="anylinkmenu1">Goverment</a></p>
<p><a href="http://www.dynamicdrive.com" id ="larger2" class="menuanchorclass" rel="anylinkmenu2">Community</a></p>
<p><a href="http://www.dynamicdrive.com" class="menuanchorclass" rel="anylinkmenu3">History</a></p>
<p><a href="http://www.dynamicdrive.com" class="menuanchorclass" rel="anylinkmenu4">Business</a></p>
<p><a href="http://www.dynamicdrive.com" id="larger" class="menuanchorclass">Emergency&nbsp;Services</a></p>
<p><a href="http://www.dynamicdrive.com" class="menuanchorclass">Weather</a></p>
<p><a href="http://www.dynamicdrive.com" class="menuanchorclass">Links</a></p>
<p><a href="http://www.dynamicdrive.com" class="menuanchorclass">Home</a></p>
<div class="anylinkmenu1" style="left: 0pt; top: 0pt; visibility: hidden;">
<ul>
<li>
<a target="" href="http://www.dynamicdrive.com/">Dynamic Drive</a>
</li>
<li>
<a target="" href="http://www.cssdrive.com/">CSS Drive</a>
</li>
<li>
<a target="" href="http://www.javascriptkit.com/">JavaScript Kit</a>
</li>
<li>
<a target="" href="http://www.codingforums.com/">Coding Forums</a>
</li>
<li>
</li>
</ul>
</div>
</div>
<div id="content">
<div id="leftside">
</div>
</div>
</div>

<script type="text/javascript">

//anylinkmenu.init("menu_anchors_class") //call this function at the very *end* of the document!
anylinkmenu.init("menuanchorclass")
</script>
</body>
</html>

cbridges
04-06-2009, 12:49 AM
Thank you - I will look through the code...more questions to follow I'm sure

cbridges
04-06-2009, 01:25 AM
Thank you - It is starting to come together better.

Two quick questions - using the following code how would I add child links to these submenus. If for example I would want to add child links when you hover over "Dynamic Drive"? I think I will have 3 levels total in any one of the navigation links
---code---
var anylinkmenu1={divclass:'anylinkmenu', inlinestyle:'', linktarget:''} //First menu variable. Make sure "anylinkmenu1" is a unique name!
anylinkmenu1.items=[
["Dynamic Drive", "http://www.dynamicdrive.com/"],
["CSS Drive", "http://www.cssdrive.com/"],
["JavaScript Kit", "http://www.javascriptkit.com/"],
["Coding Forums", "http://www.codingforums.com/"],
["JavaScript Reference", "http://www.javascriptkit.com/jsref/"] //no comma following last entry!
]
---------
Second, I want to replace the parent link with the images that I have created for navigation instead of using the boxes (only the parent will have the images I created - the child links will be as they are now). I have each image created for the normal state and hover (the image for each link is slightly different if that matters)?

Thanks again

bluewalrus
04-06-2009, 01:34 AM
Give each link an id like i did for the "larger" then us background:url(image.jpg) no-repeat; width:size needed; height:20px; You'll need the images to be 20px high or adjust the code accordingly. This will not be search engine friendly though nor screen reader accessible.


for links change


["Dynamic Drive", "http://www.dynamicdrive.com/"],
["CSS Drive", "http://www.cssdrive.com/"],
["JavaScript Kit", "http://www.javascriptkit.com/"],
["Coding Forums", "http://www.codingforums.com/"],
["JavaScript Reference", "http://www.javascriptkit.com/jsref/"] //no comma following last entry!


to


["DISPLAY NAME HERE", "LOCATION OF PAGE HERE"],
["DISPLAY NAME HERE", "LOCATION OF PAGE HERE"],
["DISPLAY NAME HERE", "LOCATION OF PAGE HERE"] //no comma following last entry!


That answer all your questions there?


EDIT

to be more clear on css
Regular Image code

#nav p a#larger {
background:url(image.jpg) no-repeat;
width:70px;
height:20px;
}
On Mouseover image code

#nav p a:hover#larger {
background:url(imageonmouseover.jpg) no-repeat;
width:70px;
height:20px;
}

cbridges
04-06-2009, 01:50 AM
The only question I still have is the sublinks...for example when I hover over "Government" - my list of links drops down ("city hall", "public works", "city council", etc..)..If I were to go down to "city hall" I would like another drop down to come out for items under "city hall"
e.g Government
-> "City Hall" -->Permits (this would drop down out of the "city Hall"submenu
-> "Public Works
-> "City Council

Hopefully this makes sense. Thanks for your patience:)

bluewalrus
04-06-2009, 02:06 AM
umm I'm not sure but I'd think you could in the li use the same code from the original rename the id make a new section as well.


in here


<li>
<a target="" href="http://www.dynamicdrive.com/">Dynamic Drive</a>
</li>


try this


<p><a href="http://www.dynamicdrive.com" id="larger3" class="menuanchorclass" rel="anylinkmenu8">Goverment</a></p>
<p><a href="http://www.dynamicdrive.com" id ="larger2" class="menuanchorclass" rel="anylinkmenu9">Community</a></p>
<p><a href="http://www.dynamicdrive.com" class="menuanchorclass" rel="anylinkmenu10">History</a></p>
<p><a href="http://www.dynamicdrive.com" class="menuanchorclass" rel="anylinkmenu11">Business</a></p>
<p><a href="http://www.dynamicdrive.com" id="larger" class="menuanchorclass">Emergency&nbsp;Services</a></p>


with this


var anylinkmenu8={divclass:'anylinkmenu', inlinestyle:'', linktarget:''} //First menu variable. Make sure "anylinkmenu1" is a unique name!
anylinkmenu8.items=[
["Dynamic Drive", "http://www.dynamicdrive.com/"],
["CSS Drive", "http://www.cssdrive.com/"],
["JavaScript Kit", "http://www.javascriptkit.com/"],
["Coding Forums", "http://www.codingforums.com/"],
["JavaScript Reference", "http://www.javascriptkit.com/jsref/"] //no comma following last entry!
]

cbridges
04-06-2009, 02:12 AM
Will try this tomorrow and see what happens - Thanks