Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
使用CSS过渡和JavaScript实现平滑可切换导航栏_创想鸟

使用CSS过渡和JavaScript实现平滑可切换导航栏

使用css过渡和javascript实现平滑可切换导航栏

本教程详细介绍了如何利用CSS的`transform`和`transition`属性,结合简洁的JavaScript代码,创建一个具备平滑滑动效果的可切换导航栏。文章将从HTML结构、CSS样式定义到JavaScript交互逻辑进行全面解析,并强调了使用类切换实现动态效果的简洁性与高效性,同时提供了代码示例和开发中的最佳实践。

实现平滑可切换导航栏:CSS过渡与JavaScript类切换

在现代网页设计中,可切换的导航栏(通常称为“汉堡菜单”或“抽屉菜单”)是提升用户体验和优化响应式布局的关键组件。本教程将指导您如何通过结合CSS的过渡效果和简单的JavaScript类切换,实现一个从顶部平滑滑入/滑出的导航菜单。这种方法避免了复杂的第三方库,让您能更好地理解其核心原理。

核心原理:CSS过渡与JavaScript类切换

实现平滑动画效果的关键在于利用CSS的transition属性来定义元素属性变化时的动画效果,以及transform属性来改变元素的位置、大小或旋转。通过JavaScript,我们只需简单地添加或移除一个CSS类,就能触发这些定义好的动画。

具体来说,我们将定义两种状态:

立即学习“Java免费学习笔记(深入)”;

隐藏状态:导航栏位于视口之外(例如,通过transform: translateY(-100%)将其向上移动100%自身高度),并且高度为0。显示状态:导航栏恢复到正常位置(transform: translateY(0)),并设定其应有的高度。

CSS的transition属性将确保从隐藏到显示(或反之)的属性变化是平滑的动画过程,而非瞬时跳变。

HTML 结构设计

首先,我们需要定义导航栏的HTML结构,包括一个触发切换的按钮和实际的导航菜单容器。

    
WHEN YOU NEED A HAMMER TO SOLVE YOUR PROBLEMS

HTML结构注意事项:

唯一ID的使用: 在HTML中,id属性应是唯一的。如果您的页面中存在多个相同id的元素(例如,原代码中的id=”navbuttoning”被重复使用),这会导致JavaScript选择器行为异常,并且不符合HTML规范。对于需要重复样式或行为的元素,应优先使用class属性。在本示例中,我们移除了重复的id。语义化标签: 尽可能使用具有语义的HTML标签,例如nav用于导航链接,button用于可点击按钮。虽然本例使用了div作为导航容器,但在实际项目中,nav标签会更具语义性。

CSS 样式与动画实现

接下来,我们为导航栏和切换按钮定义样式,并设置关键的过渡动画。

