随笔 - 83  文章 - 0  评论 - 28  阅读 - 28万

一个多级菜单

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>meun.html</title>
     
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=GB18030">
     
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
 
 
     
    <script type="text/javascript">
     
    /**
      *根据标签的类型和名称获取元素
      *tagType 标签的类型,比如TD、INPUT、SPAN等
      *eleName 标签元素对应的name属性
      *
      **/
    function getElmentsByName(tagType, eleName) {
        var arr = [];
        if(tagType==""){
            alert("Please Input tagType Attribute.");
        };
        var tags = document.getElementsByTagName(tagType);
        if(eleName==""){
            alert("Please Input eleName Attribute.");
        };
        for(var i=0; i<tags.length; i++){
            if(tags[i].getAttribute("name")==eleName){
                arr.push(tags[i]);
            }
        }
        return arr;
    }
    /** 根据元素的ID获取元素 **/
    function $(id) {
        return "string" == typeof id ? document.getElementById(id) : id;
    }
    /** 属性复制 **/
    var Extend = function(destination, source) {
        for (var property in source) {
            destination[property] = source[property];
        }
        return destination;
    }
     
    /**
      *
      *给对象绑定事件
      *oTarget 目标对象
      *sEventType 事件类型
      *fnHandler 调用函数
      *
      **/
    function addEventHandler(oTarget, sEventType, fnHandler) {
        if (oTarget.addEventListener) {
            oTarget.addEventListener(sEventType, fnHandler, false);
        } else if (oTarget.attachEvent) {
            oTarget.attachEvent("on" + sEventType, fnHandler);
        } else {
            oTarget["on" + sEventType] = fnHandler;
        }
    };
    /** 调用对象绑定 **/
    var Bind = function(object, fun) {
        var args = Array.prototype.slice.call(arguments).slice(2);
        return function() {
            return fun.apply(object, args.concat(Array.prototype.slice.call(arguments)));
        }
    }
     
    /** 获取元素的绝对X坐标**/
    function getElementLeft(element){
    var actualLeft = element.offsetLeft;
    var current = element.offsetParent;
    while (current !== null){
      actualLeft += current.offsetLeft;
      current = current.offsetParent;
    }
    return actualLeft;
  }
 
     /** 获取元素的绝对Y坐标**/
    function getElementTop(element){
    var actualTop = element.offsetTop;
    var current = element.offsetParent;
    while (current !== null){
      actualTop += current.offsetTop;
      current = current.offsetParent;
    }
    return actualTop;
  }
 
    /**a元素是否等于或者包含b元素 **/
    function ifContains(a, b){
        if(a.contains ? a.contains(b) || a == b : a.compareDocumentPosition(b) & 16) return true;
        return false;
    }
 
     
    /** 获取对象的属性值 **/
    function attr(o,attribute){
        return o.getAttribute(attribute);
    }
     
    Object.extend = function(destination, source) {
        for (var property in source) {
            destination[property] = source[property];
        }
        return destination;
    }
     
     
    /** For 循环 **/
    function Each(list, fun){
        for (var i = 0, len = list.length; i < len; i++) { fun(list[i], i); }
    };
     
    function Event(e){
    var oEvent = document.all ? window.event : e;
    if (document.all) {
        if(oEvent.type == "mouseout") {
            oEvent.relatedTarget = oEvent.toElement;
        }else if(oEvent.type == "mouseover") {
            oEvent.relatedTarget = oEvent.fromElement;
        }
         
        oEvent.stopPropagation = function() { this.cancelBubble = true; }
    }
    return oEvent;
}
 
     
    var Class = {
      create: function() {
        return function() {
          this.Initialize.apply(this, arguments);
        }
      }
    }
     
    var MeunUtil = Class.create();
     
    MeunUtil.prototype = {
        Initialize: function(options){//初始化
            var _this = this;
            this.SetOptions(options);
            this.topTagType = this.options.topTagType;
            this.topTagName = this.options.topTagName;
            this.topOnClass = this.options.topOnClass;
            this.topOffClass = this.options.topOffClass;
            this.topMeuns = getElmentsByName(this.topTagType, this.topTagName);
            this.relativeAttrName = this.options.relativeAttrName;
            this.childOnClass = this.options.childOnClass;
            this.childOffClass = this.options.childOffClass;
            Each(this.topMeuns,function(o){_this.HoverTopMeun(o);});//处理所有的菜单
        },
        SetOptions: function(options){          //初始化参数
            this.options={
                topTagName: "topMeun",          //topMeun的class属性
                topTagType: "td",               //topMeun的标签类型
                topOnClass: "",                 //顶级标签获取焦点样式
                topOffClass: "",                //顶级标签失去焦点样式
                relativeAttrName: "childMeun",  //指示下级标签的属性名称
                childTagType: "",               //下级标签的属性名称
                childOnClass: "",               //下级标签得到焦点时的样式
                childOffClass: ""               //下级标签失去焦点时的样式
            }
            Object.extend(this.options, options || {});
        },
        HoverTopMeun: function(topMeun){
            var _this = this;
            var cId = attr(topMeun, _this.relativeAttrName);
            var child = $(cId);
            if(!child) return;
            child.pNode = topMeun;
            addEventHandler(topMeun, "mouseover", function(){
                        topMeun.className = _this.topOnClass;//top的css样式设置
                        child.className = _this.childOnClass;//child的css样式设置
                        child.style.top = getElementTop(topMeun) + topMeun.clientHeight;//child的top坐标设置
                        child.style.left = getElementLeft(topMeun);//child的left坐标设置
            });
            addEventHandler(topMeun, "mouseout", function(e){
                        var event = Event(e);
                        var toElement = event.relatedTarget;//鼠标移动后的所在的对象
                        var contains = ifContains(child, toElement);
                        if(!contains){//如果不包含,则说明已经移出去了
                            topMeun.className = _this.topOffClass;
                            child.className = _this.childOffClass;
                            }
            });
            var spans = child.getElementsByTagName("span");
            Each(spans,function(o){
                o.pNode = child;//记录当前元素所在的容器
                _this.showChildItem(o);
            });
        },
        showChildItem: function(pItem){
                 
                var _this = this;
                 
                var cContainerId = attr(pItem, _this.relativeAttrName);
                var cContainer = $(cContainerId);
                 
                if(cContainer) cContainer.pNode = pItem;
                addEventHandler(pItem, "mouseover", function(){
                            pItem.style.backgroundColor = "yellow";
                            if(!cContainer) return;
                            var cItems = cContainer.getElementsByTagName("span");
                            cContainer.className = _this.childOnClass;
                            cContainer.style.top = getElementTop(pItem);//cContainer的top坐标设置
                            cContainer.style.left = getElementLeft(pItem) + pItem.clientWidth;//cContainer的left坐标设置
                        });
                addEventHandler(pItem, "mouseout", function(e){
                             
                            var event = Event(e);
                            var toElement = event.relatedTarget;//鼠标移动后的所在的对象
                            if(cContainer && ifContains(cContainer, toElement)){//如果有子元素,并且移到了字元素块里
                                return;
                            }
                            if(cContainer) cContainer.className = _this.childOffClass;//隐藏子元素
                             
                            if(ifContains(pItem.pNode, toElement) || pItem.pNode.pNode==toElement){//移动到了包含其它元素里||父亲元素
                                pItem.style.backgroundColor = "#CC5500";
                            }else if(pItem.pNode.pNode && pItem.pNode.pNode.pNode && ifContains(pItem.pNode.pNode.pNode, toElement)){//移动到了父亲容器
                                pItem.style.backgroundColor = "#CC5500";
                                pItem.pNode.className = _this.childOffClass;
                                pItem.pNode.pNode.style.backgroundColor = "#CC5500";
                            }else {//完全移出去了
                                pItem.style.backgroundColor = "#CC5500";
                                var cur = pItem.pNode;
                                while(cur){
                                    if(!attr(cur, _this.relativeAttrName)){
                                        cur.className = _this.childOffClass;
                                    }else {
                                        if(cur.pNode){
                                            cur.style.backgroundColor = "#CC5500";
                                        }else {//如果已经没有父亲元素,则为最上级,css样式不一样
                                            cur.className = _this.topOffClass;
                                        }
                                         
                                    }
                                    cur = cur.pNode;
                                }
                            }
                             
                        });
                if(!cContainer) return;
                var spans = cContainer.getElementsByTagName("span");
                var _arguments = arguments;
                Each(spans,function(o){
                    o.pNode = cContainer;//记录当前元素所在的容器
                    _arguments.callee.call(_this, o);
                });
            }
    };
    </script>
     
     
    <style type="text/css">
    .mainMeunOff{
    border: 2px solid #999999;
    padding: 5px 15px;
    background-color: #CC0000;
    width: 100px;
    width: 96px\9; /**For IE, contains padding**/
    text-align: center;
    }
     
    .mainMeunOn{
    border: 2px solid #999999;
    padding: 5px 15px;
    background-color: #CCEEEE;
    width: 100px;
    width: 96px\9; /**For IE, contains padding**/
    text-align: center;
    cursor: pointer;
    }
     
    .item_off{
    position: absolute;
    visibility:hidden;
    line-height: 20px;
    }
    .item_on{
    position: absolute;
    visibility:visible;
    line-height: 20px;
    }
    .item_off span{
    background-color: #CC5500;
    border: 2px solid #999999;
    display:block;
    width: 100px;
    width: 130px\9; /**For IE, contains padding**/
    padding: 5px 15px;
    }
     
    .item_on span{
    background-color: #CC5500;
    border: 2px solid #999999;
    display:block;
    width: 100px;
    width: 130px\9; /**For IE, contains padding**/
    padding: 5px 15px;
    }
    </style>
  </head>
   
  <body style="text-align: center;margin: 50px 100px;" >
     
 
    <table >
        <tr>
            <td class="mainMeunOff" name="topMeun" childMeun="cItem_1">菜单一</td>
            <td class="mainMeunOff" name="topMeun" childMeun="cItem_2">菜单二</td>
            <td class="mainMeunOff" name="topMeun" childMeun="cItem_3">菜单三</td>
            <td class="mainMeunOff" name="topMeun"childMeun="cItem_4">菜单四</td>
        </tr>
    </table>
     
    <div class="item_off" id="cItem_1">
        <span>Item 1_1</span>
        <span childMeun="cItem_1_2">Item 1_2 —></span>
        <span childMeun="cItem_1_3">Item 1_3 -></span>
        <span>Item 1_4</span>
    </div>
     
    <div class="item_off" id="cItem_2">
        <span>Item 2_1</span>
        <span  childMeun="cItem_2_1">Item 2_2 -></span>
        <span>Item 2_3</a></span>
        <span>Item 2_4</span>
    </div>
     
    <div class="item_off" id="cItem_3">
        <span>Item 3_1</span>
        <span>Item 3_2</span>
        <span>Item 3_3</span>
        <span>Item 3_4</span>
    </div>
     
    <div class="item_off" id="cItem_4">
        <span>Item 4_1</span>
        <span>Item 4_2</span>
        <span>Item 4_3</span>
        <span>Item 4_4</span>
    </div>
     
    <div class="item_off" id="cItem_1_2">
        <span>Item 1_2_1</span>
        <span>Item 1_2_2</span>
        <span>Item 1_2_3</span>
        <span>Item 1_2_4</span>
    </div>
     
    <div class="item_off" id="cItem_1_3">
        <span>Fun 1_2_1</span>
        <span>Item 1_3_2</span>
    </div>
     
    <div class="item_off" id="cItem_2_1">
        <span  childMeun="cItem_2_1_1">Java_boy -></span>
        <span>Item 2_1_2</span>
    </div>
     
    <div class="item_off" id="cItem_2_1_1">
        <span>Item Jack</span>
        <span>Item Frame</span>
        <span>Item Sina</span>
        <span>Item World</span>
        <span   childMeun="cItem_dw">Item Baidu-></span>
        <span>Item Google</span>
    </div>
     
    <div class="item_off" id="cItem_dw">
        <span>Item Daiwei</span>
        <span>Item Shan</span>
    </div>
    <div>
    <span id="msg"></span>
    </div>
    <script>
    new MeunUtil({
        childTagType:"span",
        childOffClass:"item_off",
        childOnClass:"item_on",
        topOffClass:"mainMeunOff",
        topOnClass:"mainMeunOn"
    });
    </script>
  </body>
     
</html>

 

posted on   cfd406635982  阅读(1320)  评论(2编辑  收藏  举报
编辑推荐:
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
阅读排行:
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· 卧槽!C 语言宏定义原来可以玩出这些花样?高手必看!
· langchain0.3教程:从0到1打造一个智能聊天机器人
< 2012年3月 >
26 27 28 29 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
1 2 3 4 5 6 7

点击右上角即可分享
微信分享提示