Avatar billede tjensen Nybegynder
03. juni 2005 - 18:02 Der er 3 kommentarer og
1 løsning

placering af javascript menu

Hey!

Jeg har fået fat i en fancy javascript menu. Den laver åbenbart sig selv i JS og smider det ind på siden. Jeg ville så mega gerne kunne styre dens placering evt vha et <div>.

Man kan i forvejen i Js'et styre den, men det er kun absolute placeringer, så fungere ikke skide godt sammen med min midtercentret side.

Hvis det kræver stort indgreb ligger jeg gerne maks points.

Til se/download ligger det her: www.inkarneret.dk/exp/js-menu.htm

Til dem der kan overskue det her:
<html>
<head>
<SCRIPT LANGUAGE="JavaScript">
<!-- <!-- Begin
var isDOM = (document.getElementById ? true : false);
var isIE4 = ((document.all && !isDOM) ? true : false);
var isNS4 = (document.layers ? true : false);

function getRef(id) {
    if (isDOM) return document.getElementById(id);
    if (isIE4) return document.all[id];
    if (isNS4) return document.layers[id];
}

function getSty(id) {
    return (isNS4 ? getRef(id) : getRef(id).style);
}

var popTimer = 0;
var litNow = new Array();

function popOver(menuNum, itemNum) {
    clearTimeout(popTimer);
    hideAllBut(menuNum);
    litNow = getTree(menuNum, itemNum);
    changeCol(litNow, true);
    targetNum = menu[menuNum][itemNum].target;
    if (targetNum > 0) {
        thisX = parseInt(menu[menuNum][0].ref.left) + parseInt(menu[menuNum][itemNum].ref.left);
        thisY = parseInt(menu[menuNum][0].ref.top) + parseInt(menu[menuNum][itemNum].ref.top);
        with (menu[targetNum][0].ref) {
            left = parseInt(thisX + menu[targetNum][0].x);
            top = parseInt(thisY + menu[targetNum][0].y);
            visibility = 'visible';
        }
    }
}

function popOut(menuNum, itemNum) {
    if ((menuNum == 0) && !menu[menuNum][itemNum].target)
        hideAllBut(0)
    else
        popTimer = setTimeout('hideAllBut(0)', 500);
}

function getTree(menuNum, itemNum) {
    itemArray = new Array(menu.length);

    while(1) {
        itemArray[menuNum] = itemNum;
        if (menuNum == 0) return itemArray;
        itemNum = menu[menuNum][0].parentItem;
        menuNum = menu[menuNum][0].parentMenu;
    }
}

function changeCol(changeArray, isOver) {
    for (menuCount = 0; menuCount < changeArray.length; menuCount++) {
        if (changeArray[menuCount]) {
            newCol = isOver ? menu[menuCount][0].overCol : menu[menuCount][0].backCol;
            with (menu[menuCount][changeArray[menuCount]].ref) {
                if (isNS4) bgColor = newCol;
                else backgroundColor = newCol;
            }
        }
    }
}

function hideAllBut(menuNum) {
    var keepMenus = getTree(menuNum, 1);
    for (count = 0; count < menu.length; count++)
    if (!keepMenus[count])
    menu[count][0].ref.visibility = 'hidden';
    changeCol(litNow, false);
}

// *** MENU CONSTRUCTION FUNCTIONS ***

function Menu(isVert, popInd, x, y, width, overCol, backCol, borderClass, textClass) {
    // True or false - a vertical menu?
    this.isVert = isVert;
    // The popout indicator used (if any) for this menu.
    this.popInd = popInd
    // Position and size settings.
    this.x = x;
    this.y = y;
    this.width = width;
    // Colours of menu and items.
    this.overCol = overCol;
    this.backCol = backCol;
    // The stylesheet class used for item borders and the text within items.
    this.borderClass = borderClass;
    this.textClass = textClass;
    // Parent menu and item numbers, indexed later.
    this.parentMenu = null;
    this.parentItem = null;
    // Reference to the object's style properties (set later).
    this.ref = null;
}