/* 导航切换按钮容器 */.nav-toggle{   text-align:center;   height:4px; /* 这个高度可能需要根据实际布局调整 */   font-size: 16px;   border: none;   cursor: pointer;   display: table; /* 示例中用于垂直居中,可根据需要调整 */}/* 导航切换按钮 */.btn-nav{    margin-top:30px;    margin-bottom:30px;    margin-right:20px;    margin-left:20px;    padding-left:20px;    padding-right:20px;    justify-content: center;    text-align:center;    background-color: #ECC596;    align-items:center;    color: white;    font-size: 16px;    border: none;    cursor: pointer;    display:table-cell; /* 示例中用于垂直居中,可根据需要调整 */    vertical-align:center;    border-radius:25px;    z-index:15; /* 确保按钮在其他内容之上 */}/* 导航菜单容器的初始(隐藏)状态 */.navigationSect{    box-sizing:border-box;    display:flex;    flex-direction:row;    justify-content:center;    vertical-align: top;    width: 100vw;    /* opacity:100%; */ /* 初始状态不应有opacity,或设为0 */    z-index:-10; /* 确保隐藏时在其他内容之下 */    height:0px; /* 初始高度为0,使其不可见 */    /* 初始位置:向上平移100%自身高度,使其位于视口上方 */    transform: translateY(-100%);     /* 定义过渡效果:transform和height属性变化时,0.3秒内平滑过渡 */    transition: transform ease-out .3s, height ease-out .3s;     /* 优化:可以将多个transition属性合并为一个 */    /* transition: transform 0.3s ease-out, height 0.3s ease-out; */    text-align:center;    margin:0px;    padding:0px;    list-style-type:0;    overflow: hidden; /* 隐藏超出高度的内容 */}/* 导航菜单容器的打开(显示)状态 */.navigationSect.is-open{    transform: translateY(0); /* 恢复到正常位置 */    height:100px; /* 设定导航栏的可见高度 */    z-index: 10; /* 确保打开时在其他内容之上 */}/* 导航菜单内的按钮样式 */.nav-btn{    z-index:0;    display: inline-block;    position:relative;    vertical-align: top;    height: 100%;    opacity:100%;    width:25vw;    color:white;    font-size:20px;    background:none;    box-sizing: border-box;    border: 0px solid #ccc;    font-family: 'Cormorant Garamond', serif;       transition: background-image 1s;            background-image:linear-gradient(#26373E,#26373e);}.nav-btn:hover{    background-image:linear-gradient(#26373e,#ECC596);}

CSS样式注意事项:

transform 和 transition: transform: translateY(-100%)将元素向上移动其自身高度的100%,使其从视口顶部消失。当.is-open类被添加时,transform: translateY(0)将其带回原位。transition属性定义了这些变化如何平滑地发生。height: 0 和 height: [desired-height]: 结合transform使用height属性可以更好地控制元素的可见区域,并防止在过渡过程中出现滚动条或内容溢出。overflow: hidden也很重要。z-index: 确保导航栏在隐藏时位于页面内容的下方(z-index: -10),而在显示时位于上方(z-index: 10),避免遮挡或被遮挡。合并 transition 属性: 为了代码的简洁性,可以将多个transition属性合并为一个,例如transition: transform 0.3s ease-out, height 0.3s ease-out;。

JavaScript 交互逻辑

最后,我们编写简洁的JavaScript代码来监听按钮点击事件,并切换导航菜单容器的is-open类。

// 获取导航切换按钮元素const toggleButton = document.querySelector(".btn-nav");// 获取导航菜单容器元素const navigationSection = document.querySelector(".navigationSect");// 为按钮添加点击事件监听器toggleButton.addEventListener("click", () => {    // 切换 .navigationSect 元素的 'is-open' 类    // 如果存在则移除,如果不存在则添加    navigationSection.classList.toggle("is-open");});

JavaScript逻辑注意事项:

document.querySelector(): 这是获取单个元素的标准方法。我们通过类名.btn-nav和.navigationSect精确地选择了目标元素。addEventListener(‘click’, …): 这是为元素添加事件监听器的标准方法。当toggleButton被点击时,回调函数将被执行。classList.toggle(“is-open”): 这是实现切换功能的关键。它会检查navigationSection元素是否含有is-open类。如果含有,则移除它;如果不含有,则添加它。这完美地匹配了我们的CSS设计,每次点击都会在隐藏和显示状态之间切换。避免复杂库: 对于这种简单的切换功能,使用classList.toggle()比引入一个复杂的第三方库要高效得多,也更容易理解和维护。原代码中尝试使用的库虽然功能强大,但对于此场景显得过于重量级且容易引入逻辑错误(例如为同一按钮绑定了show和hide两个独立的事件)。

完整示例代码

为了方便您测试,这里是整合了HTML、CSS和JavaScript的完整代码片段。您可以将其保存为.html文件并在浏览器中打开。

            平滑可切换导航栏教程                body {            margin: 0;            font-family: 'Cormorant Garamond', serif;            overflow-x: hidden; /* 防止横向滚动条 */        }        .motto-header {            background-color: #333;            color: white;            text-align: center;            padding: 10px 0;        }        .site-header {            display: flex;            justify-content: space-between;            align-items: center;            padding: 10px 20px;            background-color: #f0f0f0;            border-bottom: 1px solid #ccc;        }        .site-title a {            text-decoration: none;            color: #26373E;        }        .site-title h1 {            margin: 0;            font-size: 24px;        }        /* 导航切换按钮容器 */        .nav-toggle{           text-align:center;           /* height:4px; */ /* 根据实际布局调整,这里可能不需要固定高度 */           font-size: 16px;           border: none;           cursor: pointer;           /* display: table; */ /* 移除,除非有特定布局需求 */        }        /* 导航切换按钮 */        .btn-nav{            margin-top:30px;            margin-bottom:30px;            margin-right:20px;            margin-left:20px;            padding:10px 20px; /* 简化padding */            background-color: #ECC596;            color: white;            font-size: 16px;            border: none;            cursor: pointer;            border-radius:25px;            z-index:15; /* 确保按钮在其他内容之上 */            outline: none; /* 移除点击时的焦点框 */        }        /* 导航菜单容器的初始(隐藏)状态 */        .navigationSect{            box-sizing:border-box;            display:flex;            flex-direction:row;            justify-content:center;            align-items: center; /* 垂直居中导航项 */            width: 100vw;            z-index:-10; /* 确保隐藏时在其他内容之下 */            height:0px; /* 初始高度为0,使其不可见 */            background-color: #26373e; /* 导航菜单背景色 */            position: absolute; /* 使其脱离文档流,可以自由定位 */            top: 0; /* 从顶部开始 */            left: 0;            /* 初始位置:向上平移100%自身高度,使其位于视口上方 */            transform: translateY(-100%);             /* 定义过渡效果:transform和height属性变化时,0.3秒内平滑过渡 */            transition: transform 0.3s ease-out, height 0.3s ease-out;             text-align:center;            margin:0px;            padding:0px;            list-style-type:none; /* 移除列表样式 */            overflow: hidden; /* 隐藏超出高度的内容 */        }        /* 导航菜单容器的打开(显示)状态 */        .navigationSect.is-open{            transform: translateY(100%); /* 恢复到正常位置,向下移动100% */            /* 注意:如果navigationSect是position:absolute; top:0;,               则 translateY(100%) 会使其紧接在它原本应该在的位置之下,               通常我们希望它从顶部滑入,覆盖内容。               如果希望它从顶部滑入,覆盖在内容上方,并且占据一定高度,               可以调整为:               transform: translateY(0);               height: 100px;               top: 0;               或者               transform: translateY(calc(100% + [header height]));               让它滑到header下方。               这里为了演示方便,假设它从顶部滑入,占据100px高度。            */            height:100px; /* 设定导航栏的可见高度 */            z-index: 10; /* 确保打开时在其他内容之上 */        }        /* 导航菜单内的按钮样式 */        .nav-btn{            z-index:0;            display: inline-block;            position:relative;            height: 100%; /* 按钮高度与父容器一致 */            width:25vw; /* 每个按钮占据25%视口宽度 */            color:white;            font-size:20px;            background:none;            box-sizing: border-box;            border: 0px solid #ccc;            font-family: 'Cormorant Garamond', serif;               transition: background-image 1s;                    background-image:linear-gradient(#26373E,#26373e);            cursor: pointer;            outline: none;        }        .nav-btn:hover{            background-image:linear-gradient(#26373e,#ECC596);        }        .banner {            height: 500px; /* 示例内容,以便观察导航栏效果 */            background-color: lightblue;            display: flex;            justify-content: center;            align-items: center;            font-size: 3em;            color: #26373e;        }        
WHEN YOU NEED A HAMMER TO SOLVE YOUR PROBLEMS
const toggleButton = document.querySelector(".btn-nav"); const navigationSection = document.querySelector(".navigationSect"); toggleButton.addEventListener("click", () => { navigationSection.classList.toggle("is-open"); });

重要更新说明:在完整示例代码中,为了实现导航栏从顶部滑入并覆盖内容的效果,对.navigationSect的CSS进行了调整:

添加了position: absolute; top: 0; left: 0;使其脱离文档流并定位在视口顶部。.navigationSect.is-open中的transform从translateY(0)调整为translateY(100%)。这是因为当navigationSect的top为0时,translateY(100%)会使其向下移动自身高度的100%,从而显示在页面中。如果希望它从页面顶部边缘完全滑入,覆盖在header下方,则需要更精细的计算,例如transform: translateY(var(–header-height));并定义CSS变量。当前设置实现了从屏幕顶部滑入的效果,但会覆盖一部分内容。

注意事项与最佳实践

1

以上就是使用CSS过渡和JavaScript实现平滑可切换导航栏的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1532897.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
利用jQuery和CSS动态管理元素选中状态的教程
上一篇 2025年12月21日 00:06:55
解决TensorFlow.js Node.js后端安装错误的完整指南
下一篇 2025年12月21日 00:07:04

相关推荐

  • edge浏览器如何找回被“睡眠标签页”休眠的页面_Edge浏览器找回睡眠标签页方法

    被休眠的Edge标签页可通过点击激活恢复;若页面丢失,可从历史记录中找回;为防止再次发生,建议关闭“睡眠标签页”功能。 如果您在使用Edge浏览器时发现某些标签页被自动休眠导致内容消失或无法查看,这通常是由于“睡眠标签页”功能为了节省系统资源而将不活跃的标签页暂停。以下是恢复这些被休眠页面的操作方法…

    2026年9月21日
    300
  • Java中高效查找时空事件重叠的方法

    本文探讨了在Java中高效查找具有空间和时间范围定义的事件之间重叠的解决方案。核心思想是将时空事件编码为二维矩形,然后利用专业的空间索引结构(如R树、四叉树或PH树)进行快速查询。通过这种方法,可以显著提升在大规模数据集中识别事件重叠的效率,并提供了使用Tinspin索引库的示例代码和实践建议。 时…

    2026年9月21日
    000
  • PHPComposer怎么安装_PHPComposer依赖管理工具安装与使用指南

    PHPComposer是PHP的依赖管理工具,类似npm或pip。需先安装PHP,再下载并验证composer-setup.php,执行安装生成composer.phar,推荐全局安装至/usr/local/bin/composer,运行composer –version验证。使用com…

    2026年9月21日
    000
  • 怎么用VSCode编HTML_VSCodeHTML开发基础与实时预览设置教程

    答案是配置Emmet、安装Live Server等插件并优化设置可大幅提升VSCode中HTML开发效率。具体包括:使用Emmet缩写快速生成HTML结构,如输入!后按Tab键生成完整HTML5模板;安装Live Server实现保存后浏览器自动刷新的实时预览;开启“保存时格式化”功能保持代码整洁;…

    2026年9月21日
    000
  • UC浏览器网页截图工具在哪里_UC浏览器网页截图功能入口

    1、打开UC浏览器点击右上角三点菜单,查找“截屏”选项即可截图;2、部分版本支持双指下滑手势或通过分享功能保存为图片;3、建议更新至最新版以获取完整截图功能。 如果您在浏览网页时需要快速保存当前页面的内容,但找不到UC浏览器的截图功能入口,可能是由于界面更新或功能隐藏导致操作路径不明确。以下是找到并…

    2026年9月21日
    000
  • 如何为iPhone12ProMax下载固件?快速获取方法分享

    首先通过苹果官方开发者中心、第三方固件网站或iTunes/Finder获取iPhone 12 Pro Max的正确固件文件,确保来源可靠并校验完整性,再进行系统降级或修复操作。 如果您尝试为您的iPhone 12 Pro Max进行系统降级或修复系统错误,但无法找到合适的固件文件,则可能是由于下载渠…

    2026年9月21日
    000
  • tiktok网络使用链接 tiktok网页版入口地址

    TikTok网页版入口地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来TikTok网页版入口地址,感兴趣的网友一起随小编来瞧瞧吧! https://www.tiktok.com 1、提供多样化的短视频内容,涵盖生活记录、才艺展示等多个领域。 2、界面设计简洁直观,用户可以快速上手并流畅…

    2026年9月21日
    200
  • 使用EventBus实现Android实时速度显示与后台保存教程

    本教程详细介绍了如何在Android应用中实现实时速度的显示与后台保存功能。通过利用前台服务(Foreground Service)获取位置数据,并结合EventBus库实现服务与UI界面(MainActivity)之间的实时数据通信,确保即使应用处于后台或屏幕关闭时,速度数据也能持续更新并显示在用…

    2026年9月21日
    000
  • 在Java中如何分析异常堆栈性能开销

    异常堆栈在高并发场景下开销显著,因JVM需遍历调用栈、创建对象、字符串拼接及同步操作,频繁使用将增加GC压力与CPU消耗;可通过JMH测试量化影响,发现填充堆栈耗时可达清空的10倍以上;建议避免在热点代码抛异常、禁用非必要堆栈填充、按需打印日志、使用异步日志框架,并借助JFR、Profiler和GC…

    2026年9月21日
    000
  • PHP/MySQL:高效合并订单商品并按日期分组显示

    本教程将指导如何在PHP/MySQL应用中,将同一日期的订单商品合并显示在同一行,以提高数据展示的清晰度。核心解决方案是利用MySQL的GROUP_CONCAT函数在数据库层面进行高效聚合,避免复杂的PHP逻辑处理,从而简化代码并优化性能。 订单数据展示的常见挑战 在开发在线购物平台时,通常需要向用…

    2026年9月21日
    100
  • google浏览器CPU占用率过高怎么解决_google浏览器CPU占用过高解决方法

    Chrome CPU占用过高可通过清除缓存、禁用高耗能扩展、结束高占用进程、更新浏览器、关闭硬件加速及禁用Software Reporter Tool解决。 如果您在使用Google Chrome浏览器时发现电脑运行缓慢或风扇狂转,很可能是由于Chrome的CPU占用率过高导致系统资源被大量消耗。以…

    2026年9月21日
    000
  • Java ConcurrentSkipListMap在并发场景下应用

    ConcurrentSkipListMap是基于跳跃表实现的线程安全有序映射,支持高并发读写与高效范围查询,适用于需排序的并发场景,如排行榜系统;相比ConcurrentHashMap,它提供有序性与导航操作,但插入查找为O(log n),内存开销较大,适合读多写少或需区间扫描的业务。 在高并发场景…

    2026年9月21日
    100
  • VSCode怎么启动Layui项目_VSCode运行Layui前端框架项目教程

    必须使用本地服务器运行Layui项目,因为直接打开HTML文件通过file://协议会受浏览器安全限制,导致AJAX、跨域等功能异常,Layui组件无法正常加载;推荐安装Node.js后使用npm全局安装http-server,通过命令行启动服务,或在VSCode中安装Live Server插件,右…

    2026年9月21日
    000
  • 俄罗斯Яндекс账号登录入口 Yandex电脑版官方网站登录

    答案是https://www.yandex.com/。该网站提供搜索、地图、新闻、翻译等服务,界面简洁,支持个性化设置与账户同步,并拥有邮箱、云存储及丰富的应用生态。 1、立即进入“☞☞☞☞点击俄罗斯yandex搜索引擎入口☜☜☜☜”; 2、立即进入“☞☞☞☞点击快速获取Yandex免登录官网链接☜…

    2026年9月21日
    000
  • 如何使用Ribbet的AI功能裁剪图片?快速实现精准图像裁剪

    答案:Ribbet的AI裁剪功能可快速智能识别主体并推荐裁剪方案,支持手动微调与多种比例选择,结合亮度、色彩等编辑工具优化效果,适用于制作符合社交媒体尺寸要求的封面图,操作简便且大部分功能免费,适合追求效率的普通用户。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepS…

    2026年9月21日
    400
  • Xdebug性能优化:解决PHP调试器导致页面加载缓慢或超时的问题

    当Xdebug配置不当,即使未主动调试,也可能导致PHP应用页面加载缓慢或超时。本文将深入探讨Xdebug的工作原理,指导如何通过正确配置xdebug.mode、排查多配置文件冲突,并利用Xdebug日志进行诊断,从而有效解决调试器造成的性能瓶颈,确保开发环境的流畅运行。 理解Xdebug的连接机制…

    2026年9月21日
    000
  • 谷歌浏览器官方主站入口 最新Chrome在线登录页面

    谷歌浏览器官方主站入口是https://www.google.com,该页面具备界面简洁、操作流畅、集成化服务入口和个性化推荐等特点,支持多设备访问且无广告干扰。 谷歌浏览器官方主站入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来谷歌浏览器最新Chrome在线登录页面相关信息,感兴趣的…

    2026年9月21日
    000
  • Java 正则表达式:查找双引号内所有指定字符串的出现次数

    本文旨在解决在 Java 中使用正则表达式查找双引号内特定字符串(例如 “variant”)的所有出现次数的问题。我们将提供一个完整的解决方案,包括正则表达式的构建、代码示例以及详细的解释,帮助开发者准确高效地完成此类任务。 在 Java 中,使用正则表达式查找字符串中特定模…

    2026年9月21日
    000
  • 《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文

    《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文

    来源:官方 Nintendo Switch™ 2平台游戏《人中之龙 极2》(预计2025年11月13日发售)数字版已于今日9月24日正式开启预购。 同时,《人中之龙 极》与《人中之龙 极2》的PlayStation®5及Xbox Series X|S版本将于2025年12月8日推出。此次新版本将新增…

    2026年9月21日 用户投稿
    000
  • 360浏览器如何查看版本号 360浏览器查看当前版本信息方法

    1、通过帮助与反馈菜单可查看360浏览器版本,点击右上角菜单→帮助和反馈→关于360安全浏览器,即可显示完整版本号及更新状态。 如果您需要确认当前使用的360浏览器具体版本,以便进行功能核对或问题排查,可以通过浏览器内置的菜单选项快速获取该信息。 本文运行环境:联想小新Pro 16,Windows …

    2026年9月21日
    1000

发表回复

登录后才能评论
关注微信