Avatar billede webcreator Nybegynder
30. september 2003 - 21:12 Der er 40 kommentarer og
1 løsning

Layer-Menu - Laves om fra onclick til mouseover/out

Hej.

Jeg har en dropdown-menu (baseret på javascript og CSS), som dukker frem når jeg klikker på den. Men den skal komme frem ved mouseover, og gå væk ved mouseout. Jeg har næsten fået det til at virke. Desværre forsvinder selve menuen, når jeg fjerner musen fra linket, og bevæger den ned i den nykomne menu. Kan dette løses ?

Min kode - først et javascript der styre menuen :

<script type="text/javascript">
function visSkjulDiv(d){
st = document.getElementById(d).style;
if(st.display=='block')st.display='none'
else st.display='block';
}

function posDiv(){
  elm = document.getElementById('refElement');
  for(var zx=zy=0;elm!=null;zx+=elm.offsetLeft,zy+=elm.offsetTop,elm=elm.offsetParent);
  divStyle = document.getElementById('lokalDiv').style
  divStyle.top = zy + 21 + 'px';//du kan så lægge lidt til eller trække fra til den præcise position
  divStyle.left = zx + 'px';

  elm = document.getElementById('underLink1');
  for(var zx=zy=0;elm!=null;zx+=elm.offsetLeft,zy+=elm.offsetTop,elm=elm.offsetParent);
  divStyle = document.getElementById('underMenu1').style
  divStyle.top = zy + 21 + 'px';//du kan så lægge lidt til eller trække fra til den præcise position
  divStyle.left = zx + 'px';

  elm = document.getElementById('underLink2');
  for(var zx=zy=0;elm!=null;zx+=elm.offsetLeft,zy+=elm.offsetTop,elm=elm.offsetParent);
  divStyle = document.getElementById('underMenu2').style
  divStyle.top = zy + 21 + 'px';//du kan så lægge lidt til eller trække fra til den præcise position
  divStyle.left = zx + 'px';

}
</script>


Så lidt html, der udskriver menuen :

<a href="http://www.jubii.dk" onmouseover="visSkjulDiv('lokalDiv')" id="refElement">Lokalt</a>
 
  <div id="lokalDiv" class="lokalt" style="display:none"> MENU<br>
  <a href="#" onclick="visSkjulDiv('underMenu1')" id="underLink1"> Lokalt</a><br>
  <a href="#" onclick="visSkjulDiv('underMenu2')" id="underLink2"> Lokalt</a><br>
  </div>
 
  <div id="underMenu1" style="display:none;">
  <a href="http://hans-side.html">Besøg Hans</a>
  <a href="http://grete-side.html">Besøg Grete</a>
  </div>

  <div id="underMenu2" style="display:none;">
  <a href="http://soeren-side.html">Besøg S&oslash;ren</a>
  <a href="http://merete-side.html">Besøg Merete</a>
  </div>

Endelig CSS'et, der bestemmer form og farve (mangler class til underpunkterne..)

.lokalt {
position:absolute;
z-index:1;
width: 100px;
height: 100px;
border: 1px #000000 solid;
background-color: #8080FF;
font-family: Verdana, Arial, sans-serif;
font-size: 12px;
text-align: left;
}

Jeg håber i gider/kan hjælpe :)
Avatar billede bearhugx Nybegynder
30. september 2003 - 21:14 #1
du kan gøre det ved at sætte en timeout på menuens forsvinden, således at den først forsvinder efter f.eks. 20 millisekunder ... Derudover så laver du det således at sålænge der er "mouseover" på den menu, du har fået frem, så skal menuen forblive åben...
Avatar billede bearhugx Nybegynder
30. september 2003 - 21:17 #2
på min egen menu er der endda helt op til 450 ms latens periode...
Avatar billede webcreator Nybegynder
30. september 2003 - 21:18 #3
Det var faktisk også den løsning jeg selv havde tænkt mig. Men jeg kan ikke umiddelbart kode det i JS. Har kun beskæftiget mig lidt med den slags.
Avatar billede webcreator Nybegynder
30. september 2003 - 21:19 #4
Og i virkeligheden er en timeout ikke noget problem, da en mouseout således både kan placeres på layeret og selve linket.
Avatar billede webcreator Nybegynder
30. september 2003 - 21:49 #5
Nogen der kan lave en sådan ? :-)
Avatar billede webcreator Nybegynder
30. september 2003 - 21:50 #6
Har lige afsat flere points ..
Avatar billede bearhugx Nybegynder
30. september 2003 - 22:58 #7
Kigger lige på det senere... :-)
Avatar billede roenving Novice
01. oktober 2003 - 07:00 #8
f.eks.
<script type="text/javascript">
var tempD = null;
var timer = new Array();
function visSkjulDiv(d){
if(visSkjulDiv.arguments.length==0)d=tempD;
st = document.getElementById(d).style;
if(st.display=='block')st.display='none'
else{
st.display='block';
timer[d] = setTimeout('visSkjulDiv()',100);
tempD = d;
}
}
Avatar billede webcreator Nybegynder
01. oktober 2003 - 20:10 #9
Skal det ikke bare indsættes efter :

