美文网首页让前端飞Web 前端开发
自定义完成一个滑动左菜单

自定义完成一个滑动左菜单

作者: 顽皮的雪狐七七 | 来源:发表于2018-01-16 17:45 被阅读73次

    很久没有发文章了,因为最近学的东西比较碎,总是想发一些完整的东西。
    但是后来经过反思,学习是日积月累的,尤其是最近很多基础的东西忘记的时候,可以来简书上翻一翻,多好。
    所以就开始来这里就算是零碎的东西,也慢慢地写上去。

    最近做了一个左边的滑动菜单。结构简单,所以就发布上来分享一下:

    目录

    • 成品展示
      • 需求分析
      • 技术采纳
      • 代码实现
        • html布局
        • css样式
        • js实现动画

    成品展示

    首先看看完成的截图:

    展开前的:


    自定义完成一个滑动左菜单

    展开后的:


    自定义完成一个滑动左菜单

    需求分析

    适用于三级目录,使用的技术是html5,css3,jquery。
    一级目录默认是展开的,三角形是朝下的。
    二级目录默认是折叠的,三角形是朝右的。
    三级目录前面是没有三角的,点击会执行别的命令。
    每一级目录都比前一级目录进行缩进一部分距离。
    如果超出了就用滚动条进行滚动。

    技术采纳

    1. 使用了rem的布局思路(这个具体以后会讲到,其实小白可以直接写成px)
    2. 三级目录和这样层层嵌套,我就想起了dl,dt,dd的布局模式。因为尽可能不要用div去做所有的布局,这样的话,因为dt是dd的标题,dd是内容。dd标签里面再进行ul和li的嵌套,生成三级目录不错
    3. 里面的图标,使用i标签和b标签比较好,因为这些在html5之后就失去了斜体和粗体的意义,基本用来使用放图标。使用背景图片,可以随意调整位置。
    4. 滚动条使用伪元素,这个具体哪天在别的文章中进行剖析一下。
    5. 滑动的动画就使用jquery的slideDown()和slideUp()方法。之所以没有用slideToggle()是因为还有箭头的改变。

    实现代码

    html布局

    首先先把html的结构分析一下

      <!--首先这个div是相对于body定位的,p_a类就是position:absolute;-->
      <div class="category p_a" id="category">
      <!--这个是因为滚动条,所以要指定外盒子的宽高-->
            <div>
            <!--一级目录的div-->
                <dl>
                    <!--一级目录的标题-->
                    <dt><i></i><span>菜单一</span></dt>  
                    <!--一级目录的内容-->
                    <div>
                        <!--二级目录的div-->
                        <dd>
                            <!--二级目录的标题-->
                            <div><b></b><span>二级菜单一</span></div>
                            <!--三级目录的div-->
                            <ul>
                                <!--三级目录-->
                                <li>三级菜单一</li>
                                <li>三级菜单二</li>
                            </ul>
                        </dd>
                        <dd>
                            <div><b></b><span>二级菜单二</span></div>
                            <ul>
                                <li>三级任务一</li>
                                <li>三级任务二</li>
                            </ul>
                        </dd>
                    </div>
                </dl>
                <dl>
                    <dt><i></i><span>菜单二</span></dt>
                    <div>
                        <dd>
                            <div><b></b><span>二级导航一</span></div>
                            <ul>
                                <li>三级目录一</li>
                                <li>三级目录二</li>
                            </ul>
                        </dd>
                        <dd>
                            <div><b></b><span>二级导航二</span></div>
                            <ul>
                                <li>三级任务一</li>
                                <li>三级任务二</li>
                            </ul>
                        </dd>
                        <dd>
                            <div><b></b><span>二级导航三</span></div>
                            <ul>
                                <li>三级内容一</li>
                                <li>三级内容二</li>
                            </ul>
                        </dd>
                        <dd>
                            <div><b></b><span>二级导航四</span></div>
                            <ul>
                                <li>三级内容一</li>
                                <li>三级内容二</li>
                            </ul>
                        </dd>
                        <dd>
                            <div><b></b><span>二级导航五</span></div>
                            <ul>
                                <li>三级内容一</li>
                                <li>三级内容二</li>
                            </ul>
                        </dd>
                        <dd>
                            <div><b></b><span>二级导航六</span></div>
                            <ul>
                                <li>三级内容一</li>
                                <li>三级内容二</li>
                            </ul>
                        </dd>
                        <dd>
                            <div><b></b><span>二级导航七</span></div>
                            <ul>
                                <li>三级内容一</li>
                                <li>三级内容二</li>
                            </ul>
                        </dd>
                        <dd>
                            <div><b></b><span>二级导航八</span></div>
                            <ul>
                                <li>三级内容一</li>
                                <li>三级内容二</li>
                            </ul>
                        </dd>
                    </div>
                </dl>
            </div>
        </div>
    

    css样式

    其次上css的代码:

    
    /*这个是一些基础配置*/
    body,p,h1,h2,h3,h4,h5,h6,ul,ol,dl,li,dt,dd{
        margin: 0;
        padding: 0;
        font-size: 14px;
        font-family: Microsoft Yahei,sans-serif;
        color: #ccc;
        list-style: none;
        cursor: default;
    }
    
    html,body{
        width: 100%;
        height: 100%;
        font-size: 100px!important;
    }
    
    body{
        background-color: #000;
    }
    
    .p_a{
        position:absolute;
    }
    
    i{
        font-style: normal;
    }
    
    /*目录的样式*/
    .category{
        width:3.06rem;
        height: 4.62rem;
        border: 1px solid #064F7A;
        background-color: rgba(1, 42, 81, 0.5);
        top: 0.2rem;
        left: 0.3rem;
        padding: 0.3rem 0 0.3rem 0.1rem;
    }
    
    /*这个是用于滚动条的,要确定高度和overflow*/
    .category > div{
        height: 100%;
        overflow: auto;
    }
    
    /*下面是一系列使用伪元素设置滚动条的参数*/
    .category > div::-webkit-scrollbar{
        width: 8px;
    }
    
    /* 定义滚动条轨道  透明的圆角 */
    .category > div::-webkit-scrollbar-track{
        border-radius: 10px;
    }
    
    /* 定义灰色的滑块  内阴影+圆角 */
    .category > div::-webkit-scrollbar-thumb{
        border-radius:10px;
        -webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.3);
        background-color:rgba(157,163,169,0.7);
    }
    
    /*记得里面因为有浮动,注意用overflow:hidden清除浮动*/
    .category dt{
        font-size: 0.24rem;
        line-height: 0.48rem;
        overflow: hidden;
        position: relative;
    }
    
    /*之所以不使用height而使用line-height是因为这样如果文字过于长的时候,不会乱到排版*/
    .category dd{
        font-size: 0.2rem;
        line-height: 0.36rem;
        margin-left: 0.32rem;
        overflow: hidden;
    }
    
    .category dd > div{
        overflow: hidden;
    }
    
    /*使用background-size可以让背景图片自适应在框内*/
    .category i{
        float: left;
        display: inline-block;
        width:0.16rem;
        height: 0.16rem;
        background: url("images/arrow_down.png") no-repeat center center;
        background-size: contain;
        margin-right: 0.05rem;
        margin-top: 0.14rem;
    }
    
    .category b{
        float: left;
        display: inline-block;
        width: 0.16rem;
        height: 0.16rem;
        background: url("images/arrow_down.png") no-repeat center center;
        background-size: contain;
        margin-right: 0.05rem;
        margin-top: 0.1rem;
    }
    
    .category dt span{
        display: block;
        line-height: 0.48rem;
        padding-left: 0.25rem;
    }
    
    .category dd span{
        display: block;
        line-height: 0.36rem;
        padding-left: 0.2rem;
    }
    
    /*因为一开始是隐藏的,所以display:none*/
    .category ul{
        display: none;
    }
    
    .category li{
        font-size: 0.16rem;
        padding-left: 0.32rem;
    }
    

    js实现动画

    下面就是一些动画效果了,因为使用的是jquery中的简单的slideDown和slideUp的方法,所以一定要记得,引入jquery。这里引入的是最新版的jquery,因为我曾用以前的jquery,发现出现了一些bug。

    这里面的dt和dd绑定的事件中,关于有么有类select是相反的思路。
    为什么呢?
    是因为一开始一级目录是展开的,二级目录是折叠的,而且都本身没有select类,所以是相反的。不过这些可以灵活掌握。看具体的需求。

    //一级目录的点击事件
    $("#category dt").click(function(){
    //判断有没有select的类,如果没有就上滑
        if(!$(this).is(".select")){
            //给自己添加select类,然后找到里面的i图标,从朝下的变成朝右的。
            $(this).addClass("select").find("i").css("background-image","url('images/arrow_right.png')");
            //当前的一级标题的下一个元素上滑折叠
            $(this).next().slideUp();
        }else{
            //如果里面有select类,说明是折叠着的
            //给当前元素移除select类,找到里面的i标签,从朝右的变成朝下的。
            $(this).removeClass("select").find("i").css("background-image","url('images/arrow_down.png')");
            //当前的一级标题的下一个元素下滑展开
            $(this).next().slideDown();
        }
    })
    
    //给二级标题绑定点击事件
    $("#category dd").click(function(){
        //判断当前元素有没有select类,如果没有下滑展开
        if(!$(this).is(".select")){
            //当前标题没有select类,其中的b元素的箭头从朝右的变成朝下的 
            $(this).addClass("select").find("b").css("background-image","url('images/arrow_down.png')");
            //当前标题的ul下滑展开
            $(this).find("ul").slideDown();
        }else{
            //如果有select类,就上滑折叠
            //给当前标题移除select类,然后其中的b元素的箭头从朝下的变成朝右的
            $(this).removeClass("select").find("b").css("background-image","url('images/arrow_right.png')");
            //当前标题的ul上滑折叠
            $(this).find("ul").slideUp();
        }
    })
    
    
    
    //子页面加载,因为我在实验的时候,发现了事件冒泡的事情
    //所以要进行阻止事件冒泡的事情。
    $("#category li").on("click",function(e){
        e.stopPropagation();
    })
    

    ok...
    左菜单的分享就到这里。
    @burning_韵七七

    相关文章

      网友评论

        本文标题:自定义完成一个滑动左菜单

        本文链接:https://www.haomeiwen.com/subject/ztvsoxtx.html