Skip to main content

jquery mouseenter mouseout in menu



I met some jquery menu mouseenter problem. How to fix when mouse enter p , the p still display block ?







<script>

$(document).ready(function() {

$('a').mouseenter(function(){

$('p').css('display','none');

$(this).next('p').slideDown('slow');

}).mouseleave(function(){

$('p').slideUp('slow');

});

$('p').mouseenter(function(){

$(this).css('display','block');

});​

});

</script>

<div>

<a>menu1</a>

<p>about us</p>

<a>menu2</a>

<p>contact</p>

</div>

<style>

div{

position:relative;

z-index:0;

width:600px;

height:20px;

}

p{

display:none;

position:absolute;

top:20px;

left:0;

width:300px;

height:100px;

background:#ccc;

}​

</style>









Live demo: http://jsfiddle.net/KTvf7/


Comments

  1. Fixed it for ya..

    $('a').mouseenter(function(){
    $('p').css('display','none');
    $(this).next('p').slideDown('slow');});
    $('p').mouseleave(function(){
    $('p').slideUp('slow');
    });
    $('p').mouseenter(function(){
    $(this).css('display','block');
    });

    ReplyDelete
  2. It's better to structure your menu otherwise, like:

    <ul class="menu">
    <li>item
    <ul>
    <li>sub item</li>
    <li>sub item</li>
    <li>sub item</li>
    </ul>
    </li>
    </ul>


    And add .menu li ul { display: none; } to the css.

    In this structure, entering and leaving the .menu > li works great.



    If you still want to stick to your structure, you can only attach mouseleave to the container. I gave it a class .menu in this fiddle:

    $('.menu a').mouseenter(function(){
    $('.menu p').css('display', 'none');
    $(this).next('p').slideDown('slow');
    })

    $('.menu').mouseleave(function(){
    $('p', this).slideUp('slow');
    });

    ReplyDelete
  3. Why don't you use a <ul>? I think it's better for what you're trying to do.

    html:

    <ul>
    <li>
    <a href="#">Menu One</a>
    <p>About Us</p>
    </li>
    <li>
    <a href="#">Menu Two</a>
    <p>Contact Us</p>
    </li>
    </ul>


    css:

    li { float: left; padding: 0 2em; }
    p {
    height: 100px;
    background: red;
    padding: 0 2em;
    display: none;
    position: absolute;
    }


    jQ:

    $('li').hover(function(){
    $(this).find('p').stop(true, true).slideDown();
    }, function(){
    $(this).find('p').stop(true, true).slideUp();
    });


    Example

    jsFiddle

    ReplyDelete

Post a Comment

Popular posts from this blog

Why is this Javascript much *slower* than its jQuery equivalent?

I have a HTML list of about 500 items and a "filter" box above it. I started by using jQuery to filter the list when I typed a letter (timing code added later): $('#filter').keyup( function() { var jqStart = (new Date).getTime(); var search = $(this).val().toLowerCase(); var $list = $('ul.ablist > li'); $list.each( function() { if ( $(this).text().toLowerCase().indexOf(search) === -1 ) $(this).hide(); else $(this).show(); } ); console.log('Time: ' + ((new Date).getTime() - jqStart)); } ); However, there was a couple of seconds delay after typing each letter (particularly the first letter). So I thought it may be slightly quicker if I used plain Javascript (I read recently that jQuery's each function is particularly slow). Here's my JS equivalent: document.getElementById('filter').addEventListener( 'keyup', function () { var jsStart = (new Date).getTime()...

Is it possible to have IF statement in an Echo statement in PHP

Thanks in advance. I did look at the other questions/answers that were similar and didn't find exactly what I was looking for. I'm trying to do this, am I on the right path? echo " <div id='tabs-".$match."'> <textarea id='".$match."' name='".$match."'>". if ($COLUMN_NAME === $match) { echo $FIELD_WITH_COLUMN_NAME; } else { } ."</textarea> <script type='text/javascript'> CKEDITOR.replace( '".$match."' ); </script> </div>"; I am getting the following error message in the browser: Parse error: syntax error, unexpected T_IF Please let me know if this is the right way to go about nesting an IF statement inside an echo. Thank you.