标签:
效果实现:
点击按钮菜单出现: 点击菜单外则收起菜单:
打开菜单效果:给"新建“添加onclick属性,使菜单display="block"显现
关闭菜单效果:使菜单display="none"隐藏
全部代码(代码之后有详解):
document.addEventListener("click",clickHidden);//所有组件添加点击事件
var mn=document.getElementById('menu');//获取菜单节点,菜单id为menu
function clickHidden(eve)
{
if( eve.target.id!="menu" )//点击的如果不是菜单,菜单隐藏。如果是菜单,菜单显现
mn.style.display="none";
}
我们如何判断是否点击了菜单之外的地方呢?
这里我们想到一个办法,给窗体所有组件添加事件,当点击时,使菜单display="none"。当点击的是菜单时,便使菜单display="block"
这里我们使用到的方法是addEventListener()
语法
element.addEventListener(event, function, useCapture)
参数
描述
event
必须。字符串,指定事件名。
注意: 不要使用 "on" 前缀。 例如,使用 "click" ,而不是使用 "onclick"。
提示: 所有 HTML DOM 事件,可以查看我们完整的 HTML DOM Event 对象参考手册。HTML DOM Event对象参考手册
function
必须。指定要事件触发时执行的函数。
当事件对象会作为第一个参数传入函数。 事件对象的类型取决于特定的事件。例如, "click" 事件属于 MouseEvent(鼠标事件) 对象。
useCapture
可选。布尔值,指定事件是否在捕获或冒泡阶段执行。
可能值:
true - 事件句柄在捕获阶段执行
false- false- 默认。事件句柄在冒泡阶段执行
我们需要监听全页面的单击事件,所以我们的对象是document
document.addEventListener("click",clickHidden);
这里我们注意有个问题:
当你给一个div设置了点击方法,这个div中还有其他元素。
那么实际点击的时候,并没有点击到目的div,因此无法触发点击事件。
解决方法:
1.直接将点击事件绑定到可能点击到的最上层元素。
2.css调节z-index
首先要考虑的是更外层的元素遮挡了靠里层的元素。比如外层遮挡为一个div(.card)被遮挡的是一个input框为(.input-space)
这时就要把遮挡它的元素的css中的z-index调的比他要低,假设:外层遮挡的类名为:card,被遮挡的input的类名为:input-space。
.card{
z-index:1;
}
.input-space{
z-index:2;
}
3.写完之后看input框能不能选到(点击事件生不生效)。如果还是选不到(点击事件不生效),就在这个基础上为card再加一层css, pointer-events:none,此css以为鼠标事件对当前元素无效。
.card{
pointer-events: none;
}