slideDown()
是jquery中的一个对象实例,用于显示所有匹配的元素,并带有向下滑动的过渡动画效果,即元素可见区域的高度从0逐渐增大到其原有高度(向下逐渐展开)。如果元素本身是可见的,则不对其作任何改变。如果元素是隐藏的,则使其可见。
最近很郁闷,因为我在使用jquery下拉菜单的时候使用到了slideDown() 和slideUp();下面是我的代码
<div> <ul> <li> <a href="">Home</a> <ul> <li> <a href="">page01</a> </li> <li> <a href="">page02</a> </li> <li> <a href="">page03</a> </li> </ul> </li> </ul> </div> |
<script type="text/javascript"> $(function(){ $(".menu ul li").hover( function(){ $(this).find("ul").stop().slideDown(); },function(){ $(this).find("ul").stop().slideUp(); } ) }) </script> |
slideDown(speed,callback);
当鼠标迅速移上去,迅速移开,然后就会发现,下来菜单逐渐消失,最后移上去的时甚至是不显示了。我一直不明白这个怎么解决。
后来搜索相关关键词才发现了一篇文章的评论里面的做法。
发现原来是我的语法用错了,思路是正确的。
只要将里面的第一个stop()改为stop(true,true).第二个stop()去掉即可。或者在第二个里面加上stop(true,true),第一个去掉。
或者使用这样子的函数:把第一个stop()改为filter(‘:not(:animated)’).同样的第二个也不需要添加stop().
这里面涉及到的其实就是一个动画的stop();函数
stop() 方法停止当前正在运行的动画。
$(selector).stop(stopAll,goToEnd)
stopAll 可选。规定是否停止被选元素的所有加入队列的动画。
goToEnd 可选。规定是否允许完成当前的动画。该参数只能在设置了 stopAll 参数时使用。
从上面的stop()可以看出,我们滑过的时候触发了slideDown();那么让他的高度自然完成当前动画,同时停止加进来的动画队列。
今天到此就解决了我一直以来的疑问了,当前使用stop(true,false)、stop(false,true)都是错误的。
完满解决了。
有时候发现不靠谱的时候,特别是在解决bug的时候找到问题,但关键是苦于不能解决的时候,有一种速成的方法在眼前的时候,是不是感激涕零呢?
今天分享另外一个代码,通过延迟出现和停留的时间来解决这个bug,这个代码同时还可以用在下来菜单中二级导航距离比较远的时候的使用。
// 线程 IDs var mouseover_tid = []; var mouseout_tid = []; jQuery(document).ready(function(){ jQuery('#menus > li').each(function(index){ jQuery(this).hover( // 取消淡出菜单的线程, 延时淡入菜单 function(){ var _self = this; clearTimeout(mouseout_tid[index]); mouseover_tid[index] = setTimeout(function() { jQuery(_self).find('ul:eq(0)').fadeIn(200); }, 400); }, // 取消淡入菜单的线程, 延时淡出菜单 function(){ var _self = this; clearTimeout(mouseover_tid[index]); mouseout_tid[index] = setTimeout(function() { jQuery(_self).find('ul:eq(0)').fadeOut(200); }, 400); } ); }); });
代码来自mg12这里