• 使用javascript oop开发滑动(slide) 菜单控件


    这里使用原生的javascript,用面向对象的方式创建一个容易维护使用方便的滑动菜单,调用方式如下:

    var $sliding = document.getElementById("silding");
    var s1 = new Sliding();
    s1.commands 
    = $sliding.getElementsByTagName("dt");
    s1.panels 
    = $sliding.getElementsByTagName("dd"); ;
    s1.init(
    "mouseover""active");

    演示代码分为slide.js和slide.html两个文件

     slide.htm:

    代码
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>javascript slide控件演示</title>
    <style type="text/css">
        
    /*reset*/
        dl,ul,li,dt,dd
    { margin:0; padding:0; list-style:none; }
        
    /*silding*/
        .silding
    { width:200px; border:1px solid #ccc; line-height:25px; overflow:hidden;}
        .silding dt
    {border-bottom:1px solid #ccc; background-color:#bebebe; cursor:pointer}
        .silding dd
    { display:none; background:#efefef; overflow:hidden; font-size:12px; }
        .silding .active
    { font-weight:bold;}
    </style>
    <script type="text/javascript" src="slide.js"></script>
    </head>

    <body>
    <div id="silding" class="silding">
        
    <dl>
            
    <dt class="active">第一个一级菜单</dt>
               
    <dd style="display:block;">
                
    <ul>
                    
    <li><href="#">第一个二级菜单</a></li>
                    
    <li>第一个二级菜单</li>
                    
    <li>第一个二级菜单</li>
                
    </ul>
            
    </dd>
       
    </dl>
        
    <dl>
            
    <dt>第二个一级菜单</dt>
               
    <dd>
                
    <ul>
                    
    <li>第二个二级菜单</li>
                    
    <li>第二个二级菜单</li>
                    
    <li>第二个二级菜单</li>
                
    </ul>
            
    </dd>
       
    </dl>
        
    <dl>
            
    <dt>第三个一级菜单</dt>
               
    <dd>
                
    <ul>
                    
    <li>第三个二级菜单</li>
                    
    <li>第三个二级菜单</li>
                    
    <li>第三个二级菜单</li>
                
    </ul>
            
    </dd>
       
    </dl>
    </div>
    <script type="text/javascript">
        
    var $sliding = document.getElementById("silding");
        
    var s1 = new Sliding();
        s1.commands 
    = $sliding.getElementsByTagName("dt");
        s1.panels 
    = $sliding.getElementsByTagName("dd"); ;
        s1.init(
    "mouseover""active");
    </script>
    </body>
    </html>

    slide.js:

    代码

        
    function Slider(i, panelHeight) { //dto
            this.index = i;
            
    this.panelHeight = panelHeight;
        }
        
     
    //class  Sliding {
        function Sliding(activeIndex) {
            
    this.commands = [];
            
    this.panels = [];
            
    this.activeIndex = activeIndex || 0;
            
    this.sliderCache = {};
        }
        Sliding.prototype 
    = {
            
    //绑定事件
            init: function(eventName, activeCssClass) {
                
    var _this = this;
                
    var cmds = _this.commands;
                _this.activeClass 
    = activeCssClass;
                
    for (var i = 0, n = cmds.length; i < n; i++) {
                    cmds[i][
    "on" + eventName] = function(e) {
                        _this.handel(
    this, e);
                    }
                    cmds[i].index 
    = i;
                    
    if (i == _this.activeIndex) {
                        _this.sliderCache 
    = new Slider(i, _this.panels[i].offsetHeight);
                    }
                }


            },
            
    //事件处理函数
            handel: function(elem, args) {
                
    var _this = this;
                
    var index = elem.index;
                
    var cacheIndex = _this.sliderCache.index;
                
    var cacheElem =  _this.commands[cacheIndex];
                
    if (index == cacheIndex) return;
                
    var showPanel = _this.panels[index];
                
    var hidePanel = _this.panels[cacheIndex];
                
    var h = parseInt(_this.sliderCache.panelHeight);
                showPanel.style.height 
    = "0px";
                showPanel.style.display 
    = "block";
                _this.tween(hidePanel, showPanel, h);
                elem.className 
    = _this.activeClass;
                cacheElem.className 
    = cacheElem.className.replace(eval("/ ?"+_this.activeClass+" ?/"),"");
                _this.sliderCache 
    = new Slider(index, h);

            },
            
    //动画算法
            tween: function(obj0, obj1, h) {
                _this 
    = arguments.callee;
                
    var step = 20;
                
    if ("\v" == "v") {
                    step 
    = 30;
                }
                
    if (h > 0) {
                    
    var h0 = obj0.offsetHeight;
                    
    var h1 = obj1.offsetHeight;
                    
    if (h < step) {
                        obj0.style.display 
    = "none";
                        obj0.style.height 
    = (h1 + h) + "px";
                        obj1.style.height 
    = (h1 + h) + "px";

                    } 
    else {
                        h 
    = h - step;
                        obj0.style.height 
    = (h0 - step) + "px";
                        obj1.style.height 
    = (h1 + step) + "px";
                        setTimeout(
    function() {
                            _this(obj0, obj1, h)
                        },
                        
    50)
                    }
                }
            }
        }
    //}    

     上面就所有代码了这里因为是演示所以让HTML CSS尽量的简化,另外使用jquery的 fn.slideUp fn.slideDown 实现起来会更容易不过我作为一个专业的开发者多了解些原生的JS对技术的提高还是很有帮助。

  • 相关阅读:
    kafka副本
    kafka消息丢失
    kafka消费者
    RN8302b调试笔记
    MDK #pragma anon_unions
    [Python笔记]Strip
    [Python笔记]AnyAll
    [Python笔记]元组
    [Python笔记]列表
    嵌入式平台移植Python
  • 原文地址:https://www.cnblogs.com/rentj1/p/1805024.html
Copyright © 2020-2023  润新知