function visSkjulDiv(d){
st = document.getElementById(d).style;
if(st.display=='block')st.display='none'
else st.display='block';
}


Det har jeg prøvet. Men så kommer menuen kun frem i et halvt sekund.
Avatar billede roenving Novice
01. oktober 2003 - 20:15 #10
-- nej ...

I stedet for !-)
Avatar billede webcreator Nybegynder
01. oktober 2003 - 20:18 #11
Har jeg også prøvet. Menuen blinker blot. Min source kan ses her :
www.powerzone.dk/sr.txt
Avatar billede webcreator Nybegynder
01. oktober 2003 - 20:28 #12
Oohhh. Jeg skal self. lave mit layer "onmouseover", så det også fortsætter med at være synlig, når musen kommer ned på laget :)
Avatar billede webcreator Nybegynder
01. oktober 2003 - 20:30 #13
Skal der så ikke laves et lille javascript til selve layeret ? et som ikke timer out, når husen er ovre det, og som lukker layeret, når musen fjernes.
Avatar billede webcreator Nybegynder
01. oktober 2003 - 20:43 #14
Jeg har brug for lidt hjælp med at få layeret til at blive der, når musen er over det, og forsvinde når musen fjernes.
Avatar billede webcreator Nybegynder
02. oktober 2003 - 17:27 #15
Håber der kommer lidt feedback i dag *hint* :)
Avatar billede roenving Novice
04. oktober 2003 - 13:39 #16
onmouseover="clearTimeout(timer[this.id])" onmouseout="this.style.display='none'"
Avatar billede webcreator Nybegynder
04. oktober 2003 - 13:41 #17
Oh, prøver jeg lige :-)
Avatar billede webcreator Nybegynder
04. oktober 2003 - 13:42 #18
Layeret forsvinder, når jeg holder musen hen over et link, som befinder sig i layeret. Er det virkelig nødvendigt at indsætte en mouseover på linket også ??
Avatar billede webcreator Nybegynder
04. oktober 2003 - 13:49 #19
Og lige en ting mere. Nu virker det jo perfekt med, at menuen lukker når man fjerner musen fra layeret. Kan man så ikke lave det således, at layeret forbliver synligt konstant, og kun forsvinder, når man fjerner musen fra layeret. Dvs. at timeout-funktionen i realiteten ikke burde være nødvendig. Altså skal der kun ske det, at menuen åbner ved mouse over. Intet andet.
Avatar billede roenving Novice
04. oktober 2003 - 13:54 #20
-- der var zq li'e en ting, jeg ikke havde tænkt på !-)

Prøv med:

onmouseout="timer[this.id]=setTimeout('visSkjulDiv()',100);tempD=this.id"
Avatar billede webcreator Nybegynder
04. oktober 2003 - 13:58 #21
Hm, jamen kan den timeout-funktion ikke bare fjernes nu ? I starten lavede du jo systemet således, at den kun åbnede layeret. Da var det slet ikke muligt at fjerne det igen via linket. Det er sådan jeg vil have det igen. Dog skal det stadig forsvinde ved mouseout på layeret.
Avatar billede webcreator Nybegynder
04. oktober 2003 - 14:01 #22
Jeg tror også jeg er i tvivl om, hvor du ville have onmouseout'en hen ?!
Avatar billede webcreator Nybegynder
04. oktober 2003 - 14:06 #23
Nåå - den skulle erstatte den nuværende mouseout i layeret. Fint nok. Men stadig - er timeoutfunktionen osv. nødvendig ? Vil stadig gerne af med timeout funktionen osv - hvis det er muligt.
Avatar billede roenving Novice
04. oktober 2003 - 14:06 #24
Det var på div'en, så folk kunne nå at trykke på linket, før div'en forsvinder ...

