You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仿制OpenStax网站下拉菜单遇实现难题,寻求技术指导

问题:实现类似OpenStax样式的下拉菜单

我希望设计一个与OpenStax网站样式相似的下拉菜单,包含Subjects、Technology和What We Do三个板块。目前已完成锚点等元素的初步创建,但实现过程中遇到困难,恳请提供技术指导。以下是我编写的代码:

HTML代码

<nav class="navbar1">
    <img src="./Logo.png" alt="OpenStax logo" width="120px" height="30px" class="logo">
    <p class="navpara">Access. The future of education.</p>
    <div class="dropdownmenu">
        <button onclick="myFunction()" class="dropdownbtn">Subjects</button>
        <div id="mydropdown" class="dropdown-content">
            <a href="">All</a>
            <a href="">Business</a>
            <a href="">College Success</a>
            <a href="">Humanities</a>
            <a href="">Science</a>
            <a href="">Social Sciences</a>
        </div>
    </div>
    <div class="dropdownmenu">
        <button onclick="myFunction()" class="dropdownbtn">Technology</button>
        <div id="mydropdown" class="dropdown-content">
            <a href="">OpenStax Assignable</a>
            <a href="">OpenStax Kinetic</a>
            <a href="">OpenStax Technology Partners</a>
        </div>
    </div>
    <div class="dropdownmenu">
        <button onclick="myFunction()" class="dropdownbtn">What We do</button>
        <div id="mydropdown" class="dropdown-content">
            <a href="">About us</a>
            <a href="">Team</a>
            <a href="">Research</a>
            <a href="">K12 Books & Resources</a>
            <a href="">Institutional Partnership</a>
            <a href="">Technology Partnership</a>
            <a href="">Webinars</a>
        </div>
    </div>
    <Button class="givebtn">Give</Button>
    <button class="loginbtn">Login</button>
</nav>

CSS代码

.navbar1 {
    width: 100%;
    padding: 5px 0 5px 0;
    display: flex;
    align-items: center;
    justify-content: flex-start;
    background-color: white;
}
.logo {
    margin-right: 10px;
    padding-left: 60px;
}
.navpara {
    margin-right: 14rem;
}

.dropdownbtn {
    padding: 13px 16px;
    font-size: 16px;
    border: none;
    cursor: pointer;
    margin: 0 10px;
}

/* The container <div> - needed to position the dropdown content */
.dropdownmenu {
position: relative;
display: inline-block;
}

/* Dropdown Content (Hidden by Default) */
.dropdown-content {
display: none;
position: absolute;
min-width: 160px;
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
z-index: 1;
}

/* Links inside the dropdown */
.dropdown-content a {
color: black;
padding: 12px 16px;
text-decoration: none;
display: block;
}

.dropdown-content a:hover {
    background-color: #ddd;
}

.show {display:block;}

.givebtn {
    padding: 13px 30px;
    font-size: 16px;
    border: none;
    cursor: pointer;
    margin: 0 10px;
}

.loginbtn {
    padding: 13px 30px;
    font-size: 16px;
    border: none;
    cursor: pointer;
    margin: 0 10px;
}

JavaScript代码

function myFunction() {
    document.getElementById("mydropdown").classList.toggle("show");
}

window.onclick = function(event) {
    if (!event.target.matches('.dropdownbtn')) {
      var dropdowns = document.getElementsByClassName("dropdown-content");
      var i;
      for (i = 0; i < dropdowns.length; i++) {
        var openDropdown = dropdowns[i];
        if (openDropdown.classList.contains('show')) {
          openDropdown.classList.remove('show');
        }
      }
    }
}

修复方案及优化建议

1. 修复核心功能问题

原代码中所有下拉菜单共用同一个id="mydropdown",JavaScript通过getElementById只会选中第一个下拉菜单,导致点击不同按钮都只会打开第一个下拉。解决方法:

  • 移除重复的id,通过按钮的DOM关联关系获取对应下拉元素(更灵活)
  • 修改点击逻辑,确保每次只切换当前按钮对应的下拉菜单,同时关闭其他已打开的下拉

修改后的HTML和JS:

<!-- 移除下拉菜单的id,保留结构 -->
<div class="dropdownmenu">
    <button onclick="toggleDropdown(this)" class="dropdownbtn">Subjects</button>
    <div class="dropdown-content">
        <!-- 选项不变 -->
    </div>
</div>
<!-- 其他两个dropdownmenu结构一致 -->
function toggleDropdown(btn) {
    // 获取当前按钮的兄弟下拉元素
    const targetDropdown = btn.nextElementSibling;
    // 关闭所有其他已打开的下拉
    document.querySelectorAll('.dropdown-content.show').forEach(dropdown => {
        if (dropdown !== targetDropdown) dropdown.classList.remove('show');
    });
    // 切换当前下拉的显示状态
    targetDropdown.classList.toggle('show');
}

