返回列表 发布新帖

[网站源码] HTML&CSS :如此优雅丝滑的导航栏,你不看看吗?

45 0
发表于 2025-2-6 11:29:38 | 查看全部 阅读模式
这段代码创建了一个动态的导航栏,通过 CSS 技术实现了按钮的激活和悬停效果,以及动态背景效果,为页面添加了视觉吸引力和用户交互体验。


大家复制代码时,可能会因格式转换出现错乱,导致样式失效。建议先少量复制代码进行测试,若未能解决问题,私信我,我会发送完整的压缩包给你

演示效果
d142fc7049534d94badb2cb9ac3930c0.gif

HTML&CSS
  1. <!DOCTYPE html>
  2. <html lang="en">

  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>公众号关注:前端Hardy</title>
  7.     <style>
  8.         body {
  9.             margin: 0;
  10.             padding: 0;
  11.             background-color: #075985;
  12.             display: flex;
  13.             align-items: center;
  14.             justify-content: center;
  15.             height: 100vh;
  16.         }

  17.         nav {
  18.             --_width: 50px;
  19.             --_padding: 1rem;
  20.             --_speed: 300ms;
  21.             --_f-size: 1.5rem;
  22.             --_clr-border: rgba(255, 255, 255, .3);
  23.             --_clr-bg-rgb: 2, 6, 23;
  24.             --_clr-f: rgb(255, 255, 255);

  25.             display: flex;
  26.             border: 1px solid var(--_clr-border);
  27.             border-radius: 20px;
  28.             padding-inline: var(--_padding);
  29.             background-color: rgb(var(--_clr-bg-rgb));
  30.             position: relative;
  31.             isolation: isolate;
  32.         }

  33.         @media (min-width: 600px) {
  34.             nav {
  35.                 --_width: 100px;
  36.                 --_f-size: 2rem;
  37.             }
  38.         }

  39.         button {
  40.             border: none;
  41.             padding: none;
  42.             background: transparent;
  43.             color: var(--_clr-f);
  44.             cursor: pointer;
  45.             font-size: var(--_f-size) !important;
  46.             width: var(--_width);
  47.             aspect-ratio: 3/2;
  48.             opacity: 0.5;
  49.             transition:
  50.                 opacity var(--_speed) ease-in-out,
  51.                 width var(--_speed) ease-in-out;
  52.             display: grid;
  53.             place-content: center;
  54.         }

  55.         button>span {
  56.             scale: var(--_speed) ease-in-out;
  57.             font-size: 14px;
  58.         }

  59.         button.active,
  60.         button:hover {
  61.             opacity: 1;
  62.         }

  63.         button.active>span,
  64.         button:hover>span {
  65.             scale: 1.15;
  66.             pointer-events: none;
  67.         }

  68.         nav::before,
  69.         nav::after {
  70.             content: '';
  71.             position: absolute;
  72.             top: -25%;
  73.             left: var(--_padding);
  74.             width: var(--_width);
  75.             aspect-ratio: 1;
  76.             z-index: -1;
  77.             border-top: 1px solid var(--_clr-border);
  78.             border-bottom: 1px solid var(--_clr-border);
  79.             border-radius: 999px;
  80.             transform: translateX(calc(var(--_x, 2) * 100%));
  81.             transition:
  82.                 transform var(--_speed) ease-in-out,
  83.                 width var(--_speed) ease-in-out,
  84.                 opacity var(--_speed) ease-in-out;
  85.         }

  86.         nav::before {
  87.             --_x: var(--_x-active);
  88.             background-color: rgb(var(--_clr-bg-rgb));
  89.         }

  90.         nav::after {
  91.             --_x: var(--_x-hover);
  92.             background-color: rgba(var(--_clr-bg-rgb), .4);
  93.             opacity: 0;
  94.         }

  95.         nav:has(button:nth-child(1).active)::before {
  96.             --_x-active: 0;
  97.         }

  98.         nav:has(button:nth-child(2).active)::before {
  99.             --_x-active: 1;
  100.         }

  101.         nav:has(button:nth-child(3).active)::before {
  102.             --_x-active: 2;
  103.         }

  104.         nav:has(button:nth-child(4).active)::before {
  105.             --_x-active: 3;
  106.         }

  107.         nav:has(button:nth-child(5).active)::before {
  108.             --_x-active: 4;
  109.         }

  110.         nav:has(button:nth-child(1):hover)::after {
  111.             --_x-hover: 0;
  112.             opacity: 1;
  113.         }

  114.         nav:has(button:nth-child(2):hover)::after {
  115.             --_x-hover: 1;
  116.             opacity: 1;
  117.         }

  118.         nav:has(button:nth-child(3):hover)::after {
  119.             --_x-hover: 2;
  120.             opacity: 1;
  121.         }

  122.         nav:has(button:nth-child(4):hover)::after {
  123.             --_x-hover: 3;
  124.             opacity: 1;
  125.         }

  126.         nav:has(button:nth-child(5):hover)::after {
  127.             --_x-hover: 4;
  128.             opacity: 1;
  129.         }
  130.     </style>
  131. </head>

  132. <body>
  133.     <nav>
  134.         <button type="button"><span class="">首页</span></button>
  135.         <button type="button"><span class="">钱包</span></button>
  136.         <button type="button"><span class=" active">金融</span></button>
  137.         <button type="button"><span class="">商城</span></button>
  138.         <button type="button"><span class="">我的</span></button>
  139.     </nav>
  140.     <script>
  141.         document.querySelector("nav").addEventListener("click", (e) => {
  142.             if (e.target.tagName == "BUTTON") {
  143.                 document.querySelector("nav .active").classList.remove("active");
  144.                 e.target.classList.add("active");
  145.             }
  146.         });
  147.     </script>
  148. </body>

  149. </html>
