javascript - javascript:为什么我需要单击两次才能更改显示属性?
问题描述
我有一个包含该属性的菜单display: none;
和一个更改该属性的外部文件中的 javascript。
let montreMenu = function(){
var monMenu = document.querySelector('.popupmenu')
if (monMenu.style.display === 'none'){
monMenu.style.display = 'flex'
}else{
monMenu.style.display = 'none'
}
}
<span id="apparition_popupmenu" onclick="montreMenu()" >Click
</span>
<nav class="popupmenu">
<span>nav Data</span>
</nav>
它可以工作,除了在页面加载时,我需要单击 spanapparition_popupmenu
两次才能使切换生效。为什么是这样?
解决方案
因为,很可能,您display: none
在css中指定,但在 js 逻辑中您指的是styles。因此,首先,在第一次单击时,您会得到display: none
,而在第二次单击时,会得到display: flex
。
您可以使用方法getComputedStyle()
来检查 css 样式。像这样:
if (window.getComputedStyle(monMenu).display === 'none') { ... }
另外,有问题的例子:
let montreMenu = function(){
var monMenu = document.querySelector('.popupmenu')
if (window.getComputedStyle(monMenu).display === 'none'){
monMenu.style.display = 'flex'
}else{
monMenu.style.display = 'none'
}
}
.popupmenu {
display: none;
}
<span id="apparition_popupmenu" onclick="montreMenu()" >Click</span>
<nav class="popupmenu">popup</nav>
根据上述评论的建议,我使用 method 提出了第二个解决方案toggle()
。此方法添加/删除一个类,如开关。并且不需要通过条件检查显示器的当前状态。if
只需要将活动状态的类添加到css中。像这样:
.popupmenu.active {
display: flex;
}
let montreMenu = function(){
var monMenu = document.querySelector('.popupmenu');
monMenu.classList.toggle('active');
}
.popupmenu {
display: none;
}
.popupmenu.active {
display: flex;
}
<span id="apparition_popupmenu" onclick="montreMenu()" >Click</span>
<nav class="popupmenu">popup</nav>
推荐阅读
- php - How to show data by ID in TableView from JSON
- angular-material - 我有多少种颜色
- c - 静态大小的字符串声明
- docker - 如何使用 systemd 启动和停止 docker 容器
- php - 如何使用 PHP 在表单中提交复选框数据切换值
- python - 无法在 docker 容器中使用 gunicorn 连接到烧瓶应用程序
- angular - 如何制作嵌套数组的拖放树结构
- python - 找到给定函数值的参数的最佳值
- angular - ngb-datepicker 如何获取所选日期的周数
- animation - 如何防止“动画”散景图卡顿