使用CSS实现,带有动态浮动高亮效果的导航菜单

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
  <style>
    *{
        margin:0;
        padding:0;
        box-sizing: border-box;
    }

    body {
        background:#f5f7fa;
        padding:40px;
    }

    .nav{
        position: relative;
        display: inline-flex;
        padding: 8px;
        background:#1e293b;
        border-radius: 12px;
        box-shadow: 0 2px 12px rgba(0, 0, 0, 0.3);
    }

    .nav-item{
        padding: 16px 24px;
        color:#94a3b8;
        font-size:14px;
        font-weight:500;
        white-space:nowrap;
        border-radius: 8px;
        transition: all 0.2s;
        cursor: pointer;
    }

    .nav-item:hover{
        color:#f1f5f9;
        background:#334155;
        anchor-name:--item-target;
    }

    .nav::after{
    content:'';
    position: absolute;
    inset: 0;
    position-anchor: --item-target;
    inset: anchor(inside, 0);
    outline: 2px solid #38BDF8;
    outline-offset:-2px;
    background-color: rgb(from #38BDF8 r g b / 0.15);
    transition: 0.2s;
    pointer-events: none;
    border-radius: 8px;
    opacity: 0;
    }


    .nav:has(.nav-item:hover)::after {
    opacity: 1;
    }

</style>
</head>
<body>
    <nav class="nav">
        <div class="nav-item">JavaScript</div>
        <div class="nav-item">React</div>
        <div class="nav-item">Vue3</div>
        <div class="nav-item">TypeScript</div><div class="nav-item">Node.js</div>
    </nav>
</body>
</html>

1. 创新的锚点定位技术

复制代码
.nav-item:hover {
    anchor-name: --item-target;
}
.nav::after {
    position-anchor: --item-target;
    inset: anchor(inside, 0);
}
  • 使用了CSS Anchor Positioning API

  • 将hover的菜单项设置为锚点(--item-target)

  • 伪元素(高亮框)通过锚点定位到当前hover的菜单项位置

2. 精妙的状态管理

复制代码
.nav:has(.nav-item:hover)::after {
    opacity: 1;
}
  • 使用:has()伪类检测是否有菜单项被hover

  • 只有hover时才显示高亮框,默认隐藏

  • 避免了JavaScript的事件监听

3. 现代化的视觉效果

复制代码
background-color: rgb(from #38BDF8 r g b / 0.15);
outline: 2px solid #38BDF8;
outline-offset: -2px;

4. 流畅的交互体验

复制代码
transition: all 0.2s;
  • 高亮框的移动和显隐都有0.2秒的过渡动画

  • 菜单项文字颜色和背景也有平滑过渡

5. 纯CSS解决方案

整个效果完全使用CSS实现,无需任何JavaScript代码,体现了CSS现代特性的强大能力。

相关推荐
linux_cfan20 分钟前
17 · 引擎适配器全景:HLS/DASH/Vimeo/Mux/Cast
前端·javascript·音视频
计算机魔术师1 小时前
烧掉2780亿美元还不够?OpenAI的资本豪赌让人头皮发麻
前端
IT_陈寒2 小时前
Java线程池用错参数,我的服务居然悄悄崩溃了
前端·人工智能·后端
卡布鲁2 小时前
React useMemo 与 useCallback 完全指南:原理、场景与避坑
前端·react.js
碳基修炼2 小时前
排查记:本地 devServer 是 http,浏览器却把 302 重定向升级成了 https
前端·http
步行cgn2 小时前
Spring p 命名空间注入详解
java·前端·spring
何何____2 小时前
Vue 生命周期详解
前端·javascript
江米小枣tonylua3 小时前
TypeScript 全面の拥抱 !Prisma 8 + Electron 升级实战
前端
闪耀之光M783 小时前
npm命令解析
前端
咸鱼老弟3 小时前
AI Agent 的"自主性悖论"——为什么给它的自由度越大,越要配一套更硬的护栏
前端·人工智能