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

导航栏下拉菜单位置异常求助(CSS+React)

下拉菜单定位问题:Weapons悬停时下拉菜单位置错误

鼠标悬停导航栏中的“Weapons”链接时,下拉菜单可正常显示,但位置不在“Weapons”链接的正下方,需修正其定位。

悬停效果截图:
Weapons下拉菜单位置错误


相关代码

import React, { useState } from "react";
import { Link } from "react-router-dom";
import { MenuItems } from "./MenuItems";

const Dropdown = () => {
  const [click, setClick] = useState(false);

  const handleClick = () => setClick(!click);
  return (
    <div>
      <ul
        onClick={handleClick}
        className={click ? "dropdown-menu clicked" : "dropdown-menu"}
      >
        {MenuItems.map((item, index) => {
          return (
            <li key={index}>
              <Link
                className={item.cName}
                to={item.path}
                onClick={() => setClick(false)}
              >
                {item.title}
              </Link>
            </li>
          );
        })}
      </ul>
    </div>
  );
};

export default Dropdown;
import React, { useState } from "react";
import { Link } from "react-router-dom";
import { Button } from "./Button";
import Dropdown from "./Dropdown";
import EquipmentDropdown from "./EquipmentDropdown";
const Navbar = () => {
  const [click, setClick] = useState(false);
  const [dropdown, setDropdown] = useState(true);

  const handleClick = () => setClick(!click);

  const closeMobileMenu = () => setClick(false);

  const onMouseEnter = () => {
    if (window.innerWidth < 960) {
      setDropdown(false);
    } else {
      setDropdown(true);
    }
  };

  const onMouseLeave = () => {
    if (window.innerWidth < 960) {
      setDropdown(false);
    } else {
      setDropdown(false);
    }
  };

  return (
    <nav className="nav-bar">
      <Link to="/" className="site-name">
        Ready or Not Wiki
      </Link>

      <div className="menu-icon" onClick={handleClick}>
        <i className={click ? "fas fa-times" : "fas fa-bars"} />
      </div>
      <ul className={click ? "nav-menu active" : "nav-menu"}>
        <li className="nav-item">
          <Link to="/" className="nav-link" onClick={closeMobileMenu}>
            Home
          </Link>
        </li>
        <li className="nav-item">
          <Link to="/ammotypes" className="nav-link" onClick={closeMobileMenu}>
            Ammo
          </Link>
        </li>

        <li className="nav-item">
          <Link to="/armor" className="nav-link" onClick={closeMobileMenu}>
            Armor
          </Link>
        </li>
        <li className="nav-item">
          <Link
            to="/armormaterial"
            className="nav-link"
            onClick={closeMobileMenu}
          >
            Armor Material
          </Link>
        </li>
        <li className="nav-item">
          <Link
            to="/deployables"
            className="nav-link"
            onClick={closeMobileMenu}
          >
            Deployables
          </Link>
        </li>

        <li className="nav-item">
          <Link to="/headwear" className="nav-link" onClick={closeMobileMenu}>
            Headwear
          </Link>
        </li>
        <li className="nav-item">
          <Link to="/maps" className="nav-link" onClick={closeMobileMenu}>
            Maps
          </Link>
        </li>

        <li className="nav-item">
          <Link to="/missions" className="nav-link" onClick={closeMobileMenu}>
            Missions
          </Link>
        </li>
        <li className="nav-item">
          <Link to="/tacticals" className="nav-link" onClick={closeMobileMenu}>
            Tacticals
          </Link>
        </li>

        <li
          className="nav-item"
          onMouseEnter={onMouseEnter}
          onMouseLeave={onMouseLeave}
        >
          <div className="nav-link" onClick={closeMobileMenu}>
            Weapons <i className="fas fa-caret-down" />
          </div>
          {dropdown && <Dropdown />}
        </li>
        <li className="nav-item">
          <Link to="/world" className="nav-link" onClick={closeMobileMenu}>
            World
          </Link>
        </li>
      </ul>
      <Button />
    </nav>
  );
};

export default Navbar;

CSS代码

.dropdown-menu {
  width: 200px;
  position: absolute;
  top: 80px;
  list-style: none;
  text-align: start;
  /* right: 500px; */
}

.dropdown-menu li {
  background: #242222;
  cursor: pointer;
}

.dropdown-menu li:hover {
  background: #950000;
}

.dropdown-menu.clicked {
  display: none;
}

.dropdown-link {
  display: block;
  width: 100%;
  height: 100%;
  text-decoration: none;
  color: white;
  padding: 16px;
}
.nav-bar {
  background: linear-gradient(90deg, rgb(28, 27, 27) 0%, rgb(26, 23, 23) 100%);
  height: 80px;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 1.2rem;
}

.site-name {
  color: white;
  justify-self: start;
  cursor: pointer;
  text-decoration: none;
  font-size: 30px;
  display: flex;
  align-items: center;
}

.nav-menu {
  display: flex;
  list-style: none;
  text-align: center;
  width: 70vw;
  justify-content: flex-end;
  margin-right: 1rem;
}

.nav-item {
  display: flex;
  align-items: center;
  height: 80px;
}

.nav-link {
  color: white;
  text-decoration: none;
  padding: 0.5rem 1rem;
  cursor: pointer;
}

.nav-link:hover {
  background-color: #950000;
  border-radius: 4px;
  transition: all 0.2s ease-out;
}

.fa-bars {
  color: white;
}

.nav-link-mobile {
  display: none;
}

.menu-icon {
  display: none;
}
.btn {
  padding: 8px 20px;
  border-radius: 4px;
  outline: none;
  border: none;
  font-size: 18px;
  color: #fff;
  cursor: pointer;
  background-color: #950000;
}

.btn:hover {
  transition: all 0.3s ease-out;
  background-color: transparent;
  color: #fff;
  border-radius: 4px;
  border: 2px solid #950000;
}

解决方案

问题根源是绝对定位的参考元素错误:.dropdown-menu使用position: absolute,但父元素未设置相对定位,导致它以整个文档为基准定位。修改步骤如下:

  1. 给包含下拉菜单的.nav-item添加相对定位,让下拉菜单以它为参考:
.nav-item {
  display: flex;
  align-items: center;
  height: 80px;
  position: relative; /* 添加相对定位 */
}
  1. 调整.dropdown-menu的定位属性,使其紧贴父元素底部左侧:
.dropdown-menu {
  width: 200px;
  position: absolute;
  top: 100%; /* 改为100%,紧贴父元素底部 */
  left: 0; /* 对齐父元素左侧 */
  list-style: none;
  text-align: start;
  margin: 0; /* 移除默认margin避免偏移 */
  padding: 0; /* 移除默认padding */
}

修改后,下拉菜单会准确显示在“Weapons”链接的正下方。

内容的提问来源于stack exchange,提问作者Luke Bourneuf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:25:27