javascript - 导航菜单的悬停问题
问题描述
我的大型菜单导航存在悬停问题。它在悬停在不可见的子列表项上时激活(从下到上悬停,您会注意到此 codepen上的问题)。
这是触发悬停的 CSS 块:
.nav:hover > li > .subnav-block {
opacity: 1;
visibility: visible;
overflow: visible;
}
我在想一个 JavaScript 解决方案会有所帮助,但首先要尝试为此找到 CSS 修复程序。
解决方案
您的子导航菜单正在占用空间,即使它不可见。这就是为什么当你悬停在它上面时你可以看到它。添加height:0
到您的,然后在悬停时.subnav-block
将其设置回,应该可以解决问题。auto
你的 css 应该看起来像下面的那样。
.subnav-block {
position: static;
display: block;
width: 100% !important;
top: 54px;
left: 0;
height: 0;
overflow: hidden;
background: gray;
-webkit-transition: all 0.3s ease 0.15s;
-moz-transition: all 0.3s ease 0.15s;
-o-transition: all 0.3s ease 0.15s;
-ms-transition: all 0.3s ease 0.15s;
transition: all 0.3s ease 0.15s;
}
.nav:hover > li > .subnav-block {
height: auto;
visibility: visible;
overflow: visible;
}
更新
如果您想在子导航菜单中添加填充,将 设置height
为 0 是不够的,您需要在悬停时同时更改 theheight
和 the 。Hadi77padding
提到了另一种方法,即将默认显示设置为,然后将其更改为。就像下面的例子一样。none
block
.subnav-block {
position: static;
width: 100% !important;
top: 54px;
left: 0;
display: none;
background: gray;
-webkit-transition: all 0.3s ease 0.15s;
-moz-transition: all 0.3s ease 0.15s;
-o-transition: all 0.3s ease 0.15s;
-ms-transition: all 0.3s ease 0.15s;
transition: all 0.3s ease 0.15s;
}
.nav:hover > li > .subnav-block {
display: block;
}
更新 2
由于display
不允许我们使用转换,因此另一种解决方法是使用一些JS
. 由于它的代码不多,因此这是实现这一目标的可靠方法。我们需要删除其中的 CSS hover
。
JS
const nav = document.querySelectorAll('.nav > li');
nav.forEach(elem => {
elem.addEventListener('mouseenter', () => {
const subnav = document.querySelectorAll('.subnav-block');
subnav.forEach(sub => {
sub.classList.add('display-block');
setTimeout( () => {
sub.style.opacity = 1;
sub.style.height = 'auto';
}, 100);
});
});
elem.addEventListener('mouseleave', () => {
const subnav = document.querySelectorAll('.subnav-block');
subnav.forEach(sub => {
sub.classList.remove('display-block');
sub.style.opacity = 0;
});
});
});
CSS
.subnav-block {
position: static;
width: 100% !important;
top: 54px;
left: 0;
display: none;
opacity: 0;
height: 0;
background: gray;
-webkit-transition: all 0.3s ease 0.15s;
-moz-transition: all 0.3s ease 0.15s;
-o-transition: all 0.3s ease 0.15s;
-ms-transition: all 0.3s ease 0.15s;
transition: all 0.3s ease 0.15s;
}
.display-block {
display: block;
}
推荐阅读
- scala - 使用 Akka HTTP 的 Spark 即服务
- swift - 在移动到目标视图之前如何在 NavigationLink 中执行某些操作(例如:打印(“hi”))
- sql - 插入带有子查询的临时表
- javascript - javascript中带有if/else语句的地方的可点击内容
- android - Recyclerview 仅显示 3 项,查看更多以显示所有数据
- javascript - 将 if else 添加到功能后未定义单击按钮功能
- java - JPanel 未在 mac 上接收鼠标事件
- sql - 有没有办法使用指定的约束在 SQL 中计算正确的平均值?
- redis - 卸载 Redis CentOS
- python - pip install rasterio 时遇到错误