js开关菜单
开关菜单
/*
将需要的信息添加到类的静态数组里备用
设置一个值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开关菜单的更多相关文章
- JS树形菜单
超全的JS树形菜单源代码共享(有实例图) 树形菜单是很常用的效果,常用在管理软件当中,但是一套树形菜单已经不能满足需求,所以如果能有一套比较全面的树形菜单JS特效代码,将会非常方便,下面懒人萱将超全的 ...
- js矩阵菜单或3D立体预览图片效果
js矩阵菜单或3D立体预览图片效果 下载地址: http://files.cnblogs.com/elves/js%E7%9F%A9%E9%98%B5%E8%8F%9C%E5%8D%95%E6%88% ...
- 顶 兼容各种浏览器js折叠菜单
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 实例介绍Cocos2d-x开关菜单
开关菜单是MenuItemToggle类实现的,它是一种可以进行两种状态切换的菜单.它可以通过下面的函数创建: static MenuItemToggle*createWithCallback ( ...
- js开关插件使用
一.简介 本篇文章介绍一个比较好使用的js开关插件Switchery,该插件的样式是ios7的滑动按钮插件,并且将很多功能加入到配置项,简单.灵活,支持的绝大部分浏览器(Chrome, Firefox ...
- 基于Bootstrap Ace模板+bootstrap.addtabs.js的菜单
这几天研究了基于bootstrap Ace模板+bootstra.addtabs.js实现菜单的效果 参考了这个人的博客 https://www.cnblogs.com/landeanfen/p/76 ...
- 适合移动手机使用的js环形菜单特效插件
blooming-menu是一款适合在移动手机上使用的js环形菜单插件.该环形菜单提供了众多的參数,通过结合CSS3动画制作出效果很炫酷的圆形菜单展开和隐藏动画效果. 以下是这个圆形菜单菜价的可用參数 ...
- jquery.smint.js 页面菜单浮动之谷歌浏览器异常
jquery.smint.js 做公司项目时,谷歌测试,页面向下拉,刷新后,导航栏菜单与顶部距离发生变动,并不在设置的relative元素top下固定像素 我的relative元素的高为80,然后在j ...
- js侧边菜单
目标 实现一个侧边栏菜单,最多二级,可以收起展开.用于系统左侧的主菜单. 大多数系统都会有这样的菜单,用于导航功能,切换到不同的操作页面.在单页应用系统中,菜单一般是固定在左侧,分组节点上配图标,高亮 ...
随机推荐
- 【JS】网站运行时间
<span id="sitetime"></span> <script language=javascript> function siteTi ...
- 复制文件或目录命令 - cp
1) 命令名称:cp 2) 英文原意:copy 3) 命令所在路径:/bin/cp 4) 执行权限:所有用户 5) 功能描述:复制文件或目录 语法: cp -rp [原文件或目录][目标目录] -r ...
- 压缩包安装mysql8.0
在使用django的时候遇到一个错误,就是用脚本改变数据库的时候,发现mysql的版本不够,需要的版本应该大于5.8,而我的只有5.5,就很烦,恰好我之前有8.0的压缩包.(mysql重装已经不下十次 ...
- thinkphp 二级域名绑定模块,导致设置的路由被多域名共用的问题解决方案
问题背景: 在router.php路由配置文件设置了二级域名和路由设置 use think\Route; Route::domain('www','index'); Route::domain('ad ...
- [NOIP2017(TG/PJ)] 真题选做
[NOIPTG2017] 小凯的疑惑 题意 小凯有两种面值的金币,每种金币有无数个,求在无法准确支付的物品中,最贵的价值是多少金币. 分析 设两种金币面值分别为 $a$ 和 $b \; (a<b ...
- cvtColor(src, src_gray, CV_BGR2GRAY)报错
利用cvtColor 进行灰度转换时,不能将 灰度图 转为灰度图,所以在转换前,需对原始图像进行判断. 将这个改成以下 int main(int argc, char* argv[]) { Mat ...
- koa2第一天 安装koa2found 1 low severity vulnerability run `npm audit fix` to fix them, or `npm audit` for details
安装全局koa2:npm install -g koa2 -generator 创建一个koa2文件夹:koa2 -e koa2 进入koa2文件夹:cd koa2 安装npm模块:npm insta ...
- 使用VS2017开发安卓app(2)新建项目
安装完成后,在c#下找到Android,选择Android应用(Xamarin),修改项目名称和路径,新建第一个安卓项目! 点击确定后会出现 这里我们选择空白应用和Android 7.1. 创建新项目 ...
- 苹果公司以注重客户隐私闻名世界,但为什么Siri泄露了我的秘密?
编辑 | 于斌 出品 | 于见(mpyujian) 苹果的Siri因为其作为智能语音助手,方便人们打电话.发信息等功能,被人们所喜爱,但是最近,Siri好像有一些问题,让我们怀疑这位"小伙伴 ...
- Spring Boot中快速操作Mongodb
Spring Boot中快速操作Mongodb 在Spring Boot中集成Mongodb非常简单,只需要加入Mongodb的Starter包即可,代码如下: <dependency> ...