非常好的一个JS代码(FixedMenu.htm)

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>JavaScript 多级联动浮动菜单</title>
    <script type="text/javascript" src="aCJL.0.1.min.js"></script>
    <script src="http://localhost:53354/Content/CJL.0.1.js"></script>
    <script type="text/javascript" src="RelativePosition.js"></script>
    <script type="text/javascript">

        //容器集合
        var FixedMenu = function (containers, options) {
            this._timerContainer = null;//容器定时器
            this._timerMenu = null;//菜单定时器
            this._frag = document.createDocumentFragment();//碎片对象,保存菜单元素
            this._menus = {};//菜单对象

            this._containers = [];//容器集合

            this._setOptions(options);
            var opt = this.options;

            this._custommenu = opt.menu;

            this.css = opt.css;
            this.hover = opt.hover;
            this.active = opt.active;
            this.tag = opt.tag;
            this.html = opt.html;
            this.relContainer = opt.relContainer;
            this.relative = opt.relative;
            this.attribute = opt.attribute;
            this.property = opt.property;

            this.onBeforeShow = opt.onBeforeShow;

            this.delay = parseInt(opt.delay) || 0;

            //修正自定义容器
            $$A.forEach($$A.isArray(containers) ? containers : [containers], function (o, i, zz) {
                //自定义容器 id:定位元素 menu:插入菜单元素
                var pos, menu;
                if (o.id) {
                    pos = o.id; menu = o.menu ? o.menu : pos;
                } else {
                    pos = menu = o;
                };
                pos = $$(pos); menu = $$(menu);
                //容器对象 pos:定位元素 menu:插入菜单元素
                pos && menu && this._iniContainer(i, { "pos": pos, "menu": menu });
            }, this);

            //初始化程序
            this._iniMenu();
        };
        FixedMenu.prototype = {
            //设置默认属性
            _setOptions: function (options) {
                this.options = {//默认值
                    menu: [],//自定义菜单集合
                    delay: 200,//延迟值(微秒)
                    tag: "div",//默认生成标签
                    css: undefined,//默认样式
                    hover: undefined,//触发菜单样式
                    active: undefined,//显示下级菜单时显示样式
                    html: "",//菜单内容
                    relContainer: false,//是否相对容器定位(否则相对菜单)
                    relative: { align: "clientleft", vAlign: "bottom" },//定位对象
                    attribute: {},//自定义attribute属性
                    property: {},//自定义property属性
                    onBeforeShow: function () { }//菜单显示时执行
                };
                $$.extend(this.options, options || {});
            },
            //程序初始化
            _iniMenu: function () {
                this.hide();//隐藏菜单
                this._buildMenu();//生成菜单对象
                this._forEachContainer(this._resetContainer);//重置容器属性
                this._insertMenu(0, 0);//显示菜单
            },
            //根据自定义菜单对象生成程序菜单对象
            _buildMenu: function () {
                //清除旧菜单dom(包括自定义的)
                this._forEachMenu(function (o) {
                    var elem = o._elem;
                    if (elem) {
                        //防止dom内存泄漏
                        $$E.removeEvent(elem, "mouseover", o._event);
                        elem.parentNode.removeChild(elem);
                        o._elem = o.elem = null;
                    };
                });
                //设置菜单默认值
                var options = {
                    id: 0,//id
                    rank: 0,//排序
                    elem: "",//自定义元素
                    tag: this.tag,
                    css: this.css,
                    hover: this.hover,
                    active: this.active,
                    html: this.html,
                    relContainer: !!this.relContainer,
                    relative: this.relative,
                    attribute: this.attribute,
                    property: this.property
                };
                //先定义"0"顶级菜单
                this._menus = { "0": { "_children": [] } };
                //整理自定义菜单并插入到程序菜单对象
                $$A.forEach(this._custommenu, function (o) {
                    //生成菜单对象(由于包含对象,要用深度扩展)
                    var menu = $$.deepextend($$.deepextend({}, options), o || {});
                    //去掉相同id菜单,同时排除了id为"0"的菜单
                    if (!!this._menus[menu.id]) { return; };
                    //重置属性
                    menu._children = []; menu._index = -1;
                    this._menus[menu.id] = menu;
                }, this);
                //建立树形结构
                this._forEachMenu(function (o, id, menus) {
                    if ("0" === id) { return; };//顶级没有父级菜单
                    var parent = this._menus[o.parent];
                    //父级菜单不存在或者父级是自己的话,当成一级菜单
                    if (!parent || parent === o) { parent = menus[o.parent = "0"]; };
                    //插入到父级菜单对象的_children中
                    parent._children.push(o);
                });
                //整理菜单对象
                this._forEachMenu(function (o) {
                    //如果有自定义元素的话先放到碎片文档中
                    !!o.elem && (o.elem = $$(o.elem)) && this._frag.appendChild(o.elem);
                    //修正样式,优先使用自定义元素的class
                    if (!!o.elem && o.elem.className) {
                        o.css = o.elem.className;
                    } else if (o.css === undefined) { o.css = ""; };
                    if (o.hover === undefined) { o.hover = o.css; };
                    if (o.active === undefined) { o.active = o.hover; };
                    //对菜单对象的_children集合排序(先按rank再按id排序)
                    o._children.sort(function (x, y) { return x.rank - y.rank || x.id - y.id; });
                });
            },
            //插入菜单
            _insertMenu: function (index, parent) {
                var container = this._containers[index];
                //如果是同一个父级菜单不用重复插入
                if (container._parent === parent) { return; };
                container._parent = parent;
                //把原有容器内菜单移到碎片对象中
                $$A.forEach(container._menus, function (o) { o._elem && this._frag.appendChild(o._elem); }, this);
                //重置子菜单对象集合
                container._menus = [];
                //把从父级菜单元素的子菜单对象集合获取的元素插入到容器
                $$A.forEach(this._menus[parent]._children, function (menu, i) {
                    this._checkMenu(menu, index);//检查菜单
                    container._menus.push(menu);//加入到容器的子菜单集合,方便调用
                    container.menu.appendChild(menu._elem);//菜单元素插入到容器
                }, this);
            },
            //检查菜单
            _checkMenu: function (menu, index) {
                //索引保存到菜单对象属性中,方便调用
                menu._index = index;
                //如果菜单对象没有元素
                if (!menu._elem) {
                    var elem = menu.elem;
                    //如果没有自定义元素的话创建一个
                    if (!elem) { elem = document.createElement(menu.tag); elem.innerHTML = menu.html; };
                    //设置property
                    $$.extend(elem, menu.property);
                    //设置attribute
                    var attribute = menu.attribute;
                    for (var att in attribute) { elem.setAttribute(att, attribute[att]); };
                    //设置样式
                    elem.className = menu.css;
                    //设置事件
                    menu._event = $$F.bindAsEventListener(this._hoverMenu, this, menu);//用于清除事件
                    $$E.addEvent(elem, "mouseover", menu._event);
                    //保存到菜单对象
                    menu._elem = elem;
                };
            },
            //触发菜单
            _hoverMenu: function (e, menu) {
                var elem = menu._elem;
                //如果是内部元素触发直接返回
                if ($$D.contains(elem, e.relatedTarget) || elem === e.relatedTarget) { return; };
                clearTimeout(this._timerMenu);
                //可能在多个容器间移动,所以全部容器都重新设置样式
                this._forEachContainer(function (o, i) {
                    if (o.pos.visibility === "hidden") { return; };
                    this._resetCss(o);
                    //设置当前菜单为active样式
                    var menu = o._active;
                    if (menu) { menu._elem.className = menu.active; };
                });
                //设置当前菜单为触发样式
                if (this._containers[menu._index]._active !== menu) { elem.className = menu.hover; };
                //触发显示菜单
                this._timerMenu = setTimeout($$F.bind(this._showMenu, this, menu), this.delay);
            },
            //显示菜单
            _showMenu: function (menu) {
                var index = menu._index, container = this._containers[index], child = !!menu._children.length;
                //隐藏不需要的容器
                this._forEachContainer(function (o, i) { i > index && this._hideContainer(o); });
                //重置当前容器_active
                container._active = null;
                //如果有子级菜单
                if (child) {
                    //设置当前容器_active
                    container._active = menu;
                    //显示下一级容器
                    index++;//设置索引
                    this._checkContainer(index);//检查容器
                    this._insertMenu(index, menu.id);//插入菜单
                    this._showContainer(menu);//显示容器
                };
                //重置当前容器的css
                this._resetCss(container);
                //设置当前菜单样式
                menu._elem.className = child ? menu.active : menu.hover;
            },
            //初始化容器(索引, 容器元素)
            _iniContainer: function (index, container) {
                var oContainer = container.pos;
                //重置属性
                this._resetContainer(container);
                //添加事件
                $$E.addEvent(oContainer, "mouseover", $$F.bind(function () { clearTimeout(this._timerContainer); }, this));
                $$E.addEvent(oContainer, "mouseout", $$F.bindAsEventListener(function (e) {
                    //先判断是否移出到所有容器之外
                    var elem = e.relatedTarget,
                        isOut = $$A.every(this._containers, function (o) { return o.pos == elem || !($$D.contains(o.pos, elem)); });
                    if (isOut) {
                        //清除定时器并隐藏
                        clearTimeout(this._timerContainer); clearTimeout(this._timerMenu);
                        this._timerContainer = setTimeout($$F.bind(this.hide, this), this.delay);
                    };
                }, this));
                //除了第一个容器外设置浮动样式
                if (index) {
                    $$D.setStyle(container.pos, {
                        position: "absolute", display: "block", margin: 0,
                        zIndex: this._containers[index - 1].pos.style.zIndex + 1//要后面的覆盖前面的
                    });
                };
                //ie6处理select
                if ($$B.ie6) {
                    var iframe = document.createElement("<iframe style='position:absolute;filter:alpha(opacity=0);display:none;'>");
                    document.body.insertBefore(iframe, document.body.childNodes[0]);
                    container._iframe = iframe;
                };
                //记录索引,方便调用
                container._index = index;
                //插入到容器集合
                this._containers[index] = container;
            },
            //检查容器
            _checkContainer: function (index) {
                if (index > 0 && !this._containers[index]) {
                    //如果容器不存在,根据前一个容器复制成新容器,第一个容器必须自定义
                    var pre = this._containers[index - 1].pos
                    //用了新的添加事件方式,没有ie的cloneNode的bug
                        , container = pre.parentNode.insertBefore(pre.cloneNode(false), pre);
                    //清除id防止冲突
                    container.id = "";
                    //初始化容器
                    this._iniContainer(index, { "pos": container, "menu": container });
                };
            },
            //显示容器
            _showContainer: function (menu) {
                var index = menu._index
                    , container = this._containers[index + 1].pos
                    , elem = menu.relContainer ? this._containers[index].pos : menu._elem
                    , pos = RelativePosition(elem, container, menu.relative);
                //执行显示前事件
                this.onBeforeShow(container, menu);
                //定位并显示容器
                $$D.setStyle(container, {
                    left: pos.Left + "px", top: pos.Top + "px", visibility: "visible"
                });
                //ie6处理select
                if ($$B.ie6) {
                    $$D.setStyle(this._containers[index + 1]._iframe, {
                         container.offsetWidth + "px",
                        height: container.offsetHeight + "px",
                        left: pos.Left + "px", top: pos.Top + "px",
                        display: ""
                    });
                };
            },
            //隐藏容器
            _hideContainer: function (container) {
                //设置隐藏
                $$D.setStyle(container.pos, { left: "-9999px", top: "-9999px", visibility: "hidden" });
                //重置上一个菜单的触发菜单对象
                this._containers[container._index - 1]._active = null;
                //ie6处理select
                if ($$B.ie6) { container._iframe.style.display = "none"; };
            },
            //重置容器对象属性
            _resetContainer: function (container) {
                container._active = null;//重置触发菜单
                container._menus = [];//重置子菜单对象集合
                container._parent = -1;//重置父级菜单id
            },
            //隐藏菜单
            hide: function () {
                this._forEachContainer(function (o, i) {
                    if (i === 0) {
                        //如果是第一个重设样式和_active
                        this._resetCss(o);
                    } else {//隐藏容器
                        this._hideContainer(o);
                    };
                });
            },
            //重设容器菜单样式
            _resetCss: function (container) {
                $$A.forEach(container._menus, function (o, i) { o._elem.className = o.css; }, this);
            },
            //历遍菜单对象集合
            _forEachMenu: function (callback) {
                for (var id in this._menus) { callback.call(this, this._menus[id], id, this._menus); };
            },
            //历遍容器对象集合
            _forEachContainer: function (callback) {
                $$A.forEach(this._containers, callback, this);
            },
            //添加自定义菜单
            add: function (menu) {
                this._custommenu = this._custommenu.concat(menu);
                this._iniMenu();
            },
            //修改自定义菜单
            edit: function (menu) {
                $$A.forEach($$A.isArray(menu) ? menu : [menu], function (o) {
                    //如果对应id的菜单存在
                    if (o.id && this._menus[o.id]) {
                        //从自定义菜单中找出对应菜单,并修改
                        $$A.every(this._custommenu, function (m, i) {
                            if (m.id === o.id) {
                                this._custommenu[i] = $$.deepextend(m, o); return false;
                            };
                            return true;
                            //用every可以跳出循环
                        }, this);
                    };
                }, this);
                this._iniMenu();
            },
            //删除自定义菜单
            del: function () {
                var ids = Array.prototype.slice.call(arguments);
                this._custommenu = $$A.filter(this._custommenu, function (o) {
                    return $$A.indexOf(ids, o.id) === -1;
                });
                this._iniMenu();
            }
        };

    </script>
