开关菜单

/*
    将需要的信息添加到类的静态数组里备用
    设置一个值openBool,默认为false;菜单默认display为none
    点击时,如果目标元素是子元素,则不做开关菜单操作,直接return。
    点击时,读取openbool。
    bool为false,打开菜单;bool为true时,关闭菜单。每次执行菜单操作之后,bool取反。循环往复。
*/
import Utils from "./Utils.js";
export default class ProClassify {

    static proList = [
        { id: 1, class: "diamondClass", name: "钻石", item: ["GIA钻石", "30分钻石", "50分钻石", "北极光钻石"] },
        { id: 2, class: "ringClass", name: "钻戒", item: ["铂金钻戒", "30分钻戒", "50分钻戒", "70分钻戒", "克拉钻戒"] },
        { id: 3, class: "doubleRingClass", name: "对戒", item: ["铂金对戒", "18K对戒"] },
        { id: 4, class: "ornamentClass", name: "配饰", item: ["吊坠", "耳钉", "套链", "项链", "手链"] },
    ];
    constructor() {
        this.elem = this.createElem();
    }

    createElem() {
        let con = document.createDocumentFragment();
        ProClassify.proList.map(proItem => {
            let div = document.createElement("div");
            div.className = "classItem";
            div.innerHTML = `
            <li id="${proItem.class}" class="${proItem.class}">${proItem.name}
                <ul>
                ${
                proItem.item.reduce((total, cur) => {
                    return total + `<a href="###">${cur}</a>`;
                }, "")
                }
                </ul>
            </li>`;
            //将id下的所有子元素添加到this
            Utils.getIdElem(div, this);
            div.openBool = false;
            this[proItem.class].addEventListener("click", e => this.liClickHandler(e));
            con.appendChild(div);
        });
        return con;
    }

    //点击开关菜单
    liClickHandler(e) {
        if (e.target.constructor === HTMLAnchorElement) return;
        e.target.children[0].style.display = e.target.parentNode.openBool ? "none" : "block";
        e.target.parentNode.openBool = !e.target.parentNode.openBool;
    }

    //插入父容器最前位置,bool为true则添加到末尾
    unShiftIn(parent,bool) {
        parent = HTMLElement.isPrototypeOf(parent.constructor) ? parent : document.querySelector(parent);
        if (parent) bool ? parent.appendChild(this.elem) : parent.insertBefore(this.elem, parent.firstChild);
    }
} 

Utils

export default class Utils{
    //将id下的所有子元素添加到this
    static getIdElem(elem,o){
        if(elem.id) o[elem.id]=elem;
        if(elem.children.length===0) return o;
        for(var i=0;i<elem.children.length;i++){
            Utils.getIdElem(elem.children[i],o);
        }
    }
}

效果:

开:

关:

后记

display:none不占位置,不在文档流中,导致transition失效。考虑动画或者visibility+定位实现

多级菜单:考虑用递归,关闭父菜单关闭时维护其所有子菜单的开关状态、openBool值。

js开关菜单的更多相关文章

  1. JS树形菜单

    超全的JS树形菜单源代码共享(有实例图) 树形菜单是很常用的效果,常用在管理软件当中,但是一套树形菜单已经不能满足需求,所以如果能有一套比较全面的树形菜单JS特效代码,将会非常方便,下面懒人萱将超全的 ...

  2. js矩阵菜单或3D立体预览图片效果

    js矩阵菜单或3D立体预览图片效果 下载地址: http://files.cnblogs.com/elves/js%E7%9F%A9%E9%98%B5%E8%8F%9C%E5%8D%95%E6%88% ...

  3. 顶 兼容各种浏览器js折叠菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 实例介绍Cocos2d-x开关菜单

    开关菜单是MenuItemToggle类实现的,它是一种可以进行两种状态切换的菜单.它可以通过下面的函数创建: static MenuItemToggle*createWithCallback  ( ...

  5. js开关插件使用

    一.简介 本篇文章介绍一个比较好使用的js开关插件Switchery,该插件的样式是ios7的滑动按钮插件,并且将很多功能加入到配置项,简单.灵活,支持的绝大部分浏览器(Chrome, Firefox ...

  6. 基于Bootstrap Ace模板+bootstrap.addtabs.js的菜单

    这几天研究了基于bootstrap Ace模板+bootstra.addtabs.js实现菜单的效果 参考了这个人的博客 https://www.cnblogs.com/landeanfen/p/76 ...

  7. 适合移动手机使用的js环形菜单特效插件

    blooming-menu是一款适合在移动手机上使用的js环形菜单插件.该环形菜单提供了众多的參数,通过结合CSS3动画制作出效果很炫酷的圆形菜单展开和隐藏动画效果. 以下是这个圆形菜单菜价的可用參数 ...

  8. jquery.smint.js 页面菜单浮动之谷歌浏览器异常

    jquery.smint.js 做公司项目时,谷歌测试,页面向下拉,刷新后,导航栏菜单与顶部距离发生变动,并不在设置的relative元素top下固定像素 我的relative元素的高为80,然后在j ...

  9. js侧边菜单

    目标 实现一个侧边栏菜单,最多二级,可以收起展开.用于系统左侧的主菜单. 大多数系统都会有这样的菜单,用于导航功能,切换到不同的操作页面.在单页应用系统中,菜单一般是固定在左侧,分组节点上配图标,高亮 ...

随机推荐

  1. 16day 逻辑符号系列

    && 与逻辑符号 前一个命令执行成功, 再执行后面的命令 || 或逻辑符号 前一个命令执行失败, 再执行后面的命令 &&符号实践操作: [root@oldboyedu ...

  2. [转]Jarvis OJ- [XMAN]level2/3_x64-Writeup

    学弟写的挺好的,我就直接转过来了 原文链接:http://www.cnblogs.com/ZHijack/p/7940686.html 两道64位栈溢出,思路和之前的32位溢出基本一致,所以放在一起 ...

  3. 【转载】Java嵌入Pig编程

    转自:https://wiki.apache.org/pig/EmbeddedPig Embedding Pig In Java Programs Sometimes you want more co ...

  4. NlogN复杂度寻找数组中两个数字和等于给定值

    算法导论:22页2.3-7 描述一个运行时间为O(nlogn)的算法,找出n个元素的S数组中是否存在两个元素相加等于给定x值 AC解: a=[1,3,6,7,9,15,29] def find2sum ...

  5. DE1-LINUX运行

    在官网下载.img文件:网址:http://download.terasic.com/downloads/cd-rom/de1-soc/linux_BSP/ 写入DE1_SOC_SD.img文件: 打 ...

  6. AcWing 154. 滑动窗口

    https://www.acwing.com/problem/content/156/ #include <iostream> using namespace std; ; int a[N ...

  7. 题解【洛谷P1514】[NOIP2010]引水入城

    题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 \(N\) 行 \(M\) 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市 ...

  8. JavaScript中的 typeof,null,和undefined

    typeof操作符 null 在JavaScript中null表示“什么都没有”. null是一个只有一个值的特殊类型.表示一个空对象引用. typeof null; 返回的是object 可以将nu ...

  9. PAT-链表-A1032 Sharing

    题意:给出两条链表的首地址以及若干个节点的的地址.数据.下一个节点的地址,求两条链表的首个共用节点的地址.如果两条链表没有共用节点,则输出-1. 思路:使用静态链表,首先遍历一遍第一个链表并进行标记. ...

  10. bistoury的源码启动(二)

    bistoury.conf这个东东就是我们代码中的 -Dbistoury.conf=D:\openSource\bistoury\bistoury-proxy\conf 这样就能搞定了,一下子就能启动 ...