For de links ligger 'ovenpå' div'en, så der er mouseout på den -- derfor timeouten !-)

-- jeg kan ik' li'e gennemskue om du har ret i din betragtning om timeouten generelt, men har det liggende som en erfaring, at den er nødvendig

-- og du vil opleve at de allerfleste 'simple' layer-menuer bruger den teknik for at undgå, at en enkelt pixel mellem link og layer skal betyde at den falder væk !o]
Avatar billede bearhugx Nybegynder
04. oktober 2003 - 14:08 #25
Jeg tror ikke at du slipper af med en timeout-funktion... Og hvorfor skulle man egenligt også det...
Avatar billede webcreator Nybegynder
04. oktober 2003 - 14:09 #26
Ok. Det er jer der er de kloge :)
Mente bare det var overkill med en timeout, når den i realiteten var unødvendig.
Avatar billede webcreator Nybegynder
04. oktober 2003 - 14:10 #27
Men pga. den nye funktion Roenving lavede, forsvinder og dukker menuen op ved onmouseover. Så man kan sige, at der også ligger en skjult "onmouseout" i denne funktion. Hvordan slipper jeg af med denne ?
Avatar billede bearhugx Nybegynder
04. oktober 2003 - 14:13 #28
Jeg kan ikke lige gemmenskue din kode - har kun fulgt med med et halvt øre... men hvis onmouseout er der, og den gør et eller andet, så har den vel en funktion...

Du virker meget opsat på at "slippe af" med så meget kode som overhovedet muligt... Hvorfor?
Avatar billede roenving Novice
04. oktober 2003 - 14:14 #29
sæt delay lidt højere end de 100 millisekunder, som bare er fundet i luften !-)
Avatar billede bearhugx Nybegynder
04. oktober 2003 - 14:15 #30
bemærk at 450 er lidt under et ½ sekund! :-)
Avatar billede bearhugx Nybegynder
04. oktober 2003 - 14:16 #31
(hold da helt kæft - havde ikke troet, at jeg skulle slå phoenixV i nogen kategori! :-)
Avatar billede webcreator Nybegynder
04. oktober 2003 - 14:17 #32
Bearhugx > Jeg vil naturligvis gerne have en optimeret kode. Derfor :-)

Roenving : Dvs. at de 100 i mouseout'en er under et halvt sekund ?? Jamen så er der en fejl. For der sker først en timeout ved mouseover på linket, som har samme værdi som angivet i javascriptet. (her har jeg sat timeout til 10000)
Avatar billede webcreator Nybegynder
04. oktober 2003 - 14:27 #33
- Er der en fejl så ?
- Og kan jeg få linket lavet om til, _kun_ at vise layeret ved mouseover -
  ikke at fjerne det igen.
Avatar billede roenving Novice
04. oktober 2003 - 14:28 #34
Et halvt sekund er 500, for tider angives i millisekunder, de hundrede er 1/10-del ...
Avatar billede webcreator Nybegynder
04. oktober 2003 - 14:31 #35
Pyt med sekunderne. Det kan jeg altid regne mig frem til :)
Avatar billede webcreator Nybegynder
04. oktober 2003 - 14:56 #36
Er mere interesseret i mine andre 2 spm :)
Avatar billede webcreator Nybegynder
04. oktober 2003 - 15:20 #37
Hm, vil I ikke nok være flinke at svare lidt hurtigere. Jeg ved jeg er "krævende", men jeg kommer ikke ret langt, hvis jeg kun får et par svar om dagen, heh :)
Avatar billede webcreator Nybegynder
04. oktober 2003 - 15:21 #38
Nu har jeg sat yderligere points på spil. Kom så i gang :-D
Avatar billede webcreator Nybegynder
04. oktober 2003 - 16:05 #39
en anden ting er, at under-menuerne ikke har et ref-punkt at gå ud fra. Så mit nye layer ender igen i øverste, venstre hjørne ..
Avatar billede webcreator Nybegynder
04. oktober 2003 - 23:21 #40
Jeg fik en anden til at hjælpe mig.
Avatar billede webcreator Nybegynder
04. oktober 2003 - 23:21 #41
.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester