исчезающие меню без JQuery - PullRequest
       7

исчезающие меню без JQuery

0 голосов
/ 02 апреля 2012

Итак, у меня есть вопрос, который, я уверен, многие задавали раньше. Я пытаюсь использовать систему меню с исчезновением собственного дизайна без помощи JQuery. Моя проблема, конечно, в том, что я могу заставить меню исчезать или исчезать в идеальном мире, где указатель не может быстро войти и покинуть элемент, который создает меню (в моем случае UL). Но, естественно, я получаю эффект мерцания, когда курсор быстро входит и выходит из UL. Я предполагаю, что мне нужен отличный обработчик событий моего собственного дизайна. Я опубликую свой код, хотя я не думаю, что он понадобится, потому что я, вероятно, собираюсь его пересмотреть и начать все сначала. У кого-нибудь есть ссылки / идеи / или хорошее руководство, чтобы начать с этого?

код JavaScript:

window.onload = InitPage;

function InitPage(){

function fadeEffect(child, opacity, direction, e){
    if(direction && opacity != 1){
        opacity = opacity < 1?Math.round((opacity + 0.05)*100)/100:1;
        child.style.opacity = opacity;
        setTimeout(function(){fadeEffect(child, opacity, direction,e)},50);
    }else if(!direction && opacity != 0){
        opacity = opacity > 0?Math.round((opacity - 0.05)*100)/100:0;
        child.style.opacity = opacity;
        child.style.display = opacity == 0?"none":"block";
        setTimeout(function(){fadeEffect(child, opacity, direction,e)},50);
    }
}

function hoverMenu(e, oTarget){
    var isChildOf = function(pNode, cNode){
        if(pNode === cNode){
            return true;
        }

        while (cNode && cNode !== pNode){
            cNode = cNode.parentNode;
        }

        return cNode === pNode;
    }

    var hasChildMenu = function(pNode, cNode){
        while(cNode && cNode !== pNode){
            if(cNode.className == "ul_menu" || cNode.className == "li_menu"){
                cNode.style.display = "block";
                //cNode.style.opacity = 1;
                fadeEffect(cNode,0,true,e);
                //cNode.timer = setInterval(function(arg1,arg2,arg3){return function(){fadeEffect(arg1,arg2,arg3)}}(cNode,opacity,true),50);
            }
            cNode = cNode.previousSibling;
        }
        if(e.type == "mouseout"){
            e.cancelBubble();
        }
    }

    var target = e.target;

    if(!oTarget){
        oTarget = target;
    }

    var relTarg = e.fromElement;

    if(isChildOf(oTarget, relTarg) == false){
        //alert("mouse enters");
        hasChildMenu(oTarget, oTarget.lastChild);
    }
}

function unhoverMenu(e, oTarget){

    var isChildOf = function(pNode, cNode){
        //check to see if element is a child
        if(pNode === cNode){
            return true;
        }

        while (cNode && cNode !== pNode){
            cNode = cNode.parentNode;
        }

        return cNode === pNode;
    }

    var hasChildMenu = function(pNode, cNode){
        while(cNode && cNode !== pNode){
            if(cNode.className == "ul_menu" || cNode.className == "li_menu"){
                //cNode.style.opacity = 0;
                //cNode.style.display = "none";
                fadeEffect(cNode,1,false,e);
            }
            cNode = cNode.previousSibling;
        }
        if(e.type == "mouseover"){
            e.cancelBubble();
        }
    }

    var target = e.target;

    if(!oTarget){
        oTarget = target;
    }

    var relTarg = e.toElement;

    if(isChildOf(oTarget, relTarg) == false){
        hasChildMenu(oTarget, oTarget.lastChild);
    }

    function MenuEventHandler (e, oTarget){
    }
}

var ul_menu = document.getElementById("ul_grabbed");
ul_menu.addEventListener("mouseover", function(e1){return function(e){hoverMenu(e, e1)}}(ul_menu),false);
ul_menu.addEventListener("mouseout", function(e1){return function(e){unhoverMenu(e, e1)}}(ul_menu),false);
//document.addEventListener("mouseover", hoverMenu,false);
//document.addEventListener("mouseout",unhoverMenu,false);
}

HTML код:

<html>
<head>
    <script type="text/javascript" src="bubble.js"></script>
    <link rel="stylesheet" href="bubble_style.css" type="text/css" media="screen" />
</head>
<body>
    <div id="background">
        <div id="menu_section">
            <ul id="ul_grabbed" class="ul_menu">Menu 1
                <li class="li_menu">item 1</li>
                <li class="li_menu">item 2</li>
                <li class="li_menu">item 3</li>
                <li class="li_menu">item 4</li>
            </ul>
            <ul class="ul_menu">
                Menu 2
            </ul>
        </div>
    </div>
</body>
</html>

Код CSS:

*{margin:0; padding:0}
body{margin:0; padding:0;background-color:black}

div#background{
margin: 0 auto 0 auto;
display:block;
width:800px;
height:100%;
vertical-align:middle;
background-color: green;}

div#menu_section{
margin:auto;
width:800px;
height:40px;
background-color:purple;}

div#monkey{
width:400px;
height:400px;
background-color:red;}

ul.ul_menu{
list-style:none;
display:block;
height:40px;
width:400px;
float:left;
text-align:center;
color:white;
}

li.li_menu{
height:20px;
display:none;
position:relative;
text-align:center;
color:white;
background-color:black;
opacity:0;}

Ответы [ 2 ]

0 голосов
/ 15 апреля 2012

У меня есть решение для этого (мусорный код, который это может быть).Приведенный ниже код демонстрирует то, что я пытался изучить, и, возможно, может помочь другим увидеть то же самое.

HTML / CSS

<html>
<head>
    <title>Test</title>
    <script type="text/javascript" src="test_menu.js"></script>
    <style type="text/css" media="screen">
        #menu_header{
            background-color:#617A2A;
            color:#C5DE8E;
            height:40px;
            width:120px;
            text-align:center;
            display:block;}

        #menu{
            opacity:0;
            display:none;
            position:absolute;
            background-color:#AEC971;
            width:120px;}           

        #menu div{
            text-align:center;}

        #menu a, #menu a:link, #menu a:visited{
            color:#FFF;
            display:block;
            text-decoration:none;}

        #menu a:hover{
            background-color:#414A2C;}

        #info_area{
            border: 1px black solid;
            position:float-left;
            margin-top:20px;
            width:512px;
            height:512px;
            overflow:auto;}
    </style>
</head>
<body>
    <div id="menu_header">
        Something
    </div>
    <div id="menu">
        <div><a href="http://www.google.com">Google</a></div>
        <div><a href="http://www.yahoo.com">Yahoo</a></div>
    </div>
    <div id="info_area">
    </div>
</body>
</html>

Javascript:

window.onload = InitPage;

function InitPage(){

var menu = document.getElementById("menu");
var menu_header = document.getElementById("menu_header");
var opacity_global = menu.style.opacity == ""?0:menu.style.opacity;
var timer = 0;

function fadeEffect(opacity, direction){
    if(direction && opacity != 1){
        opacity_global = opacity < 1?Math.round((opacity + 0.05)*100)/100:1;
        menu.style.opacity = opacity_global;
        if(opacity_global == 1){
            window.clearInterval(timer);
        }
        //setTimeout(function(){fadeEffect(child, opacity, direction);},50);
    }else if(!direction && opacity != 0){
        opacity_global = opacity > 0?Math.round((opacity - 0.05)*100)/100:0;
        menu.style.opacity = opacity_global;
        menu.style.display = opacity_global == 0?"none":"block";
        if(opacity_global == 0){
            window.clearInterval(timer);
        }
        //setTimeout(function(){fadeEffect(child, opacity, direction);},50);
    }
}

function eventHandler(e, menu, menu_header){
    var target = e.target;
    var menu_headerTarget = menu_header;
    var menuTarget = menu;
    var fromTarget = e.fromElement;
    var toTarget = e.toElement;
    var info = document.getElementById("info_area");

    var isChild = function(pNode, cNode){
        while(cNode && pNode !== cNode){
            cNode = cNode.parentNode;
        }
        return pNode === cNode;
    }

    //alert("e.type: " + e.type + "\ntarget: " + target + "\ntoElement: " + toTarget + "\nfromElement: " + fromTarget );

    if((isChild(target, fromTarget) == false) && (e.type == "mouseover") && (isChild(menuTarget,target)==false) && (isChild(menuTarget, fromTarget)==false)){
        window.clearInterval(timer);
        info.innerHTML += "<br />mouseover!";
        menuTarget.style.display = "block";
        timer = window.setInterval(function(){return fadeEffect(opacity_global, true);},25);
        //menuTarget.timer = setInterval(function(arg){arg.style.opacity += 0.05}(menuTarget),50);
    }else if((fromTarget === menu_headerTarget) && (isChild(menuTarget,toTarget) == false) && e.type == "mouseout"){
        window.clearInterval(timer);
        info.innerHTML += "<br />mouseout 1";
        //menuTarget.style.display = "none";
        timer = window.setInterval(function(){return fadeEffect(opacity_global, false);},25);
        //setTimeout(function(menuTarget){return function(){menuTarget.style.display = "none"}}(menuTarget),1000);
    }
    else if((isChild(menuTarget, target) == true) && (isChild(menuTarget, toTarget) == false) && (toTarget !== menu_headerTarget) && e.type == "mouseout"){
        window.clearInterval(timer);
        info.innerHTML += "<br />mouseout 2";
        //menuTarget.style.display = "none";
        //setTimeout(function(menuTarget){return function(){menuTarget.style.display = "none"}}(menuTarget),1000);
        timer = window.setInterval(function(){fadeEffect(opacity_global, false);},25);
    }else{
        info.innerHTML += "<br />Stopped an event!! " + "type: " + e.type + " target: " + target;
        e.stopPropagation();
    }
}

menu_header.addEventListener("mouseover",function(e){eventHandler(e, menu, menu_header);},false);
menu_header.addEventListener("mouseout",function(e){eventHandler(e, menu, menu_header);},false);
menu.addEventListener("mouseout",function(e){eventHandler(e, menu, menu_header);},false);
menu.addEventListener("mouseover",function(e){eventHandler(e, menu, menu_header);},false);
}
0 голосов
/ 02 апреля 2012

В реальном проекте выполнение этого без jQuery (или какой-либо другой библиотеки) заставило бы меня задуматься о том, являетесь ли вы обжорой для наказания.Кросс-браузерная анимация - это относительно сложная проблема, которая уже решена.

Однако, так как это опыт обучения, вот несколько указателей:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...