window.onclick = function(event) {
    // 点击区域不是按钮,也不是下拉菜单内部时,关闭所有下拉
    if (!event.target.matches('.dropdownbtn') && !event.target.closest('.dropdown-content')) {
        document.querySelectorAll('.dropdown-content.show').forEach(dropdown => {
            dropdown.classList.remove('show');
        });
    }
}

2. 样式优化(贴近OpenStax风格)

  • 调整导航栏布局,拆分左右区域,让视觉层次更清晰
  • 给按钮添加下拉箭头提示,hover时添加背景色
  • 优化下拉菜单的阴影、圆角和过渡效果
  • 给右侧的Give和Login按钮添加主题色样式

修改后的CSS:

.navbar1 {
    width: 100%;
    padding: 8px 0;
    display: flex;
    align-items: center;
    justify-content: space-between;
    background-color: #ffffff;
    box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.nav-left {
    display: flex;
    align-items: center;
}
.nav-right {
    padding-right: 60px;
}
.logo {
    margin-right: 12px;
    padding-left: 60px;
}
.navpara {
    margin-right: 4rem;
    color: #666;
    font-size: 14px;
}

.dropdownbtn {
    padding: 10px 16px;
    font-size: 15px;
    border: none;
    cursor: pointer;
    background: transparent;
    color: #333;
    display: flex;
    align-items: center;
    gap: 4px;
    border-radius: 4px;
}
.dropdownbtn::after {
    content: "▼";
    font-size: 12px;
    opacity: 0.7;
}
.dropdownbtn:hover {
    background-color: #f5f5f5;
}

.dropdownmenu {
    position: relative;
    display: inline-block;
}

.dropdown-content {
    display: block;
    opacity: 0;
    visibility: hidden;
    position: absolute;
    top: 100%;
    left: 0;
    min-width: 200px;
    background-color: white;
    box-shadow: 0 4px 12px rgba(0,0,0,0.15);
    border-radius: 4px;
    z-index: 100;
    padding: 8px 0;
    transition: opacity 0.2s ease, visibility 0.2s ease;
}

.dropdown-content a {
    color: #333;
    padding: 10px 16px;
    text-decoration: none;
    display: block;
    font-size: 15px;
}

.dropdown-content a:hover {
    background-color: #f0f0f0;
}

.show {
    opacity: 1;
    visibility: visible;
}

.givebtn {
    padding: 10px 24px;
    font-size: 15px;
    border: none;
    cursor: pointer;
    background-color: #007bff;
    color: white;
    border-radius: 4px;
    margin: 0 8px;
}
.givebtn:hover {
    background-color: #0056b3;
}

.loginbtn {
    padding: 10px 24px;
    font-size: 15px;
    border: 1px solid #ccc;
    cursor: pointer;
    background-color: white;
    border-radius: 4px;
    margin: 0 8px;
}
.loginbtn:hover {
    border-color: #007bff;
    color: #007bff;
}

对应的HTML结构调整:

<nav class="navbar1">
    <div class="nav-left">
        <img src="./Logo.png" alt="OpenStax logo" width="120px" height="30px" class="logo">
        <p class="navpara">Access. The future of education.</p>
        <div class="dropdownmenu">
            <button onclick="toggleDropdown(this)" class="dropdownbtn">Subjects</button>
            <div class="dropdown-content">
                <a href="">All</a>
                <a href="">Business</a>
                <a href="">College Success</a>
                <a href="">Humanities</a>
                <a href="">Science</a>
                <a href="">Social Sciences</a>
            </div>
        </div>
        <div class="dropdownmenu">
            <button onclick="toggleDropdown(this)" class="dropdownbtn">Technology</button>
            <div class="dropdown-content">
                <a href="">OpenStax Assignable</a>
                <a href="">OpenStax Kinetic</a>
                <a href="">OpenStax Technology Partners</a>
            </div>
        </div>
        <div class="dropdownmenu">
            <button onclick="toggleDropdown(this)" class="dropdownbtn">What We do</button>
            <div class="dropdown-content">
                <a href="">About us</a>
                <a href="">Team</a>
                <a href="">Research</a>
                <a href="">K12 Books & Resources</a>
                <a href="">Institutional Partnership</a>
                <a href="">Technology Partnership</a>
                <a href="">Webinars</a>
            </div>
        </div>
    </div>
    <div class="nav-right">
        <Button class="givebtn">Give</Button>
        <button class="loginbtn">Login</button>
    </div>
</nav>

内容的提问来源于stack exchange,提问作者Wahid Ahmad Rustaqi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:55:54