Avatar billede superflydk Nybegynder
18. februar 2007 - 11:06 Der er 3 kommentarer og
1 løsning

Popup-menu som den på Amazon.com?

Hej alle,

Jeg har i et par dage ledt efter et javascript der laver den tooltip lignende popup-menu som bruges på Amazon.com, når man holder musen over "See all 50 bla bla bla" i toppen.

Jeg har fundet et par tutorials der guider mig igennem, men dem har jeg ikke det store held med. Ligeledes har jeg fundet nogle færdiglavede, men de er bare langt fra tæt nok på det jeg skal bruge.

Er det ikke muligt at lave noget, hvor man har en Mouseover på et link eller billede, hvor der så popper en flydende tabel op i en given størrelse - og hvor jeg selv har mulighed for at bestemme præcist hvad der skal være i den tabel/popup?

Det er muligt at det kan laves i CSS eller andet - alle forslag er velkomne!
Avatar billede crazysnap Seniormester
18. februar 2007 - 16:55 #1
Hej superflydk,


Jeg har lavet et lille eksempel til dig som burde udføre den handling du ønsker. Jeg her overordnet lavet to metoder, en til at vise en "flydende tabel" (som du kalder det) og en til at gemme den igen. Man kan som argument til den første metode specificere hvor den "flydende tabel" skal vises: over, under, til højre eller til venstre for den tag som kalder metoden.

Håber det var noget lignende det du søger, ellers må du jo lige uddybe yderligere også skal jeg se hvad jeg kan gøre! :)


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>popup demo</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
        <script type="text/JavaScript">
       
        var margin = 2;
       
        function Show(elm, divId, position)
        {
            var popup = document.getElementById(divId);
           
            var elmPos = findPos(elm);
           
            //Get element dimensions
            var elmPosX = elmPos[0];
            var elmPosY = elmPos[1];
            var elmWidth = elm.offsetWidth;
            var elmHeight = elm.offsetHeight;
           
            //Get div dimensions
            var popupWidth = popup.offsetWidth;
            var popupHeight = popup.offsetHeight;
           
            var posX = 0;
            var posY = 0;
           
            switch(position)
            {
                case 'top':
                    posX = (elmPosX + elmWidth/2) - (popupWidth/2);
                    posY = elmPosY - popupHeight - margin;
                    break;
                case 'bottom':
                    posX = (elmPosX + elmWidth/2) - (popupWidth/2);
                    posY = elmPosY + elmHeight + margin;
                    break;
                case 'left':
                    posX = elmPosX - popupWidth - margin*2;
                    posY = (elmPosY + elmHeight/2) - (popupHeight/2);
                    break;                   
                default: // 'right'
                    posX = elmPosX + elmWidth + margin*2;
                    posY = (elmPosY + elmHeight/2) - (popupHeight/2);
                    break;
            }
           
            posX = Math.max(posX, 0);
            posY = Math.max(posY, 0);
           
            popup.style.left = posX + "px";
            popup.style.top = posY + "px";
            popup.style.visibility = 'visible';         
        }
       
        //Hides div-tag
        function Hide(divId)
        {
            var popup = document.getElementById(divId);
            popup.style.visibility = 'hidden'; 
        }
       
        //Returns the position of an object
        function findPos(obj)
        {
            var curleft = curtop = 0;
            if (obj.offsetParent)
            {
                curleft = obj.offsetLeft;
                curtop = obj.offsetTop;
               
                while (obj = obj.offsetParent)
                {
                    curleft += obj.offsetLeft;
                    curtop += obj.offsetTop;
                }
            }
           
            return [curleft,curtop];
        }

        </script>
    </head>
    <body>
        <table>
            <tr style="height: 100px;">
                <td></td>
            </tr>
            <tr>
                <td style="width: 200px;"></td>
                <td><div id="test1" onmouseover="Show(this, 'pop1', 'top');" onmouseout="Hide('pop1');">test1</div></td>
            </tr>
            <tr>
                <td style="width: 200px;"></td>
                <td><div id="Div1" onmouseover="Show(this, 'pop2', 'right');" onmouseout="Hide('pop2');">test2</div></td>
            </tr>
            <tr>
                <td style="width: 200px;"></td>
                <td><div id="Div2" onmouseover="Show(this, 'pop2', 'left');" onmouseout="Hide('pop1');">test3</div></td>
            </tr>
            <tr>
                <td style="width: 200px;"></td>
                <td><div id="test2" onmouseover="Show(this, 'pop2', 'bottom');" onmouseout="Hide('pop2');">test4</div></td>
            </tr>
        </table>
       
       
       
        <div id="pop1" style="position: absolute; visibility: hidden; border: solid 1px black;">Her kan indsættes hvad som helst (billede, knap, etc.)</div>
        <div id="pop2" style="position: absolute; visibility: hidden; border: solid 1px black;">
            <table>
                <tr>
                    <td>lala</td><td> test2</td>
                </tr>
                <tr>
                    <td colspan="2">alt kan indsættes</td>
                </tr>
            </table>
        </div>
    </body>
</html>


Mvh. :)

- Snap
Avatar billede crazysnap Seniormester
18. februar 2007 - 20:40 #2
Hej superflydk,