function Item(text, href, frame, length, spacing, target) {
    this.text = text;
    this.href = href;
    this.frame = frame;
    this.length = length;
    this.spacing = spacing;
    this.target = target;
    // Reference to the object's style properties (set later).
    this.ref = null;
}

function writeMenus() {
    if (!isDOM && !isIE4 && !isNS4) return;
    for (currMenu = 0; currMenu < menu.length; currMenu++) with (menu[currMenu][0]) {
        // Variable for holding HTML for items and positions of next item.
        var str = '', itemX = 0, itemY = 0;

        // Remember, items start from 1 in the array (0 is menu object itself, above).
        // Also use properties of each item nested in the other with() for construction.
        for (currItem = 1; currItem < menu[currMenu].length; currItem++) with (menu[currMenu][currItem]) {
            var itemID = 'menu' + currMenu + 'item' + currItem;

            // The width and height of the menu item - dependent on orientation!
            var w = (isVert ? width : length);
            var h = (isVert ? length : width);

            // Create a div or layer text string with appropriate styles/properties.
            // Thanks to Paul Maden (www.paulmaden.com) for helping debug this in IE4, apparently
            // the width must be a miniumum of 3 for it to work in that browser.
            if (isDOM || isIE4) {
                str += '<div id="' + itemID + '" style="position: absolute; left: ' + itemX + '; top: ' + itemY + '; width: ' + w + '; height: ' + h + '; visibility: inherit; ';
                if (backCol) str += 'background: ' + backCol + '; ';
                str += '" ';
            }
            if (isNS4) {
                str += '<layer id="' + itemID + '" left="' + itemX + '" top="' + itemY + '" width="' + w + '" height="' + h + '" visibility="inherit" ';
                if (backCol) str += 'bgcolor="' + backCol + '" ';
            }
            if (borderClass) str += 'class="' + borderClass + '" ';

            // Add mouseover handlers and finish div/layer.
            str += 'onMouseOver="popOver(' + currMenu + ',' + currItem + ')" onMouseOut="popOut(' + currMenu + ',' + currItem + ')">';
            // Add contents of item (default: table with link inside).
            // In IE/NS6+, add padding if there's a border to emulate NS4's layer padding.
            // If a target frame is specified, also add that to the <a> tag.

            str += '<table width="' + (w - 8) + '" border="0" cellspacing="0" cellpadding="' + (!isNS4 && borderClass ? 3 : 0) + '"><tr><td align="left" height="' + (h - 7) + '">' + '<a class="' + textClass + '" href="' + href + '"' + (frame ? ' target="' + frame + '">' : '>') + text + '</a></td>';
            if (target > 0) {
                // Set target's parents to this menu item.
                menu[target][0].parentMenu = currMenu;
                menu[target][0].parentItem = currItem;
                // Add a popout indicator.
                if (popInd) str += '<td class="' + textClass + '" align="right">' + popInd + '</td>';
            }
            str += '</tr></table>' + (isNS4 ? '</layer>' : '</div>');
            if (isVert) itemY += length + spacing;
            else itemX += length + spacing;
        }

        if (isDOM) {
            var newDiv = document.createElement('div');
            document.getElementsByTagName('body').item(0).appendChild(newDiv);
            newDiv.innerHTML = str;
            ref = newDiv.style;
            ref.position = 'absolute';
            ref.visibility = 'hidden';
        }

        // Insert a div tag to the end of the BODY with menu HTML in place for IE4.
        if (isIE4) {
            document.body.insertAdjacentHTML('beforeEnd', '<div id="menu' + currMenu + 'div" ' + 'style="position: absolute; visibility: hidden">' + str + '</div>');
            ref = getSty('menu' + currMenu + 'div');
        }

        // In NS4, create a reference to a new layer and write the items to it.
        if (isNS4) {
            ref = new Layer(0);
            ref.document.write(str);
            ref.document.close();
        }

        for (currItem = 1; currItem < menu[currMenu].length; currItem++) {
            itemName = 'menu' + currMenu + 'item' + currItem;
            if (isDOM || isIE4) menu[currMenu][currItem].ref = getSty(itemName);
            if (isNS4) menu[currMenu][currItem].ref = ref.document[itemName];
        }
    }
    with(menu[0][0]) {
        ref.left = x;
        ref.top = y;
        ref.visibility = 'visible';
    }
}


