1. 论坛系统升级为Xenforo,欢迎大家测试!
    排除公告

[新鲜出炉] 简单的弹出菜单

本帖由 Function2006-03-30 发布。版面名称:前端开发

  1. Function

    Function New Member

    注册:
    2006-03-24
    帖子:
    3,884
    赞:
    5
    演示:http://www.purewhite.cn/demo/20060330001/

    源代码如下:

    HTML:
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>菜单</title>
    <style type="text/css">
    .menu {
        font-size: 12px;
        position: absolute;
        width: 70px;
        visibility: hidden;
        top: 0px;
        left: 0px;
        border: 1px solid #6588ba;
        background-color: #fff;
        padding: 1px;
        text-align: left;
    }
    .menu ul {
    	padding: 0;
    	margin: 0;
        list-style: none;
    }
    .menu li {
        padding: 2px;
    }
    .menu a {
        text-decoration: none;
        display: block;
    	padding: 1px;
    }
    .menu a:link, .menu a:visited {
        color: #000;
    	background: #fff;
    }
    .menu a:hover, .menu a:active {
        color: #fff;
    	background: #6588ba;
    }
    </style>
    <script language="javascript" type="text/javascript">
    var oMenu;    //    全局变量,菜单
    
    function showMenu(obj, menuID)
    {
        oMenu = document.getElementById("menu_" + menuID);
        oMenu.style.left = findPosX(obj) + "px";
    	oMenu.style.top = findPosY(obj) + obj.offsetHeight + "px";
    	oMenu.style.visibility = "visible";
    }
    
    function hideMenu()
    {
        if (oMenu) { 
            oMenu.style.visibility = 'hidden';
        }
    }
    
    function findPosX(obj)
    {
        var iPosLeft = 0;
        while (obj.offsetParent)
        {
            iPosLeft += obj.offsetLeft;
            obj = obj.offsetParent;
        }
        return iPosLeft;
    }
    
    function findPosY(obj)
    {
        var iPosTop = 0;
        while (obj.offsetParent)
        {
            iPosTop += obj.offsetTop;
            obj = obj.offsetParent;
        }
        return iPosTop;
    }
    </script>
    </head>
    
    <body>
    <img src="http://bbs.chinahtml.com/images/misc/vbulletin3_logo_white.gif" width="180" height="60" alt="ChinaHTML Logo" onclick="showMenu(this, 1);" />
    
    <div class="menu" id="menu_1">
      <ul>
        <li><a href="#" onclick="hideMenu();">菜单一</a></li>
    	<li><a href="#" onclick="hideMenu();">菜单二</a></li>
    	<li><a href="#" onclick="hideMenu();">菜单三</a></li>
    	<li><a href="#" onclick="hideMenu();">菜单四</a></li>
    	<li><a href="javascript: hideMenu();">关闭</a></li>
      </ul>
    </div>
    </body>
    </html>
    原理分析:

    通过图片的位置,来定位菜单的显示位置。

    findPosX() 和 findPosY() 通过递归的方式来计算当前对象在文档中 X 和 Y 坐标。

    offsetHeight 确定当前对象的高度,使菜单在当前对象上产生向下的 Y 坐标偏移。

    其它的,就是通过设置菜单的 visibility 属性来控制菜单的显隐。
     
    #1 Function, 2006-03-30
    由版主最后编辑: 2006-04-24
  2. BoBo

    BoBo New Member

    注册:
    2005-09-29
    帖子:
    929
    赞:
    0
    这个好,谢谢
     
  3. Function

    Function New Member

    注册:
    2006-03-24
    帖子:
    3,884
    赞:
    5
    要让菜单出现滚动条,模拟下拉选择,可以设置菜单高度,并且设置 X 和 Y 向的溢出。例如:

    代码:
    .menu {
        font-size: 12px;
        position: absolute;
        width: 70px;
        height: 100px;
        visibility: hidden;
        top: 0px;
        left: 0px;
        border: 1px solid #6588ba;
        background-color: #fff;
        padding: 1px;
        text-align: left;
        overflow-y: scroll;
        overflow-x: hidden;
    }
     
  4. BoBo

    BoBo New Member

    注册:
    2005-09-29
    帖子:
    929
    赞:
    0
    我改了个东西,看看适合不

    我想来想去都觉得不太合理,不过又可以用:lol:


    代码:
    var oMenu;    //    全局变量,菜单
    var state=true;
    
    function showMenu(obj, menuID)
    {
        oMenu = document.getElementById("menu_" + menuID);
        oMenu.style.left = findPosX(obj);
    	oMenu.style.top = findPosY(obj) + obj.offsetHeight;
    	oMenu.style.visibility = "visible";
    	if (oMenu && state) {
    		oMenu.style.visibility = 'visible';
    		state=false;
    	} else {
    		oMenu.style.visibility = 'hidden';
    		state=true;
    	}
    }
    
    function hideMenu()
    {
        if (oMenu) {
    		oMenu.style.visibility = 'hidden';
        }
    }
     
  5. 一路走

    一路走 New Member

    注册:
    2005-11-05
    帖子:
    2,933
    赞:
    18
    为什么我复制下去,出来的弹出选项却是乱码呢
     
  6. Function

    Function New Member

    注册:
    2006-03-24
    帖子:
    3,884
    赞:
    5
    编码问题。使用文本编辑器,保存为 UTF-8 编码。通常默认的是 ANSI 。
     
  7. Function

    Function New Member

    注册:
    2006-03-24
    帖子:
    3,884
    赞:
    5
    代码:
     
    
    你加上 state 的用意是判断菜单原本是显示还是隐藏的,这个想法是正确的。
    
    其实在显示菜单前,可以先调用 hideMenu() ,这样就不管菜单原本是显示还是隐藏的,都先隐藏掉,然后再显示。
     
  8. 2699

    2699 New Member

    注册:
    2005-09-04
    帖子:
    77
    赞:
    2
    不错!
     
  9. 枕云

    枕云 New Member

    注册:
    2005-10-03
    帖子:
    79
    赞:
    0
    收藏  
     
  10. OUYANG

    OUYANG New Member

    注册:
    2005-09-06
    帖子:
    3,025
    赞:
    5
    本贴收藏
     
  11. yjlrwmqj

    yjlrwmqj New Member

    注册:
    2005-09-06
    帖子:
    112
    赞:
    1
    点了才有
    没点的还以为没有呢
    应该搞成鼠标滑过
     
  12. Function

    Function New Member

    注册:
    2006-03-24
    帖子:
    3,884
    赞:
    5
    鼠标滑过,将 onclick 行为改成 onmouseover 即可。

    实现的是思路,具体应用需要结合实际需要。
     
  13. swenge

    swenge New Member

    注册:
    2005-11-28
    帖子:
    386
    赞:
    1
    很像腾讯那个
     
  14. azha

    azha New Member

    注册:
    2006-03-31
    帖子:
    38
    赞:
    0
    感谢,终于找到了,顶一下,收藏
     
  15. cody

    cody New Member

    注册:
    2006-01-11
    帖子:
    291
    赞:
    1
    强悍啊!

    支持学习先,再来收藏起来!
     
  16. BoBo

    BoBo New Member

    注册:
    2005-09-29
    帖子:
    929
    赞:
    0
    FIREFOX上不管用了
     
  17. 不学无术

    不学无术 Ulysses 的元神

    注册:
    2005-08-31
    帖子:
    16,714
    赞:
    39
    我这里看了挺管用。