一个下拉菜单效果的实现

阅读更多
先前只是记录, 说的不够清楚,当然现在仍可能不够清晰. 阅读此方法前提是你已经对jQuery有一定的使用经验

这个函数实现了一个小功能: 一级下拉菜单的功能, 加入延时机制, 可以防止弹出或隐藏过快, 代码中用的fadeIn,fadeOut是渐显渐隐效果,修改一下就可以实现其他效果.使用中首先要确定两个dom元素, 用css先定位好, 并给这两个加上唯一id或是class做为引用, 然后使用下面这个函数绑定一种鼠标动作来触发即可

简的例子

一级目录

  • 二级目录1
  • 二级目录2
  • 二级目录3
  • 二级目录4


再来一个实用的




此方法要求页面已经使用了jQuery库
/**
* 显示隐藏下拉菜单效果
*
* selector1: 当鼠标click 选择器selector1元素时, 显示选择器selector2元素, 当鼠标进入selector2并从selector2上离开时, 200ms内隐藏selector2, 如果在离开selector2又立刻(200ms内)回到selector2上, 则不会关闭
* selector2: 被显示隐藏的dom
* type: 是dom元素响应什么类型的动作(鼠标甚至tab的焦点), 这里使用的字符串是与jquery中on()动作中可以使用的动作相同的, 这里使用click为例
*/

function showhide(selector1, selector2, type){
    var timer = {};
    var key = "___showhide_uuid"
    //取得全局唯一标志符
    var UUID = function(){
        if(!window[key]) window[key] = 1;
        return window[key]++;
    }
    //先检查目标有没有uuid
    var uuid = $(selector1).eq(0).attr(key);
    if(!uuid){
        uuid = UUID();
    }
    //将uuid添加到dom上
    $(selector1).attr(key, uuid);
    $(selector2).attr(key, uuid);
    //确定动作
    type = type || "mouseenter";
    //绑定动作
    var call = function(_this, callback){
        var _uuid = $(_this).attr(key);
        if(timer[_uuid]) clearInterval(timer[_uuid]);
        timer[_uuid] = setTimeout(function(){callback.call();},200);
    }
    $(selector1)[type](function(){
        call(this, function(){$(selector2).fadeIn(100);});
    }).mouseleave(function(){
        call(this, function(){$(selector2).fadeOut(200);});
    });
    $(selector2).mouseenter(function(){
        call(this, function(){});
    }).mouseleave(function(){
        call(this, function(){$(selector2).fadeOut(200);});
    });
}

/*
	使用方法

	showhide(".J_C_Game",".J_C_Game_T","mouseenter");
	
	showhide(".J_C_Game",".J_C_Game_T","click");
	
	...
	
*/


总结一下: 此方法的存在价值就在于使用了延时机制, 可以大提升使用体验
如: 一般的方法: $(二级菜单).mouseout(function(){$(this).hide()});
如果二级菜单中存在超级链接, 鼠标在二级菜单上面移动会导致其隐藏,
使用此方法可以防止这种情况发生

你可能感兴趣的:(javascript,jquery)