仅使用 CSS 创建下拉列表项菜单
Creating a dropdown list item menu with CSS only
在我正在处理的网站部分中,我有一个包含三个部分的 NAV 元素:关于、投资组合、联系人。我试图做到这一点,以便当您将鼠标悬停在“投资组合”部分时,会出现一个下拉菜单,允许您在其他两个部分之间进行选择,"Writing Samples" 和 "Photoshop." 我正在尝试仅使用 CSS.
这是我的 HTML 部分:
<nav>
<ul>
<li>
<a href="index.html" >About</a>
</li>
<li class="subNav">
<a class="selected" >Portfolio</a>
<ul>
<li><a href="writing_samples.html">Writing Samples</a></li>
<li><a href="photoshop.html">Photoshop</a></li>
</ul>
</li>
<li>
<a href="contact.html">Contact</a>
</li>
</ul>
</nav>
和CSS:
nav {
position: absolute;
bottom: 0;
right: 0;
padding: 10px 0;
}
nav ul {
list-style: none;
margin: 0 10px;
padding: 0;
}
nav li {
display: inline-block;
}
nav a {
font-weight: 800;
padding: 15px 10px;
}
nav ul li.subNav ul {
display: none;
}
nav ul li.subNav:hover ul {
display: block;
}
我已经做到了,当我将鼠标悬停在投资组合列表项上时,您会看到生成的列表项 "Writing Samples" 和 "Photoshop",只是它将这两项显示为原始无序列表,并将 "Portfolio" 列表项移到其余项之上。我希望 "Writing Samples" 和 "Photoshop" 垂直显示在 "Portfolio" 下方,但我无法用 CSS 解决这个问题。
这是它的基础知识:
nav {
position: absolute;
padding: 10px 0;
}
nav ul {
list-style: none;
;
padding: 0;
}
nav > ul > li {
display: inline-block;
position: relative;
border: 1px solid lightgreen;
/* for demo */
}
nav a {
font-weight: 800;
padding: 5px 10px;
display: block;
}
nav > ul > li.subNav ul {
display: none;
position: absolute;
top: 100%;
left: 0;
white-space: nowrap;
background: pink;
}
nav ul li.subNav:hover ul {
display: block;
}
<nav>
<ul>
<li>
<a href="index.html">About</a>
</li>
<li class="subNav">
<a class="selected">Portfolio</a>
<ul>
<li><a href="writing_samples.html">Writing Samples</a>
</li>
<li><a href="photoshop.html">Photoshop</a>
</li>
</ul>
</li>
<li>
<a href="contact.html">Contact</a>
</li>
</ul>
</nav>
父 li
被赋予 position:relative
以提供定位上下文。
子菜单绝对定位,在父菜单的底部 li
并左对齐。
请注意,我使用了 直接子选择器 >
来仅定位我想要的元素。
然后,由于子菜单太宽而无法包含在父菜单的宽度内,我添加了 white-space:nowrap
以便文本按要求排列。
你的想法是对的;下面 HTML 中的注释标签用于删除 "li" 元素之间的 space。
我没有使用 display:none,而是使用 visibility: hidden 来达到 S.E.O 目的。
即使您使用 position: absolute,您也应该使用 z-index,以便在菜单元素与其他内容重叠时能够被点击。
.mm,
.sm {
list-style: none;
}
.mm {
position: relative;
margin: 0px;
padding: 0px;
background-color: #000;
border-bottom: 4px solid red;
}
.sm {
position: absolute;
z-index: 1;
visibility: hidden;
background-color: #000;
border-width: 0px 4px 4px 4px;
border-style: solid;
border-color: red;
}
.mm > li {
display: inline-block;
}
.mm > li > a {
display: inline-block;
padding: 8px;
}
.sm a {
display: block;
padding: 8px;
}
.mm > li > a:hover + .sm,
.sm:hover {
visibility: visible;
}
.mm a {
text-decoration: none;
color: #FFF;
}
.mm a:hover {
text-decoration: underline;
color: yellow;
}
<nav>
<ul class="mm">
<li><a href="#" title="#">AAA</a></li><!--
--><li><a href="#" title="#">BBB</a>
<ul class="sm">
<li><a href="#" title="#">SUB</a></li><!--
--><li><a href="#" title="#">SUB</a></li><!--
--><li><a href="#" title="#">SUB</a></li>
</ul>
</li><!--
--><li><a href="#" title="#">CCC</a>
<ul class="sm">
<li><a href="#" title="#">SUB</a></li><!--
--><li><a href="#" title="#">SUB</a></li><!--
--><li><a href="#" title="#">SUB</a></li>
</ul>
</li>
</ul>
</nav>
<h1>CSS NAVIGATION</h1>
在我正在处理的网站部分中,我有一个包含三个部分的 NAV 元素:关于、投资组合、联系人。我试图做到这一点,以便当您将鼠标悬停在“投资组合”部分时,会出现一个下拉菜单,允许您在其他两个部分之间进行选择,"Writing Samples" 和 "Photoshop." 我正在尝试仅使用 CSS.
这是我的 HTML 部分:
<nav>
<ul>
<li>
<a href="index.html" >About</a>
</li>
<li class="subNav">
<a class="selected" >Portfolio</a>
<ul>
<li><a href="writing_samples.html">Writing Samples</a></li>
<li><a href="photoshop.html">Photoshop</a></li>
</ul>
</li>
<li>
<a href="contact.html">Contact</a>
</li>
</ul>
</nav>
和CSS:
nav {
position: absolute;
bottom: 0;
right: 0;
padding: 10px 0;
}
nav ul {
list-style: none;
margin: 0 10px;
padding: 0;
}
nav li {
display: inline-block;
}
nav a {
font-weight: 800;
padding: 15px 10px;
}
nav ul li.subNav ul {
display: none;
}
nav ul li.subNav:hover ul {
display: block;
}
我已经做到了,当我将鼠标悬停在投资组合列表项上时,您会看到生成的列表项 "Writing Samples" 和 "Photoshop",只是它将这两项显示为原始无序列表,并将 "Portfolio" 列表项移到其余项之上。我希望 "Writing Samples" 和 "Photoshop" 垂直显示在 "Portfolio" 下方,但我无法用 CSS 解决这个问题。
这是它的基础知识:
nav {
position: absolute;
padding: 10px 0;
}
nav ul {
list-style: none;
;
padding: 0;
}
nav > ul > li {
display: inline-block;
position: relative;
border: 1px solid lightgreen;
/* for demo */
}
nav a {
font-weight: 800;
padding: 5px 10px;
display: block;
}
nav > ul > li.subNav ul {
display: none;
position: absolute;
top: 100%;
left: 0;
white-space: nowrap;
background: pink;
}
nav ul li.subNav:hover ul {
display: block;
}
<nav>
<ul>
<li>
<a href="index.html">About</a>
</li>
<li class="subNav">
<a class="selected">Portfolio</a>
<ul>
<li><a href="writing_samples.html">Writing Samples</a>
</li>
<li><a href="photoshop.html">Photoshop</a>
</li>
</ul>
</li>
<li>
<a href="contact.html">Contact</a>
</li>
</ul>
</nav>
父 li
被赋予 position:relative
以提供定位上下文。
子菜单绝对定位,在父菜单的底部 li
并左对齐。
请注意,我使用了 直接子选择器 >
来仅定位我想要的元素。
然后,由于子菜单太宽而无法包含在父菜单的宽度内,我添加了 white-space:nowrap
以便文本按要求排列。
你的想法是对的;下面 HTML 中的注释标签用于删除 "li" 元素之间的 space。
我没有使用 display:none,而是使用 visibility: hidden 来达到 S.E.O 目的。
即使您使用 position: absolute,您也应该使用 z-index,以便在菜单元素与其他内容重叠时能够被点击。
.mm,
.sm {
list-style: none;
}
.mm {
position: relative;
margin: 0px;
padding: 0px;
background-color: #000;
border-bottom: 4px solid red;
}
.sm {
position: absolute;
z-index: 1;
visibility: hidden;
background-color: #000;
border-width: 0px 4px 4px 4px;
border-style: solid;
border-color: red;
}
.mm > li {
display: inline-block;
}
.mm > li > a {
display: inline-block;
padding: 8px;
}
.sm a {
display: block;
padding: 8px;
}
.mm > li > a:hover + .sm,
.sm:hover {
visibility: visible;
}
.mm a {
text-decoration: none;
color: #FFF;
}
.mm a:hover {
text-decoration: underline;
color: yellow;
}
<nav>
<ul class="mm">
<li><a href="#" title="#">AAA</a></li><!--
--><li><a href="#" title="#">BBB</a>
<ul class="sm">
<li><a href="#" title="#">SUB</a></li><!--
--><li><a href="#" title="#">SUB</a></li><!--
--><li><a href="#" title="#">SUB</a></li>
</ul>
</li><!--
--><li><a href="#" title="#">CCC</a>
<ul class="sm">
<li><a href="#" title="#">SUB</a></li><!--
--><li><a href="#" title="#">SUB</a></li><!--
--><li><a href="#" title="#">SUB</a></li>
</ul>
</li>
</ul>
</nav>
<h1>CSS NAVIGATION</h1>