900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > js 点击侧边栏展示内容_【DEMO】JS实现侧边栏信息展示效果

js 点击侧边栏展示内容_【DEMO】JS实现侧边栏信息展示效果

时间:2022-09-30 15:00:40

相关推荐

js 点击侧边栏展示内容_【DEMO】JS实现侧边栏信息展示效果

/*使用块模式--立即执行的匿名函数*/(function(){//所有声明的变量在构造函数内部,不会向windows添加任何属性

/*构造函数的基本规范:

1、构造函数的第一个字母是大写的,与其他函数区分开来

2、调用构造函数的时候需要用new,不然会创建全局变量*/

var Menubar = function(){this.el = document.querySelector('#sidebar ul'); //菜单项的DOM元素通过css的querySelctor查找得到

this.state = 'allClosed';//初始状态时,allClosed,当打开某一个时,则为hasOpened

this.el.addEventListener('click',function(e){//7.1阻止冒泡事件向上传播,这样点击菜单项,只响应菜单项事件,无关sidebar

e.stopPropagation();

});var self = this;var currentOpendMenuContent = null;//7.2点击菜单项添加监听事件

this.menuList = document.querySelectorAll('#sidebar ul > li');for( var i=0; i

var menuContentEl = document.getElementById(e.currentTarget.id + '-content');/*7.2-1:没有打开菜单项,打开响应的菜单项

7.2-2:有打开的菜单项,关闭该菜单项再打开响应的菜单项*/

if(self.state === 'allClosed'){

console.log('打开' +menuContentEl.id);/*9.1菜单项打开的动画效果*/

//先设置菜单栏的高和左边的位置

menuContentEl.style.top = '0px';

menuContentEl.style.left= '-85px';

menuContentEl.classList.add('menuContent-move-right');

self.state= 'hasOpened';

self.currentOpendMenuContent=menuContentEl;

}else{

console.log('关闭' +self.currentOpendMenuContent.id);/*9.2菜单栏关闭的动画效果*/self.currentOpendMenuContent.className= 'nav-content';

self.currentOpendMenuContent.style.top= '0';

self.currentOpendMenuContent.style.left= '35px';

self.currentOpendMenuContent.classList.add('menuContent-move-left')

console.log('打开' +menuContentEl.id);

menuContentEl.className= "nav-content"menuContentEl.style.top= '250px';

menuContentEl.style.left= '35px';

menuContentEl.classList.add('menuContent-move-up');

self.state= 'hasOpened';

self.currentOpendMenuContent=menuContentEl;

}

});

}/*10、关闭按钮的样式*/

this.menuContentList = document.querySelectorAll('.nav-content >div.nav-con-close');for(i=0;i

var menuContent =e.currentTarget.parentNode;

menuContent.className= "nav-content";

menuContent.style.top= '0';

menuContent.style.left= '35px';

menuContent.classList.add('menuContent-move-left');

that.state= 'allClosed';

});

}

};/*1、使用构造函数创建sidebar对象 ,

实例化该对象,向内提供属性eId、closeId*/

var Sidebar = function(eId,closeBarId){/*2、定义对象的状态和属性和方法*/

this.state = 'opened';/*4、继续完成构造函数

4.1、完成对象的初始化,获取所需要的DOM元素

4.2、在构造函数的关闭按钮中增加事件响应函数

{借助Javascript的事件的冒泡传播机制:使用向上冒泡的机制来传播,在'sidebar的div上能监听closebar按钮的事件响应'}*/

this.el = document.getElementById(eId || 'sidebar'); //在参数中,需要传入默认的id以防不提供参数

this.closeBarEl = document.getElementById(closeBarId || 'closeBar');/*4.3、在el元素上面调用事件函数*/

var self = this;/*修改事件函数内的this指向回Sidebar对象有两种方法:

1、修改函数的上下文(比较复杂)

2、javascript的特性--闭包

this指向构造函数返回的对象,则指向下方 new sidebar返回的对象,

闭包原理,再在事件响应函数中调用该变量*/

/*7、在sidebar构造函数中,需要将Menubar函数作为一个属性传进*/

this.menubar = newMenubar();this.el.addEventListener("click",function(event){if(event.target !==self.el){

self.triggerSwitch();//代表打开和关闭的统一函数名称

}

});

};/*3、声明sidebar的两个行为

对象的行为添加在构造函数的原型链上*/Sidebar.prototype.close= function(){

console.log('关闭sidebar');/*8、增加sidebar和关闭按钮的动画效果*/

this.el.className = 'sidebar-move-left';this.closeBarEl.className = 'closeBar-move-right';this.state = 'closed';

};

Sidebar.prototype.open= function(){

console.log('打开sidebar');/*9、增加sidebar打开和关闭按钮向左移动的动画效果*/

//9.1需要先将sidebar的位置定位到上次关闭的位置

this.el.style.left ='-120px';this.el.className = 'sidebar-move-right';this.closeBarEl.style.left = '160px';this.closeBarEl.className = 'closeBar-move-left';this.state = 'opened';

};/*5、增加triggerSwich()函数*/Sidebar.prototype.triggerSwitch= function(){if(this.state === 'opened'){this.close();

}else{this.open();

}

};/*6、验证构造函数的成果

6.1在close函数中console.log输出值来验证

6.2增加test单元测试,单元测试一直伴随代码存在*/

var sidebar = newSidebar();

})();

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。