如何解决如何在 CSS 中对齐下拉列表 使用 JS 的基本示例
我正在制作一个网站,我想制作一个下拉列表,但我遇到了麻烦。 我想做这样的事情:
选项A选项B选项C选项D选项E
还有一个带有 4 个选项的 B 的下拉列表,但是当我这样做时,它看起来像这样:
选项 A 选项 B
.....................选项1
………………选项2
………………选项3
........................选项 4
.........................................选项 C 选项 D 选项 E
这是我的代码:
.option {
display: inline-block;
}
.option>li {
display: inline;
}
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<nav>
<ul>
<div class="option">
<li><a href="#">Home</a></li>
<li><a href="#">Services</a>
<ul>
<li><a href="#">3D</a>
<li><a href="#">2D</a>
<li><a href="#">Websites</a>
<li><a href="#">IT help</a>
</ul>
</li>
</div>
<div class="option">
<li><a href="#">gallery</a>
<li><a href="#">Contact</a>
<li><a href="#">About Me</a>
</div>
</ul>
</nav>
</body>
</html>
</nav>
解决方法
重组你的 HTML
- 关闭您的
li
标签。确保您正确关闭它们,例如 这:<li><a href="#">Home</a></li>
- 将所有顶级菜单项(主页、服务、图库、联系人、关于我)嵌入一个
ul
你的 HTML 应该是这样的
<nav>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">Services</a>
<ul>
<li><a href="#">3D</a></li>
<li><a href="#">2D</a></li>
<li><a href="#">Websites</a></li>
<li><a href="#">IT help</a></li>
</ul>
</li>
<li><a href="#">Gallery</a></li>
<li><a href="#">Contact</a></li>
<li><a href="#">About Me</a></li>
</ul>
</nav>
添加样式
- 向服务
li
添加一个类以表明它是一个下拉列表。我叫我的dropdown
- 使用
list-style: none; padding: 0;
删除每个列表项上那些讨厌的点 - 要水平排列顶层
ul
,通过在display: flex;
上应用ul
使其成为弹性盒。我还会添加flex-wrap: none;
以确保列表不会尝试在小屏幕上包装其元素。 - 我建议给 flexbox 的每个元素一个恒定的宽度,并按照你喜欢的方式对齐文本。我用了
width: 80px; text-align: center;
- 最后,通过将内部
ul
的display
设置为none
来隐藏下拉列表的元素。并通过将display
设置为block
来显示下拉列表。我使用open
类做到了这一点
ul {
list-style: none;
padding: 0;
}
nav > ul {
display: flex;
flex-wrap: none;
}
nav > ul > li {
width: 80px;
text-align: center;
}
nav > ul > li.dropdown > ul > * {
display: none;
}
nav > ul > li.dropdown.open > ul > * {
display: block;
}
<nav>
<ul>
<li><a href="#">Home</a></li>
<li class="dropdown"><a href="#">Services</a>
<ul>
<li><a href="#">3D</a></li>
<li><a href="#">2D</a></li>
<li><a href="#">Websites</a></li>
<li><a href="#">IT help</a></li>
</ul>
</li>
<li><a href="#">Gallery</a></li>
<li><a href="#">Contact</a></li>
<li><a href="#">About Me</a></li>
</ul>
</nav>
添加互动
现在,如果您想要真正展开子菜单,我建议您使用 JavaScript。在上面的代码片段中,您需要做的就是将任何 open
上的 li
类切换为 dropdown
类。
有无限的可能性,但最好的起点是 W3 Schools tutorial on building clickable dropdown menus。阅读此 W3 tutorial on building accessible flyout menues 时也请注意无障碍功能。
这是关于构建 CSS only accessible dropdown menu 的教程;虽然我建议坚持使用 JS 解决方案,因为它们更通用。
使用 JS 的基本示例
const dropdownMenuItems = document.querySelectorAll("li.dropdown");
const toggleDropdown = (e,el) => {
if (e.target.classList.contains("dropdown-control")) {
el.classList.toggle("open");
}
};
dropdownMenuItems.forEach((el) => {
el.addEventListener("click",(e) => toggleDropdown(e,el));
});
ul {
list-style: none;
padding: 0;
}
nav > ul {
display: flex;
flex-wrap: none;
}
nav > ul > li {
width: 80px;
text-align: center;
}
nav > ul > li.dropdown > ul > * {
display: none;
}
nav > ul > li.dropdown.open > ul > * {
display: block;
}
<nav>
<ul>
<li><a href="#">Home</a></li>
<li class="dropdown"><a href="#" class="dropdown-control">Services</a>
<ul>
<li><a href="#">3D</a></li>
<li><a href="#">2D</a></li>
<li><a href="#">Websites</a></li>
<li><a href="#">IT help</a></li>
</ul>
</li>
<li><a href="#">Gallery</a></li>
<li><a href="#">Contact</a></li>
<li><a href="#">About Me</a></li>
</ul>
</nav>
结束想法
我保持样式非常简单。你当然可以随意设计。似乎您主要是在问如何正确安排。
如果服务 a
标签的行为不像链接,则将其更改为 button
可能是有意义的。这对于屏幕阅读器了解如何处理该元素很重要。
您可以使用 2 个选项和网格区域类来实现
const dropdownMenuItems = document.querySelectorAll("li.dropdown");
const toggleDropdown = (e,el) => {
if (e.target.classList.contains("dropdown-control")) {
el.classList.toggle("open");
}
document.getElementById("option2").classList.toggle("opt")
};
dropdownMenuItems.forEach((el) => {
el.addEventListener("click",el));
});
.menu {
display: grid;
grid-template-columns: repeat(2,auto);
grid-template-rows: repeat(2,1fr);
list-style: none;
justify-content: flex-start;
}
.option1,.option2 {
display: flex;
}
.option1 > li,.option2 > li {
margin: 10px;
}
.option1 {
grid-area: 1 / 1 / 2 / 2;
justify-self: end;
}
.opt{
grid-area: 2 / 2 / 3 / 3;
}
ul {
list-style: none;
padding: 0;
}
nav > ul {
display: flex;
flex-wrap: none;
}
nav > ul .option1 > > li {
width: 80px;
text-align: center;
}
nav > ul > .option1 > li.dropdown > ul > * {
display: none;
}
nav > ul > .option1 > li.dropdown.open > ul > * {
display: block;
}
<nav>
<ul class="menu">
<div class="option1">
<li><a href="#">Home</a></li>
<li class="dropdown"><a class="dropdown-control" href="#">Services</a>
<ul>
<li><a href="#">3D</a>
<li><a href="#">2D</a>
<li><a href="#">Websites</a>
<li><a href="#">IT help</a>
</ul>
</li>
</div>
<div id="option2" class="option2">
<li><a href="#">Gallery</a>
<li><a href="#">Contact</a>
<li><a href="#">About Me</a>
</div>
</ul>
</nav>
我会这样做:它有点裸,但它有效。我会让每个 li
都拥有 option
的类并去掉 div
以使其更加一致和简单。此外,您遗漏了所有的结束 li
标签,这让一些事情变得一团糟。我还添加了一个简单的 :hover
机制,以便当您将鼠标悬停在它上面时它会隐藏和显示。
.option {
display: inline-block;
vertical-align: top;
width: 75px;
margin: 0;
padding: 0;
}
.dropdown {
display: none;
padding: 0;
list-style-type: none;
}
.contains-dropdown:hover > .dropdown{
display: block
}
option>li {
display: inline;
}
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<nav>
<ul>
<li class="option"><a href="#">Home</a></li>
<li class="option contains-dropdown">
<a href="#">Services</a>
<ul class="dropdown">
<li><a href="#">3D</a></li>
<li><a href="#">2D</a></li>
<li><a href="#">Websites</a></li>
<li><a href="#">IT help</a></li>
</ul>
</li>
<li class="option"><a href="#">Gallery</a></li>
<li class="option"><a href="#">Contact</a></li>
<li class="option"><a href="#">About Me</a></li>
</ul>
</nav>
</body>
</html>
</nav>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。