2013-05-01 56 views
0

當鼠標懸停在.login-content上時,我希望login-btn保持其懸停狀態。我已經嘗試過,現在它顯示並隱藏懸停的div,但login-btn在懸停時忽略懸停狀態,而懸停時.login-content消失。將鼠標懸停在元素上的jQuery仍然保留了懸停類。當鼠標懸停時,應刪除此類樣式

更新:
目前的問題是,如果鼠標懸停在登錄後直接關徘徊..而不是懸停在子元素中,.hovered風格保持。這不應該是這樣。

的HTML如下:

   <li><a href="#" class="login-btn">Login</a> 
        <div class="login-content"> 
         <form name="login-form" action="" method="post"> 
          <input type="email" name="email" value="" placeholder="E-mail" /> 
          <input type="password" name="password" value="" placeholder="Password" /> 
          <input type="submit" name="login" value="Login" class="form-login" /> 
         </form> 
        </div> 
       </li> 

jQuery的代碼如下:

$(document).ready(function() { 

$(".login-btn").hover(
    function() { 
     clearTimeout($(this).data('hoverTimeoutId')); 
     $(".login-content").show(); 
     $(this).addClass('hovered'); 
    }, 
    function() { 
     clearTimeout($(this).data('hoverTimeoutId')); 
     $(this).data('hoverTimeoutId', setTimeout(function() { 

      $(this).removeClass('hovered'); 
      $(".login-content").hide(); 
     } ,500)); 
    }); 


$('.login-content').hover(
    function(){  
     clearTimeout($(".login-btn").data('hoverTimeoutId')); 
    },  
    function(){  
     $(".login-content").hide(); 
     $(".login-btn").removeClass('hovered'); 
    }); 
}); 

該網頁也可以在http://www.domainandseo.com/portfolio/1may/index.html發現是否需要任何進一步的調試。

感謝

+0

你想*褪色*它或者只是有它在1秒後彈出? – 2013-05-01 00:55:37

+0

剛剛在1秒後彈出,並在1秒後消失。 – 2013-05-01 01:03:00

回答

2

嘗試

$(".login-btn").hover(
    function() { 
     clearTimeout($(this).data('hoverTimeoutId')); 
     $(".login-content").show(); 
     $(this).addClass('hovered'); 
    }, 
    function() { 
     clearTimeout($(this).data('hoverTimeoutId')); 
     $(this).data('hoverTimeoutId', setTimeout(function() { 
      $(".login-content").hide(); 
      $(this).removeClass('hovered'); 
     } ,500)); 
    }); 


$('.login-content').hover(
    function(){  
     clearTimeout($(".login-btn").data('hoverTimeoutId')); 
    },  
    function(){  
     $(".login-content").hide(); 
     $(".login-btn").removeClass('hovered'); 
    }); 

而不是使用:hover psedoclass的使用像hover類分配懸停STA在演示顯示TE到 login-btn

演示:Fiddle

+0

這很不錯。在問題中提到的另一件事是,我想要做的是,當.hover-content被徘徊[或可見]時,.login-btn應該處於其懸停狀態..有黑色背景並且增強高度。任何方式來做到這一點?再次感謝Arun。 – 2013-05-01 01:55:27

+0

@AlexZahir查看更新 – 2013-05-01 02:10:55

+0

@AlexZahir您需要將css規則'.login-btn:hover'更改爲'a.login-btn.hovered' – 2013-05-01 02:30:07

0

使用setTimeout

$(".login-btn").hover(
function() { 
    clearTimeout($(this).data('animator')); 
    $(this).data('animator', setTimeout(function() { 
     $(".login-content").show(); 
    } ,1000)); 
}, 
function() { 
    clearTimeout($(this).data('animator')); 
    $(this).data('animator', setTimeout(function() { 
     $(".login-content").hide(); 
    } ,1000)); 
}); 

http://jsfiddle.net/uDm64/

+0

這太好了。但問題的第二部分呢?一旦我將鼠標從登錄按鈕上移開,表單就會消失,並且登錄按鈕失去懸停。我嘗試使用可以在問題中給出的代碼中看到的addclass,但它不起作用。 – 2013-05-01 01:12:23

+0

@AlexZahir如果'.hover'類不存在,只需觸發隱藏就可以做到這一點:http://jsfiddle.net/uDm64/1/ – 2013-05-01 01:15:13

+0

這段代碼導致一些小問題,例如頭部的任何部分被徘徊,.login內容顯示出來。此外,當鼠標移開時,即使在降低超時時間後,它也不會隱藏或隱藏很長時間。另一個重要的事情是,當.login-content處於懸停狀態時,.login-btn的懸停狀態不會打開。 – 2013-05-01 01:23:05

0

如果你不想操心具有光標離開了一會兒用戶,那麼我建議多一點狀態檢查。

另外,如果你希望你的按鈕出現徘徊,在你的CSS選擇器 '的.login-BTN:懸停',將其更改爲: '的.login-BTN:懸停和.login-btn.hover'

小提琴:http://jsfiddle.net/qhAus/

(function() { 
    var timer = 0, 
     open = false, 
     loginBtn = $('.login-btn'), 
     loginContent = $('.login-content'), 
     startTimeout = function(state, duration) { 
      timer = setTimeout(function() { 
       timer = 0; 
       loginContent[state](); 
       open = state === 'show'; 

       if(!open) { 
        // If it's closed, remove hover class 
        loginBtn.removeClass('hover'); 
       } 
      }, duration || 1000); 
    }; 

    loginBtn.hover(function(e) { 
     $(this).addClass('hover'); 

     if(open && timer) { 
      // If about to close but starts to hover again 
      clearTimeout(timer); 
     } 

     if(!(open || timer)) { 
      // Don't start to open again if already in the process 
      startTimeout('show'); 
     } 
    }, function() { 
     // When not hovering anymore, hide login content 
     startTimeout('hide', 2000); 
    }); 

    loginContent.mousemove(function(e) { 
     // If cursor focus on the login content, stop any closing timers 
     if(timer) { 
      clearTimeout(timer); 
     } 
    }); 

    loginContent.mouseleave(function(e) { 
     // When cursor leaves login content, hide it after delay 
     startTimeout('hide'); 
    }); 

})();