dhtmlcentral Coolmenu - berening af menupunkters placering virker
Min kæreste er blevet webmaster for en hjemmeside (lavet i Frontpage ;-( ), som hun ikke har været med til at designe fra starten. Dermed siger jeg at den IKKE kan genopbygges fra starten – arbejdet vil være alt for stort i forhold til resultatet. Vi må altså prøve at få det bedste ud af det der allerede eksisterer. Hjemmesiden er designet til at skulle kunne køre på en 800x600 skærmopløsning, idet der ligger en centreret tabel med fast bredde (800px) indholdende al information.Menuen er opbygget vha. Coolmenus, som sådan set virker udmærket i IE fullscreen (altså fuld bredde) i 1024x768 og 1280x1024 skærmopløsning. Men i et vindue der ikke er fuld bredde, beregnes placeringen af menupunkterne ikke korrekt. I den javakode der ligger bag hjemmesiden, er der endda ikke andre højere opløsninger implementeret (dvs. 1360, 1440, 1600 eller 1920 bredde). Og det var denne begrænsning, der har ført mig til at stille dette spørgsmål.
I min analyse af, hvad der skal til for at beregne placeringen ved enhver skærmopløsning, er jeg kommet frem til følgende konklusioner vedr. den opsætning vi har:
1. placeringen er absolut, dvs. øverste venstre hjørne er ækvivalent med browservinduets.
2. den dynamiske beregning af placeringen ved ændring af browservinduets størrelse er indlejret i initialiseringen af menukoden (se nedenfor).
Den oprindelige kode til opsætningen er vist herunder:
case 1024:
//Skærm Opløsning 1024
oM=new makeCM("oM"); oM.resizeCheck=1; oM.rows=1; oM.onlineRoot="/"; //oM.offlineRoot="file:///D|/data/web/dsah/";
oM.offlineRoot="file:///C|/Documents and Settings/Administrator/Dokumenter/Mine websteder/www/";
oM.pxBetween =0; oM.fillImg="cm_fill.gif"; oM.fromTop=139; oM.fromLeft=155; oM.wait=300; oM.zIndex=400;
oM.useBar=1; oM.barWidth="75%"; oM.barHeight="menu"; oM.barX=104;oM.barY="menu"; oM.barClass="clBar";
oM.barBorderX=0; oM.barBorderY=0;
oM.level[0]=new cm_makeLevel(90,21,"clT","clTover",1,1,"clB",0,"bottom",0,0,0,0,0);
oM.level[1]=new cm_makeLevel(102,22,"clS","clSover",1,1,"clB",0,"right",0,0,"script/menu_arrow.gif",10,10);
oM.level[2]=new cm_makeLevel(110,22,"clS2","clS2over");
oM.level[3]=new cm_makeLevel(140,22);
var avail="141+((cmpage.x2-235)/7)";
oM.menuPlacement=new Array(152,avail+"-1",avail+"*2-15",avail+"*3-12",avail+"*4-7",avail+"*5-9",avail+"*6+5")
break
Jeg har kunnet konstatere, at de tre væsentlige kodelinier er (bemærk: syv menupunkter vandret!!!):
- oM.barX=500;
- var avail="141+((cmpage.x2-235)/7)";
- oM.menuPlacement=new Array(152,avail+"-1",avail+"*2-15",avail+"*3-12",avail+"*4-7",avail+"*5-9",avail+"*6+5");
Indlejringen af den dynamiske beregning af placeringen (i oM.menuPlacement) ligger i, at x-koordinaten for de sidste seks menupunkter er angivet som strenge indeholdende formlerne, f.eks. ”141+((cmpage.x2-235)/7)*2+15". Ved andre bredder end fullscreen virker beregningen bare ikke.
Mit eget forslag ser således ud:
var q;
if (cmpage.x2<800)
{
q="25";
}
else
{
q="(cmpage.x2-800)/2+15";
}
var r="114";
oM.menuPlacement=new Array(q,q+"+"+r,q+"+2*"+r,q+"+3*"+r,q+"+4*"+r,q+"+5*"+r,q+"+6*"+r,q+"+7*"+r)
Dette virker også, så længe browservinduet er større end tabelbredden (800). Det virker sådan set også ved vinduesbredder mindre end 800, men i skiftet hen over grænsen skal jeg opdatere siden manuelt. Dette skyldes indlejringen, da if sætningen kun eksekveres når menuen loades. Hvis det problem skal løses, skal if sætningen også indlejres.
Og det er – efter en lang smøre – mit spørgsmål. Er der nogen der har et forslag til, hvordan dette skift (altså if sætningen) kan implementeres, eller ved om det er muligt at ændre opsætningen så coolmenus kan køre relativt i forhold til tabellen.
Uheldigvis er Thomas Brattli’s hjemmeside jo nede, så det er ikke muligt at finde hjælp den vej fra.
Mvh. og på forhånd tak.
Jens
PS. Jeg giver 200 point til et konstruktivt svar, der IKKE indebærer at vi skal skrotte det hele og starte forfra.