复制代码


HTML 结构

body: 包含页面的可见内容。
nav: 创建一个 nav 元素,用于包含导航栏的各个按钮。
五个 button: 每个 button 代表一个导航按钮,包含一个 span 元素显示按钮文本。
span: 显示按钮的文本内容。

CSS 样式

body: 设置页面的边距、填充、背景色、显示方式和对齐方式。
nav: 设置导航栏的样式,包括宽度、内边距、边框、圆角、背景色和位置。
@media (min-width: 600px): 媒体查询,当屏幕宽度大于 600px 时,调整导航栏的宽度和字体大小。
button: 设置按钮的样式,包括边框、背景、颜色、光标、字体大小、宽度、比例、透明度和过渡效果。
button>span: 设置按钮文本的样式,包括缩放和字体大小。
button.active, button:hover: 设置按钮在激活或悬停时的样式,包括透明度。
button.active>span, button:hover>span: 设置按钮文本在激活或悬停时的样式,包括缩放。
nav::before, nav::after: 设置导航栏的伪元素,用于创建动态背景效果。
nav::before: 设置导航栏的背景效果,包括位置、宽度、比例、边框、圆角和背景色。
nav::after: 设置导航栏的悬停背景效果,包括位置、宽度、比例、边框、圆角和背景色。
nav:has(button:nth-child(n).active)::before: 设置导航栏的背景效果,根据激活的按钮位置调整。
nav:has(button:nth-child(n):hover)::after: 设置导航栏的悬停背景效果,根据悬停的按钮位置调整。

JavaScript 部分

添加一个事件监听器,当点击导航栏中的按钮时,移除当前激活按钮的 active 类,并为被点击的按钮添加 active 类。
微信 支付宝

如果文章对您有帮助,欢迎打赏作者!

免责声明

本社区仅提供信息交流平台,帖子内容由用户自行发布,不代表社区立场。用户对发布内容负全责,包括版权、隐私、诽谤等,社区不承担因使用社区内容导致的损失。禁止发布侵权、隐私信息,发现侵权请联系我们。社区不负责第三方内容,用户因访问第三方内容产生的损失,社区不担责。用户须遵守规则和法律,不得发布违法、不当内容,违规内容将被删除。发表帖子即同意本声明,不同意请勿发帖。


特别提醒:网络空间并非法外之地,请广大用户自觉遵守法律法规,共同营造健康、文明、有序的网络环境。

本社区运营团队

联系我们: 如有疑问或发现违规行为,请联系管理员:kefu@foxccs.com

远方路灯明灭,银河倾斜,一斛星斗洒满天街。

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

投诉/建议联系

foxccs@qq.com

网站内容来源于网络,版权争议与本站无关。
请在下载后的24小时内从您的设备中彻底删除上述内容。

  • QQ交流群
  • 添加微信客服
Copyright © 2004-2025 九歌社区 版权所有 All Rights Reserved.
关灯 在本版发帖
扫一扫添加微信客服
官方QQ交流群
手机扫一扫访问
返回顶部
快速回复 返回顶部 返回列表