var popOldWidth = window.innerWidth;
nsResizeHandler = new Function('if (popOldWidth != window.innerWidth) location.reload()');

if (isNS4) document.captureEvents(Event.CLICK);
    document.onclick = clickHandle;

function clickHandle(evt) {
    if (isNS4) document.routeEvent(evt);
    hideAllBut(0);
}

function moveRoot() {
    with(menu[0][0].ref) left = ((parseInt(left) < 100) ? 100 : 5);
}


//    new Menu
//    menu[menuNumber][0] = new Menu(Vertical menu? (true/false), 'popout indicator', left, top, height,
//    'mouseover colour', 'background colour', 'border stylesheet', 'text stylesheet');

//    new Item
//    menu[menuNumber][itemNumber] = new Item('Text', 'URL', 'target frame', length of menu item,
//    additional spacing to next menu item, number of target menu to popout);

menu = new Array();
menu[0] = new Array();
menu[0][0] = new Menu(false, '¥', 0, 0, 17, '#6699FF', '#6600FF', '', 'itemText');
menu[0][1] = new Item('Login', '?vis=login', '', 90, 0, 0);
menu[0][2] = new Item('Adresseliste', '?vis=adr', '', 90, 0, 0);
menu[0][3] = new Item('Forum', '?vis=forum', '', 90, 0, 0);
menu[0][4] = new Item('Galleri', '?vis=gal', '', 90, 0, 0);
menu[0][5] = new Item('Profiler', '?vis=pro', '', 90, 0, 0);
-->
</script>

<style>
<!--

.itemBorder { border: 1px solid black }
.itemText { text-decoration: none; color:#FFFFFF; font: 12px Arial, Helvetica; margin-left: 10px;}

-->
</style>
</head>
<body onLoad='writeMenus()' onResize='if (isNS4) nsResizeHandler()'>
</body>
</html>
Avatar billede tjensen Nybegynder
03. juni 2005 - 18:04 #1
Ups, jeg mangler at sige den måde jeg henter det ind nu, er et php include.
Min tanke var lidt at include det i et div, og så jeg kunne flytte rundt med det div.
Avatar billede olebole Juniormester
03. juni 2005 - 18:59 #2
<ole>

Et absolut positioneret element skal placere sig i forhold til det først, omkransende element, der er positioneret ... om det så er positioneret absolut eller relativt, er ligegyldigt. Findes et sådan ikke, skal det placere sig i forhold til body-elementet. Mange kender kun til den sidste regel  ;o)
Eksempel:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>TITLE</title>
<style type="text/css">
body, html {
    height: 100%;
    margin: 0px;
    padding: 0px;
}
</style>
</head>
<body>

<div style="margin:250px;width:500px;height:400px;border:1px solid blue">
    <div style="position:absolute;left:15px;top:75px">innerdiv 1</div>
</div>

<div style="position:relative;margin:250px;width:500px;height:400px;border:1px solid red">
    <div style="position:absolute;left:15px;top:75px">Innerdiv 2</div>
</div>

</body>
</html>

Du kan altså formodentlig blot positionere det div, menuen bliver lagt i, relativt  ;o)

/mvh
</bole>
Avatar billede roenving Novice
28. juli 2005 - 19:23 #3
... måske lige en reminder til dette, som stammer fra den mail-løse periode !-)
Avatar billede tjensen Nybegynder
27. november 2007 - 15:16 #4
lukker
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