今天的码农女孩用js做了二级菜单的练习

二级菜单也就是折叠,在响应式还是vue下都有特定的组件更简便的书写,今天做的练习就是为了更好的理解js

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link href="css/62.css" rel="stylesheet" />
    <script src="js/tools.js"></script>
    <style>
        .collapsed a{
            display: none;
        }
    </style>
    <script>
        window.onload=function(){
            //点击菜单,切换菜单的状态
            var menuSpan=document.querySelectorAll(".menuSpan");
            //定义一个变量来保存当前打开的菜单
            var openDiv=menuSpan[0].parentNode;
            for(i=0;i<menuSpan.length;i++){
                menuSpan[i].onclick=function(){
                    //this代表当前点击的span,获取span的父元素
                    var parentDiv=this.parentNode;
                    //切换parentDiv的显示
                    toggleClass(parentDiv,"collapsed");
                    //判断openDiv和parentDiv是否相同
                    if(openDiv!=parentDiv){
                        //打开菜单以后应该关闭之前打开的菜单
                         addClass(openDiv,"collapsed");
                    }                   
                    //修改openDiv为当前打开菜单
                    openDiv=parentDiv;
                }
            }
        }
    </script>
</head>
<body>
    <div id="my_menu" class="sdmenu">
        <div>
            <span class="menuSpan">在线工具</span>
            <a href="#">图像优化</a>
            <a href="#">收藏夹图标生成器</a>
            <a href="#">邮件</a>
            <a href="#">htaccess密码</a>
            <a href="#">梯度图像</a>
            <a href="#">按钮生成器</a>
        </div>
        <div class="collapsed">
            <span class="menuSpan">支持我们</span>
            <a href="#">推荐我们</a>
            <a href="#">链接我们</a>
            <a href="#">网络资源</a>
        </div>
        <div class="collapsed">
            <span class="menuSpan">合作伙伴</span>
            <a href="#">js工具包</a>
            <a href="#">css驱动</a>
            <a href="#">CodingForums</a>
            <a href="#">css例子</a>
        </div>
        <div class="collapsed">
            <span class="menuSpan">测试电流</span>
            <a href="#">Current or not</a>
            <a href="#">Current or not</a>
            <a href="#">Current or not</a>
            <a href="#">Current or not</a>
        </div>
    </div>
</body>
</html>

css代码

a {
    text-decoration: none;
    display: block;
    text-align: center;
}
a:hover {
    color: red;
}
div.sdmenu {
    width: 150px;
    margin: 0 auto;
    font-family: Arial,sans-serif;
    font-size: 12px;
    padding-bottom: 10px;
    color: #fff;
}
div.sdmenu div {
    overflow: hidden;
    padding-bottom: 10px;
}
div.sdmenu div .collapsed {
    height: 25px;
}
div.sdmenu div span {
    display: block;
    height: 15px;
    line-height: 15px;
    overflow: hidden;
    padding: 5px 25px;
    font-weight: 700;
    color: white;
    cursor: pointer;
    border-bottom: 1px solid #ddd;
    text-align: center;
    background-color: rgb(113, 112, 112);
}
div.sdmenu div a {
    background-color: #ccc;
    border-bottom: 1px solid #fff;
    height: 25px;
    line-height: 25px;
}

js代码,用类的操作编写的

        //定义一个函数用来向元素中添加指定的class属性值
        //参数:1.obj要添加class属性的元素;2.cn要添加的class值
        function addClass(obj,cn){
            //检查obj中是否含有cn
            if(!hasClass(obj,cn)){
                obj.className+=" "+cn;//拼接空格的意思是每个属性名之间有空格
            }        
        }
        //判断一个元素中是否含有指定的class属性值
        //参数:1.obj要添加class属性的元素;2.cn要添加的class值
        function hasClass(obj,cn){
            //判断obj中有没有cn这个class,有返回true,没有返回false
            //创建一个正则表达式
            var reg=new RegExp("\\b"+cn+"\\b");//\b表示单词边界 需要用\转义
            return reg.test(obj.className);
        }
        //删除一个元素中指定的class属性
        //思路:将属性名换成空串
        function removeClass(obj,cn){
            //创建一个正则表达式
            var reg=new RegExp("\\b"+cn+"\\b");
            //删除class
            obj.className=obj.className.replace(reg,"")
        }
        //切换一个类,如果元素中具有该类则删除,没有则添加
        function toggleClass(obj,cn){
            if(hasClass(obj,cn)){
                removeClass(obj,cn);
            }
            else{
                addClass(obj,cn);
            }
        }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值