Læste lige din problemstilling igen og det kunne godt lyde som om du ville have mulighed for at klikke på eventuelle links i popup'en. Så jeg har udvidet scriptet så dette også er muligt (når musen føres hen over popup'en lukkes den ikke, den lukkes først når musen føres udenfor grænserne af popup'en). Hvis du ønsker at popup'en lukkes når musen føres hen over den skal du bare sætte "clickable" til "false" i javascriptet. Scriptet er desuden browser-uafhængigt og virker derfor fint i IE, FF og Opera. :)



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>popup demo</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
        <script type="text/JavaScript">
       
        var margin = 2;
        var hideDelay = 0.1;
        var clickable = true;
       
        var curDiv;
        var timeoutDate;
        var performHide;
               
        function Show(elm, divId, position)
        {
            catchEvent(elm, "mouseout", StartTimeout);
           
            if(curDiv != null)
                Hide(curDiv.id);

            curDiv = document.getElementById(divId);
           
            var elmPos = findPos(elm);
           
            //Get element dimensions
            var elmPosX = elmPos[0];
            var elmPosY = elmPos[1];
            var elmWidth = elm.offsetWidth;
            var elmHeight = elm.offsetHeight;
           
            //Get div dimensions
            var popupWidth = curDiv.offsetWidth;
            var popupHeight = curDiv.offsetHeight;
           
            var posX = 0;
            var posY = 0;
           
            switch(position)
            {
                case 'top':
                    posX = (elmPosX + elmWidth/2) - (popupWidth/2);
                    posY = elmPosY - popupHeight - margin;
                    break;
                case 'bottom':
                    posX = (elmPosX + elmWidth/2) - (popupWidth/2);
                    posY = elmPosY + elmHeight + margin;
                    break;
                case 'left':
                    posX = elmPosX - popupWidth - margin*2;
                    posY = (elmPosY + elmHeight/2) - (popupHeight/2);
                    break;                   
                default: // 'right'
                    posX = elmPosX + elmWidth + margin*2;
                    posY = (elmPosY + elmHeight/2) - (popupHeight/2);
                    break;
            }
           
            posX = Math.max(posX, 0);
            posY = Math.max(posY, 0);
           
            curDiv.style.left = posX + "px";
            curDiv.style.top = posY + "px";
            curDiv.style.visibility = 'visible';
           
            StopTimeout();   
           
            if(clickable)
            {
                catchEvent(curDiv, "mouseout", StartTimeout);
                catchEvent(curDiv, "mouseover", StopTimeout);
            }
        }
       
        function StartTimeout()
        {
            performHide = true;
            timeoutDate = new Date();           
            timeout = setTimeout("Timeout()", 100); 
        }
       
        function StopTimeout()
        {
            performHide = false;
        }
       
        function Timeout()
        {
            if(!performHide)
                return;
               
            var date = new Date();
            var diff = (date - timeoutDate)/1000;
       
            if(diff > hideDelay)
            {
                if(curDiv != null)
                    Hide(curDiv.id);
                return;
            }

            timeout = setTimeout("Timeout()", 100); 
        }
       
        //Hides div-tag
        function Hide(divId)
        {
            var popup = document.getElementById(divId);
            popup.style.visibility = 'hidden'; 
        }
       
        //Returns the position of an object
        function findPos(obj)
        {
            var curleft = curtop = 0;
            if (obj.offsetParent)
            {
                curleft = obj.offsetLeft;
                curtop = obj.offsetTop;
               
                while (obj = obj.offsetParent)
                {
                    curleft += obj.offsetLeft;
                    curtop += obj.offsetTop;
                }
            }
           
            return [curleft,curtop];
        }
       
        function catchEvent(elm, strEvent, Function)
        {
            if (elm.addEventListener) // FireFox
                elm.addEventListener(strEvent, Function, false);
            else if (elm.attachEvent) // IE
                elm.attachEvent("on"+strEvent, Function);
            else // IE can do this, maybe some XYZbrowser has none of the above.
            {
                elm["on"+strEvent] = Function;
                elm[strEvent] = Function;
            }
        }

        </script>
    </head>
    <body>
        <table>
            <tr style="height: 100px;">
                <td></td>
            </tr>
            <tr>
                <td style="width: 200px;"></td>
                <td><div id="test1" onmouseover="Show(this, 'pop1', 'top');" style="border: solid 1px gray">&nbsp;test1 popup over</div></td>
            </tr>
            <tr>
                <td style="width: 200px;"></td>
                <td><div id="Div1" onmouseover="Show(this, 'pop2', 'right');" style="border: solid 1px gray">&nbsp;test2 popup højre</div></td>
            </tr>
            <tr>
                <td style="width: 200px;"></td>
                <td><div id="Div2" onmouseover="Show(this, 'pop2', 'left');" style="border: solid 1px gray">&nbsp;test3 popup venstre</div></td>
            </tr>
            <tr>
                <td style="width: 200px;"></td>
                <td><div id="test2" onmouseover="Show(this, 'pop2', 'bottom');" style="border: solid 1px gray">&nbsp;test4 popup under</div></td>
            </tr>
        </table>
       
        <div id="pop1" style="position: absolute; visibility: hidden; border: solid 1px black;">Her kan indsættes hvad som helst (billede, knap, etc.)</div>
       
        <div id="pop2" style="position: absolute; visibility: hidden; border: solid 1px black;">
            <table width="200px">
                <tr align="center">
                  <td> test</td>
                </tr>
                <tr align="center">
                    <td colspan="2">alt kan indsættes</td>
                </tr>
                <tr align="center">
                    <td>
                        <a href="http://www.google.dk">link til google</a>
                    </td>
                </tr>
            </table>
        </div>
    </body>
</html>



Håber du kan bruge det! :)


Mvh.

- Snap
Avatar billede superflydk Nybegynder
19. februar 2007 - 09:44 #3
Det er smukt! Præcis det jeg skal bruge, og nemt at ændre på for en ikke-javascript-kyndig som undertegnede :-)
Avatar billede crazysnap Seniormester
19. februar 2007 - 09:55 #4
Det er jo perfekt, glad for at jeg kunne hjælpe og held lykke med det!


Tak for pointene!..


Mvh.

- Snap
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