您现在的位置是:网站首页> 编程资料编程资料
JS实现左侧菜单工具栏_javascript技巧_
2023-05-24
469人已围观
简介 JS实现左侧菜单工具栏_javascript技巧_
本文实例为大家分享了JS实现左侧菜单工具栏的具体代码,供大家参考,具体内容如下
摘要
该js脚本可帮助你快速实现左侧菜单工具栏。通过js封装成一个方法类,直接new该对象即可快速生成左侧菜单工具栏。
一、效果展示

二、menu.js文件
(1)WenMenuNode节点
let WenMenuNode = function ({ text, wenMenu, attributes = {}, subs = [], parentElement = null, iconHTML = '', level = 1, parentNode = null, isActive = false, onLaunch = null, }) { this._level = level; this._text = text; this._attributes = attributes; this._wenMenu = wenMenu; this._subs = subs; this._onLaunch = onLaunch; this._childHeight = 0; this._height = 0; this.style = { childHeight: 0, } this._parentElement = parentElement; this._parentNode = parentNode; this._element = this._wenMenu.createElement('li', { class: "wen-menu-li", }); this._textElement = this._wenMenu.createElement('a', this._attributes); this._iconHTML = iconHTML; this._childNodes = []; this._childElement = null; this._activeChild = null; if (this._parentElement) this._parentElement.append(this._element); this._isActive = isActive; if (this._isActive) { if (this._level == 1) { this._wenMenu._activeMenu = this; } else if (this._parentNode) { this._parentNode._activeChild = this; } } this.create().onLaunch(); } WenMenuNode.prototype.create = function () { let a = this._textElement; let icon = this._wenMenu.createElement('i', { class: "wen-menu-icon", }) if (this._level > 1) { a.innerHTML = ''; } icon.innerHTML = this._iconHTML; a.append(icon); a.innerHTML += ``; if (this._level == 1) { a.classList.add('wen-menu-first'); } this._element.append(a); if (this._subs.length) { let ul = this._wenMenu.createElement('ul', { class: "wen-menu-ul" + (this._level == 1 ? " wen-menu-ul-second" : ""), }); this._element.append(ul); this._childElement = ul; this._subs.forEach((item, i) => { let node = new WenMenuNode({ text: item.text, wenMenu: this._wenMenu, attributes: item.attributes, subs: item.subs, parentElement: ul, iconHTML: item.iconHTML, level: this._level + 1, parentNode: this, isActive: this._isActive && i == 0, onLaunch: (childNode) => { this._childNodes.push(childNode); if (i == this._subs.length - 1) { this.setEventListener(true); } } }); }); } else { this.setEventListener(false); } return this; } WenMenuNode.prototype.onLaunch = function () { if (this._onLaunch) { this._onLaunch.call(this._parentNode, this); } return this; } WenMenuNode.prototype.setEventListener = function (hasSub = false) { if (hasSub) { this._height = this._subs.length * this._wenMenu._menuHeight; this._childHeight = this._childElement.clientHeight; if (this._isActive) { this._textElement.setAttribute('wen-active', ''); this._textElement.setAttribute('wen-expand', ''); this.style.childHeight = this._childHeight + this._wenMenu._menuSpacing; } else { this._textElement.setAttribute('wen-icon', '') this._textElement.setAttribute('wen-collapse', ''); this.style.childHeight = 0; } this._childElement.style.height = this.style.childHeight + "px"; this._textElement.addEventListener('click', (e) => { if (this._wenMenu._autoCollapse) { this.resetHeight(); this.setHeight({ menuNode: this, }) } else { let height = 0, target = e.target; if (target.classList.value.indexOf('wen-menu-text') >= 0) { target = target.parentElement; } if (target.getAttribute('wen-expand') === null) { // todo:: 展开 height = this.style.childHeight = this._height + this._wenMenu._menuSpacing; target.setAttribute('wen-expand', ''); target.removeAttribute('wen-collapse'); } else { // todo:: 收起 height = -this.style.childHeight; this.style.childHeight = 0; target.setAttribute('wen-collapse', ''); target.removeAttribute('wen-expand'); this.resetHeight(this._childNodes) } this._childElement.style.height = this.style.childHeight + 'px'; if (this._parentNode) { this.setHeight({ menuNode: this._parentNode, direction: 'up', childHeight: height, childNode: this, }) } } }); } else { if (this._isActive) { this._textElement.classList.add('wen-active'); } this._textElement.addEventListener('click', (e) => { if (this._wenMenu._autoCollapse) { this.resetHeight(); this.setHeight({ menuNode: this._parentNode, direction: 'up', childNode: this, childHeight: this._height, }) } this.removeActive(this._wenMenu._activeMenu) this._isActive = true; this._textElement.classList.add('wen-active'); let target = e.target; if (target.classList.value.indexOf('wen-menu-text') >= 0) { target = target.parentElement; } if (target.classList.value.indexOf('wen-menu-first') >= 0) { this._wenMenu._activeMenu = this; } else if (this._parentNode) { this.addActive(this._parentNode, this) } else { this._wenMenu._activeMenu = this; } if (this._wenMenu._event) { this._wenMenu._event.call(this, e) } }); } return this; } WenMenuNode.prototype.setHeight = function ({ menuNode = null, direction = 'down', childHeight = 0, childNode = null, }) { if (!menuNode) { return 0; } menuNode._textElement.setAttribute('wen-expand', ''); menuNode._textElement.removeAttribute('wen-collapse'); if (this._wenMenu._autoCollapse) { menuNode.style.childHeight = menuNode._height; } if (direction == 'down') { if (menuNode._subs.length) { menuNode.style.childHeight += (this._wenMenu._menuSpacing * (childNode ? childNode._level : 1)); if (menuNode._isActive) { menuNode.style.childHeight += this.setHeight({ menuNode: menuNode._activeChild, }); } if (menuNode._childElement) { menuNode._childElement.style.height = menuNode.style.childHeight + "px"; } if (menuNode._parentNode) { this.setHeight({ menuNode: menuNode._parentNode, direction: 'up', childNode: menuNode, childHeight: menuNode.style.childHeight, }); } } } else { menuNode.style.childHeight += (childHeight + this._wenMenu._menuSpacing); menuNode._childElement.style.height = menuNode.style.childHeight + "px"; if (menuNode._parentNode) { this.setHeight({ menuNode: menuNode._parentNode, direction: 'up', childHeight: menuNode.style.childHeight, childNode: menuNode, }); } } return menuNode.style.childHeight; } WenMenuNode.prototype.resetHeight = function (menuNodes) { if (!menuNodes) { menuNodes = this._wenMenu._menuNodes; } menuNodes.forEach((node) => { if (node._childElement) { node.style.childHeight = 0; node._childElement.style.height = '0px'; } if (node._childNodes.length) { node._textElement.setAttribute('wen-collapse', ''); node._textElement.removeAttribute('wen-expand'); this.resetHeight(node._childNodes); } }); return this; } WenMenuNode.prototype.addActive = function (menuNode, activeChildNode) { menuNode._isActive = true menuNode._textElement.setAttribute('wen-active', ''); menuNode._textElement.removeAttribute('wen-icon'); if (this._wenMenu._autoCollapse) { menuNode._textElement.setAttribute('wen-expand', ''); menuNode._textElement.removeAttribute('wen-collapse'); } menuNode._activeChild = activeChildNode; if (menuNode._parent
相关内容
- vue3中通过ref获取元素节点的实现_vue.js_
- JavaScript+node实现三级联动菜单_javascript技巧_
- Vue3中使用setup通过ref获取子组件的属性_vue.js_
- Vue中Element的table多选表格如何实现单选_vue.js_
- 微信小程序开发之全局配置与页面配置实现_javascript技巧_
- 理解JavaScript中window对象的一些用途_javascript技巧_
- vue 表格单选按钮的实现方式_vue.js_
- VUE生命周期全面系统详解_vue.js_
- JavaScript实现简易计算器案例_javascript技巧_
- vue-loader和webpack项目配置及npm错误问题的解决_vue.js_
点击排行
本栏推荐
