html - 如何对齐 CSS 下拉菜单的包装
问题描述
我正在创建一个下拉菜单,让它看起来非常符合我的要求,但是我实现布局的方式使得右侧的悬停区域有点太大,这里用灰色框说明。我想将鼠标悬停在灰色框(.dropdown 元素)上,将其视为白色区域并关闭下拉菜单。
将鼠标悬停在灰色 .dropdown 区域上时,如何让菜单关闭?
工作演示:https ://codepen.io/anon/pen/BMarBb?editors=1100
a {
text-decoration: none;
}
nav {
font-family: monospace;
margin-left: 300px;
}
ul {
list-style: none;
margin: 0;
padding-left: 0;
}
li {
color: #fff;
background: darkorange;
display: block;
float: left;
padding: 1rem;
position: relative;
text-decoration: none;
transition-duration: 0.5s;
}
li a {
color: #fff;
}
li:hover {
cursor: pointer;
}
.dropdown {
visibility: hidden;
opacity: 0;
position: absolute;
transition: all 0.5s ease;
margin-top: 1rem;
left: 0;
display: none;
margin-left: 50%;
background: silver;
}
li:hover .dropdown,
.dropdown:hover {
visibility: visible;
opacity: 1;
display: block;
}
.dropdown li {
clear: both;
white-space: nowrap;
background: none;
}
.wrapper {
/* background: green; */
display: inline-block;
margin-left: -50%;
padding-top: 30px;
}
.inner {
background: darkorange;
display: inline-block;
box-shadow: 12px 15px 45px 0 rgba(12, 0, 51, 0.2);
border-radius: 4px;
}
.inner:before,
.inner:after,
.inner li:first-child:after {
display: block;
content: "";
width: 0;
height: 0;
position: absolute;
left: -12px;
border: 12px outset transparent;
margin-top: 29px;
}
.inner:after {
border-bottom: 12px solid darkorange;
top: -23px;
}
<nav role="navigation">
<ul>
<li><a href="#">One</a>
<ul class="dropdown dropdown1">
<section class="wrapper">
<section class="inner">
<li><a href="#">Sub-A</a></li>
<li><a href="#">Sub-B</a></li>
<li><a href="#">Sub-C</a></li>
</section>
</section>
</ul>
</li>
<li><a href="#">Two</a>
<ul class="dropdown dropdown2">
<section class="wrapper">
<section class="inner">
<li><a href="#">Sub-1</a></li>
<li><a href="#">Sub-2</a></li>
<li><a href="#">Sub-3</a></li>
</section>
</section>
</ul>
</li>
<li><a href="#">Three</a></li>
</ul>
</nav>
解决方案
有关我如何控制特定元素的悬停事件,请参阅 CSS 上的内联注释。这种方法使下拉菜单正上方的灰色区域处于活动状态,我认为这是一种很好的行为。
注意:这在 Safari 中可能不起作用。请参阅https://caniuse.com/#feat=pointer。
a {
text-decoration: none;
}
nav {
font-family: monospace;
margin-left: 300px;
}
ul {
list-style: none;
margin: 0;
padding-left: 0;
}
li {
color: #fff;
background: darkorange;
display: block;
float: left;
padding: 1rem;
position: relative;
text-decoration: none;
transition-duration: 0.5s;
}
li a {
color: #fff;
}
li:hover {
cursor: pointer;
}
.dropdown {
visibility: hidden;
opacity: 0;
position: absolute;
transition: all 0.5s ease;
margin-top: 1rem;
left: 0;
display: none;
margin-left: 50%;
background: silver;
pointer-events: none; /* <-- disable hover events */
}
li:hover .dropdown,
.dropdown:hover {
visibility: visible;
opacity: 1;
display: block;
}
.dropdown li {
clear: both;
white-space: nowrap;
background: none;
}
.wrapper {
/* background: green; */
display: inline-block;
margin-left: -50%;
padding-top: 30px;
pointer-events: all; /* <-- enable hover events */
}
.inner {
background: darkorange;
display: inline-block;
box-shadow: 12px 15px 45px 0 rgba(12, 0, 51, 0.2);
border-radius: 4px;
}
.inner:before,
.inner:after,
.inner li:first-child:after {
display: block;
content: "";
width: 0;
height: 0;
position: absolute;
left: -12px;
border: 12px outset transparent;
margin-top: 29px;
}
.inner:after {
border-bottom: 12px solid darkorange;
top: -23px;
}
<nav role="navigation">
<ul>
<li><a href="#">One</a>
<ul class="dropdown dropdown1">
<section class="wrapper">
<section class="inner">
<li><a href="#">Sub-A</a></li>
<li><a href="#">Sub-B</a></li>
<li><a href="#">Sub-C</a></li>
</section>
</section>
</ul>
</li>
<li><a href="#">Two</a>
<ul class="dropdown dropdown2">
<section class="wrapper">
<section class="inner">
<li><a href="#">Sub-1</a></li>
<li><a href="#">Sub-2</a></li>
<li><a href="#">Sub-3</a></li>
</section>
</section>
</ul>
</li>
<li><a href="#">Three</a></li>
</ul>
</nav>
推荐阅读
- google-apps-script - 通过 URL 插入图像在 Google Apps 脚本中不起作用
- r - 下载物种发生数据时的for循环问题
- interrupt - QEMU 如何为 PCI 设备分配特定的 IRQ 号?
- db2-400 - 通过 SQL 访问数据区
- macos - mac 自定义 localhost 与文件主机上的端口
- angularjs - 在AngularJs中动态更改日期时间更改事件的最小,最大日期
- javascript - 如何将 CSS 和 JS 添加到 Docker 图像
- java - JDBI bindBean 找不到命名参数
- ubuntu - 启用 DNS 转发 Bind9
- visual-studio - Visual Studio 中的 XAML 预览不显示标题栏