</head>
<body>
    <div id="WriteDiv"></div>
    <style type="text/css">
        .container1 {
            height: 30px;
        }

            .container1 div {
                float: left;
            }

            .container1 div, .container1_2 div {
                width: 100px;
                background: #FAFCFD;
                border: 1px solid #5c9cc0;
                padding: 10px;
            }

        div.on1 {
            font-weight: bold;
            background: #EEF3F7;
        }

        div.on1_2 {
            font-weight: bold;
            background: #fffff7;
            border: 1px solid #ffcc00;
        }
    </style>
    菜单使用演示:
    <br>
    <br>
    <div id="idContainer1" class="container1"></div>
    <div id="idContainer1_2" class="container1_2"></div>
    <br>
    <select>
        <option>-------------test-------------</option>
    </select>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <input id="idEdit" type="button" value="添加菜单 +" />
    位置:
    <select id="idRank">
        <option value="3">第四个 </option>
        <option value="2">第三个</option>
        <option value="1">第二个 </option>
        <option value="0">第一个 </option>
    </select>
    <select id="idDelay">
        <option value="1000">1秒</option>
        <option value="500">0.5秒 </option>
        <option value="200" selected>0.2秒 </option>
        <option value="0">不延时 </option>
    </select>
    <script>

        var menu = [
            { id: 1, parent: 0, html: '自定义样式', hover: "on1_2", rank: 1 },
            { id: 2, parent: 0, html: '下拉菜单', active: "on1_2", rank: 2 },
            { id: 3, parent: 0, html: '任意定位', relative: { align: "left" }, rank: 3 },

            { id: 11, parent: 1, html: '点击关闭', hover: "on1_2", property: { onclick: function () { fm.hide(); } } },

            { id: 21, parent: 2, html: '相对容器', active: "on1_2", relContainer: true },
            { id: 22, parent: 2, html: '相对菜单', active: "on1_2", relative: { align: "right", vAlign: "clienttop" } },
            { id: 23, parent: 21, html: '三级菜单' },
            { id: 24, parent: 21, html: '三级菜单' },
            { id: 25, parent: 22, html: '三级菜单' },
            { id: 26, parent: 22, html: '三级菜单' },

            { id: 31, parent: 3, html: '无法到达的', relative: { align: "left" } },
            { id: 32, parent: 31, html: '目光', relative: { align: "right" } },
            { id: 33, parent: 32, html: '无法到达的', relative: { align: "right", vAlign: "top" } },
            { id: 34, parent: 33, html: '到达', relative: { percentTop: 100 } },
            { id: 35, parent: 34, html: '到达', relative: { align: "left", vAlign: "clienttop", percentLeft: -100 } },
            { id: 36, parent: 35, html: '梦想', relative: { vAlign: "top" } },
            { id: 37, parent: 36, html: '目光', relative: { vAlign: "top", percentTop: -100 } },
            { id: 38, parent: 37, html: '脚步', relative: { align: "right", vAlign: "clienttop", percentLeft: 100 } },
            { id: 39, parent: 38, html: '地方', relative: { percentTop: 100 } },
            { id: 40, parent: 39, html: '地方', relative: { align: "left" } },
            { id: 41, parent: 40, html: '可以', relative: { vAlign: "top", percentTop: -100 } },
            { id: 42, parent: 41, html: '可以' }

        ];

        var fm = new FixedMenu(["idContainer1", "idContainer1_2"], { hover: "on1", menu: menu });

        //编辑测试
        $$("idEdit").onclick = function () {
            if (this.value == "添加菜单 +") {
                fm.add([
                    { id: 100, parent: 0, html: '新加菜单+', rank: $$("idRank").value | 0 },
                    { id: 101, parent: 100, html: '新加菜单++' },
                    { id: 102, parent: 100, html: '新加菜单+++' }
                ]);
                this.value = "删除菜单 -"
            } else {
                fm.del(100, 101, 102);
                this.value = "添加菜单 +"
            }
        }

        //延时测试
        $$("idDelay").onchange = function () { fm.Delay = this.value | 0; }

    </script>
    <br>
    <br>
    仿京东商城商品分类菜单:
    <br>
    <br>
    <style type="text/css">
        .container2, .container2 dd, .container2_2 dl, .container2_2 dd {
            margin: 0;
        }

        .container2 {
            font-size: 14px;
            width: 190px;
            border: 1px solid #cf2020;
            background: #fffff5;
            padding: 5px 8px;
            line-height: 30px;
            color: #333;
        }

            .container2 dt {
                font-weight: bold;
                color: #cf2020;
            }

            .container2 dd {
                background: url(http://images.cnblogs.com/cnblogs_com/cloudgamer/143727/n4.jpg) 180px 10px no-repeat;
                _zoom: 1;
            }

        .container2_2 {
            background-color: #bebec3;
            display: none;
        }

            .container2_2 dl {
                font-size: 14px;
                width: 200px;
                border: 1px solid #969696;
                background: #fff;
                position: relative;
                left: -3px;
                top: -3px;
            }

            .container2_2 dd div {
                padding: 5px 20px;
                background: url(http://images.cnblogs.com/cnblogs_com/cloudgamer/143727/n4.jpg) 6px 7px no-repeat;
                _zoom: 1;
            }

            .container2_2 dt, .shadow {
                padding: 0 5px;
                position: absolute;
                background: #fff;
                border: 1px solid #969696;
                border-right: 0;
                width: 169px;
                left: -180px;
                top: -1px;
                height: 24px;
                line-height: 24px;
            }

        .shadow {
            background-color: #bebec3;
            border-color: #bebec3;
            top: 0;
        }

        .container2_2 a {
            display: block;
            _zoom: 1;
        }

            .container2_2 a:link, .container2_2 a:visited, .container2_2 a:active {
                color: #333;
                text-decoration: none;
            }

            .container2_2 a:hover {
                color: #ff6026;
                text-decoration: underline;
            }
    </style>
    <dl id="idContainer2" class="container2">
        <dt id="idMenu2_1">图片动画</dt>
        <dd id="idMenu2_2">图片效果</dd>
        <dd id="idMenu2_3">动画效果</dd>
        <dt id="idMenu2_51">系统其他</dt>
        <dd id="idMenu2_52">系统效果</dd>
        <dd id="idMenu2_53">其他效果</dd>
    </dl>
    <div id="idContainer2_2" class="container2_2">
        <div class="shadow"></div>
        <dl>
            <dt id="idTitle"></dt>
            <dd id="idMenu2">
                <div id="idMenu2_11"><a href="http://www.cnblogs.com/cloudgamer/archive/2008/07/06/SlideTrans.html">图片滑动切换效果</a></div>
                <div id="idMenu2_12"><a href="http://www.cnblogs.com/cloudgamer/archive/2008/05/23/1205642.html">图片变换效果(ie only)</a></div>
                <div id="idMenu2_13"><a href="http://www.cnblogs.com/cloudgamer/archive/2008/05/13/1194272.html">图片滑动展示效果</a></div>
                <div id="idMenu2_14"><a href="http://www.cnblogs.com/cloudgamer/archive/2008/07/21/ImgCropper.html">图片切割效果</a></div>
                <div id="idMenu2_21"><a href="http://www.cnblogs.com/cloudgamer/archive/2009/01/06/Tween.html">Tween算法及缓动效果</a></div>
                <div id="idMenu2_22"><a href="http://www.cnblogs.com/cloudgamer/archive/2008/08/27/1277131.html">渐变效果</a></div>
                <div id="idMenu2_61"><a href="http://www.cnblogs.com/cloudgamer/archive/2008/10/20/1314766.html">无刷新多文件上传系统</a></div>
                <div id="idMenu2_62"><a href="http://www.cnblogs.com/cloudgamer/archive/2008/10/05/ImgCropper_sys.html">图片切割系统</a></div>
                <div id="idMenu2_71"><a href="http://www.cnblogs.com/cloudgamer/archive/2008/11/17/Drag.html">拖放效果</a></div>
                <div id="idMenu2_72"><a href="http://www.cnblogs.com/cloudgamer/archive/2008/12/03/Resize.html">拖拉缩放效果</a></div>
                <div id="idMenu2_73"><a href="http://www.cnblogs.com/cloudgamer/archive/2008/12/24/Slider.html">滑动条效果</a></div>
            </dd>
        </dl>
    </div>
    <script>

        var menu2 = [
            { id: 1, parent: 0, elem: 'idMenu2_1' },

            { id: 2, parent: 0, elem: 'idMenu2_2' },
            { id: 3, parent: 0, elem: 'idMenu2_3' },

            { id: 11, parent: 2, elem: 'idMenu2_11' },
            { id: 12, parent: 2, elem: 'idMenu2_12' },
            { id: 13, parent: 2, elem: 'idMenu2_13' },
            { id: 14, parent: 2, elem: 'idMenu2_14' },

            { id: 21, parent: 3, elem: 'idMenu2_21' },
            { id: 22, parent: 3, elem: 'idMenu2_22' },

            { id: 51, parent: 0, elem: 'idMenu2_51' },

            { id: 52, parent: 0, elem: 'idMenu2_52' },
            { id: 53, parent: 0, elem: 'idMenu2_53' },

            { id: 61, parent: 52, elem: 'idMenu2_61' },
            { id: 62, parent: 52, elem: 'idMenu2_62' },

            { id: 71, parent: 53, elem: 'idMenu2_71' },
            { id: 72, parent: 53, elem: 'idMenu2_72' },
            { id: 73, parent: 53, elem: 'idMenu2_73' }
        ];

        var container2 = ["idContainer2", { id: "idContainer2_2", menu: "idMenu2" }];

        new FixedMenu(container2, {
            menu: menu2,
            relative: { align: "clientleft", vAlign: "clienttop", customTop: 5, customLeft: 176 },
            onBeforeShow: function (container, menu) { $$("idTitle").innerHTML = menu._elem.innerHTML; }
        });

    </script>
    <br>
    仿window xp右键菜单: 
    <br>
    <style type="text/css">
        .container3 {
            font-size: 12px;
            border: 1px solid #9d9da1;
            padding: 3px;
            line-height: 18px;
            background: #FFF;
            cursor: default;
            -moz-user-select: none;
            _overflow: hidden;
        }

            .container3 div {
                padding: 0 20px;
            }

        .menu3_1 {
            color: #aca899;
            _zoom: 1;
        }

        .menu3_2 {
            background: url(http://images.cnblogs.com/cnblogs_com/cloudgamer/169629/o_menu.gif) 133px 0 no-repeat;
        }

        .menu3_2_on {
            background-position: 133px -18px;
        }

        .menu3_3 {
            background: url(http://images.cnblogs.com/cnblogs_com/cloudgamer/169629/o_menu.gif) left -36px no-repeat;
        }

        .menu3_3_on {
            background-position: left -54px;
        }

        .menu3_4 {
            background: url(http://images.cnblogs.com/cnblogs_com/cloudgamer/169629/o_menu.gif) left -72px no-repeat;
        }

        .menu3_4_on {
            background-position: left -90px;
        }

        .line3 {
            border-bottom: 1px solid #aca899;
            _font-size: 0;
            margin: 4px 0;
        }

        .on3 {
            background-color: #316ac5;
            color: #FFF;
        }

        .area3 {
            width: 500px;
            height: 200px;
            border: 1px solid #aca899;
        }

        .pos3 {
            position: absolute;
            display: none;
            width: 150px;
        }
    </style>
    <div id="idArea" class="area3"></div>
    <div id="idContainer3" class="container3 pos3"></div>
    <div id="idContainer3_2" class="container3"></div>
    <script>

        var menu3 = [
            { id: 1, parent: 0, html: '查看(<u>V</u>)' },
            { id: 2, parent: 0 },
            { id: 3, parent: 0, html: '排列图标(<u>I</u>)' },
            { id: 4, parent: 0, html: '刷新(<u>E</u>)' },
            { id: 5, parent: 0 },
            { id: 6, parent: 0, html: '自定义文件夹(<u>F</u>)...' },
            { id: 7, parent: 0 },
            { id: 8, parent: 0, html: '粘贴(<u>P</u>)' },

            { id: 9, parent: 0, html: '粘贴快捷方式(<u>S</u>)' },
            { id: 10, parent: 0 },
            { id: 11, parent: 0, html: '新建(<u>P</u>)' },
            { id: 12, parent: 0 },
            { id: 13, parent: 0, html: '属性(<u>S</u>)' },

            { id: 21, parent: 1, html: '缩略图(<u>H</u>)' },
            { id: 22, parent: 1, html: '平铺(<u>S</u>)', css: "menu3_3", hover: "menu3_3 menu3_3_on on3" },
            { id: 23, parent: 1, html: '图标(<u>N</u>)' },
            { id: 24, parent: 1, html: '列表(<u>L</u>)' },
            { id: 25, parent: 1, html: '详细信息(<u>D</u>)' },

            { id: 31, parent: 3, html: '名称(<u>N</u>)', css: "menu3_3", hover: "menu3_3 menu3_3_on on3" },
            { id: 32, parent: 3, html: '类型(<u>S</u>)' },
            { id: 33, parent: 3, html: '大小(<u>T</u>)' },
            { id: 34, parent: 3, html: '修改时间(<u>M</u>)' },
            { id: 35, parent: 3 },
            { id: 36, parent: 3, html: '按组排列(<u>G</u>)', css: "menu3_4", hover: "menu3_4 menu3_4_on on3" },
            { id: 37, parent: 3, html: '自动排列(<u>A</u>)' },
            { id: 38, parent: 3, html: '对齐到网格(<u>L</u>)' },

            { id: 41, parent: 11, html: 'AlertBox 弹出层效果', href: "http://www.cnblogs.com/cloudgamer/archive/2010/10/11/AlertBox.html" },
            { id: 42, parent: 11, html: '图片3D展示空间', href: "http://www.cnblogs.com/cloudgamer/archive/2010/09/20/Image3D.html" },
            { id: 43, parent: 11, html: '图片变换效果', href: "http://www.cnblogs.com/cloudgamer/archive/2010/08/16/ImageTrans.html" },
            { id: 44, parent: 11, html: '图片滑动展示效果', href: "http://www.cnblogs.com/cloudgamer/archive/2010/07/29/SlideView.html" }
        ];

        $$A.forEach(menu3, function (menu) {
            var id = menu.id | 0;
            switch (id) {
                case 1:
                case 3:
                case 11://有下级菜单
                    menu.css = "menu3_2"; menu.hover = "menu3_2 menu3_2_on on3"; break;
                case 2:
                case 5:
                case 7:
                case 10:
                case 12:
                case 35://分割线
                    menu.css = menu.hover = "line3"; break;
                case 8:
                case 9://不能选择
                    menu.css = menu.hover = "menu3_1"; break;
                case 4://刷新
                    menu.property = { onmouseup: function () { location.reload(); } }; break;
                case 21:
                case 22:
                case 23:
                case 24:
                case 25://"查看"子菜单
                    menu.property = { onmouseup: function () { Select([21, 22, 23, 24, 25], id, "menu3_3", "menu3_3 menu3_3_on on3"); } }; break;
                case 31:
                case 32:
                case 33:
                case 34://"排列图标"子菜单1
                    menu.property = { onmouseup: function () { Select([31, 32, 33, 34], id, "menu3_3", "menu3_3 menu3_3_on on3"); } }; break;
                case 36:
                case 37:
                case 38://"排列图标"子菜单2
                    menu.property = { onclick: function () { Select([36, 37, 38], id, "menu3_4", "menu3_4 menu3_4_on on3"); } }; break;
                case 41:
                case 42:
                case 43:
                case 44:
                    menu.property = { onclick: function () { location.href = menu.href; } }; break;
            }
        });


        var fm3 = new FixedMenu(["idContainer3", "idContainer3_2"], {
            menu: menu3, delay: 0, hover: "on3",
            relative: { align: "right", vAlign: "clienttop", customTop: -4, customLeft: -2, adaptive: true, reset: true }
        });

        var area = $$("idArea"), container3 = $$("idContainer3"), container3_2 = $$("idContainer3_2");

        function Hide() {
            fm3.hide(); container3.style.display = "none";
        }

        function Select(group, id, css, hover) {
            Hide();
            var menu = [];
            $$A.forEach(group, function (i) {
                i !== id && menu.push({ "id": i, "css": "", "hover": "on3" });
            });
            menu.push({ "id": id, "css": css, "hover": hover });
            fm3.edit(menu);
        }

        $$E.addEvent(area, "contextmenu", function (e) {
            with (container3.style) {
                left = e.pageX + "px"; top = e.pageY + "px"; display = "block";
            }
            e.preventDefault();
        });

        container3.oncontextmenu = container3_2.oncontextmenu = function (e) { $$E.fixEvent(e).preventDefault(); }
        container3.onselectstart = container3_2.onselectstart = function () { return false; }//ie chrome safari
        $$E.addEvent(container3, "mouseup", function (e) { e.stopPropagation(); });
        $$E.addEvent(document, "mouseup", Hide);
        $$E.addEvent(window, "blur", Hide);

    </script>
    <br>
    仿淘宝拼音索引菜单:
    <br>
    <br>
    <style type="text/css">
        .container4 li, .container4_2 li {
            list-style: none;
        }

        .container4 ul, .container4_2 {
            margin: 0;
        }

        .container4 {
            width: 350px;
            padding: 7px 10px;
            font: 12px Verdana;
            border: 1px solid #ccc;
            background: #fffeed;
            line-height: 15px;
            height: 15px;
            _overflow: hidden;
        }

            .container4 li {
                float: left;
                padding: 0 10px;
                border-right: 1px solid #ccc;
            }

            .container4 div {
                float: left;
                color: #000;
                padding-right: 10px;
            }

        li.menu4 {
            position: relative;
            margin-left: -1px;
            top: -1px;
            z-index: 9999;
            border: 1px solid #85ccff;
            border-bottom: 0;
            padding-bottom: 8px;
            color: #ff6026;
            background: #dbf3ff;
        }

        .container4_2 {
            width: 350px;
            padding: 10px;
            border: 1px solid #85ccff;
            background: #dbf3ff;
            line-height: 25px;
            font-size: 14px;
            font-weight: bold;
            display: none;
        }

            .container4_2 a {
                display: block;
                _zoom: 1;
            }

                .container4_2 a:link, .container4_2 a:visited, .container4_2 a:active {
                    color: #565553;
                    text-decoration: none;
                }

                .container4_2 a:hover {
                    color: #ff5500;
                    text-decoration: underline;
                }

        .container4 a:link, .container4 a:visited, .container4 a:hover, .container4 a:active {
            color: #565553;
            text-decoration: none;
        }

        .menu4 a:link, .menu4 a:visited, .menu4 a:active {
            color: #ff6026;
        }

        .menu4 a:hover {
            color: #ff6026;
            text-decoration: underline;
        }
    </style>
    <div id="idContainer4" class="container4">
        <div><b>Tag索引</b></div>
        <ul id="idMenu4">
            <li id="idMenu4_1"><a href="http://www.cnblogs.com/cloudgamer/tag/Table/">Table</a></li>
            <li id="idMenu4_2"><a href="http://www.cnblogs.com/cloudgamer/tag/Fixed/">Fixed</a></li>
            <li id="idMenu4_3"><a href="http://www.cnblogs.com/cloudgamer/tag/Color/">Color</a></li>
            <li id="idMenu4_4"><a href="http://www.cnblogs.com/cloudgamer/tag/Date/">Date</a></li>
            <li id="idMenu4_5"><a href="http://www.cnblogs.com/cloudgamer/tag/Select/">Select</a></li>
        </ul>
    </div>
    <ul id="idContainer4_2" class="container4_2">
        <li id="idMenu4_11"><a href="http://www.cnblogs.com/cloudgamer/archive/2009/05/18/TableFixed.html">Table行定位效果</a></li>
        <li id="idMenu4_12"><a href="http://www.cnblogs.com/cloudgamer/archive/2008/10/06/TableOrder.html">Table排序</a></li>
        <li id="idMenu4_21"><a href="http://www.cnblogs.com/cloudgamer/archive/2009/07/07/FixedTips.html">浮动定位提示效果</a></li>
        <li id="idMenu4_22"><a href="http://www.cnblogs.com/cloudgamer/archive/2008/09/15/1290954.html">仿LightBox内容显示效果</a></li>
        <li id="idMenu4_31"><a href="http://www.cnblogs.com/cloudgamer/archive/2009/03/11/color.html">颜色梯度和渐变效果</a></li>
        <li id="idMenu4_41"><a href="http://www.cnblogs.com/cloudgamer/archive/2008/08/23/1274459.html">blog式日历控件</a></li>
        <li id="idMenu4_42"><a href="http://www.cnblogs.com/cloudgamer/archive/2008/10/28/1040403.html">日期联动选择器</a></li>
        <li id="idMenu4_51"><a href="http://www.cnblogs.com/cloudgamer/archive/2008/06/24/1228736.html">多级联动select</a></li>
    </ul>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <script>

        var menu4 = [
            { id: 1, parent: 0, elem: 'idMenu4_1', active: "menu4" },
            { id: 2, parent: 0, elem: 'idMenu4_2', active: "menu4" },
            { id: 3, parent: 0, elem: 'idMenu4_3', active: "menu4" },
            { id: 4, parent: 0, elem: 'idMenu4_4', active: "menu4" },
            { id: 5, parent: 0, elem: 'idMenu4_5', active: "menu4" },

            { id: 11, parent: 1, elem: 'idMenu4_11' },
            { id: 12, parent: 1, elem: 'idMenu4_12' },

            { id: 21, parent: 2, elem: 'idMenu4_21' },
            { id: 22, parent: 2, elem: 'idMenu4_22' },

            { id: 31, parent: 3, elem: 'idMenu4_31' },

            { id: 41, parent: 4, elem: 'idMenu4_41' },
            { id: 42, parent: 4, elem: 'idMenu4_42' },

            { id: 51, parent: 5, elem: 'idMenu4_51' }
        ];

        new FixedMenu([{ id: "idContainer4", menu: "idMenu4" }, "idContainer4_2"], {
            menu: menu4, relContainer: true,
            relative: { align: "clientleft", vAlign: "bottom", customTop: -1 }
        });

    </script>
</body>
</html>

原文来自:

http://www.cnblogs.com/cloudgamer/archive/2009/10/29/Cloudgamer_JavaScript_Library.html

http://www.cnblogs.com/cloudgamer/archive/2009/08/10/FixedMenu.html

原文地址:https://www.cnblogs.com/wzq806341010/p/3142479.html