0

0

实现滚动时显示/隐藏导航栏并激活导航链接的教程

霞舞

霞舞

发布时间:2025-10-08 14:26:02

|

355人浏览过

|

来源于php中文网

原创

实现滚动时显示/隐藏导航栏并激活导航链接的教程

本文档旨在提供一个实现以下功能的教程:导航栏在页面滚动时自动显示和隐藏,并且导航链接根据当前视口位置以及点击事件动态激活。我们将使用 HTML、CSS 和 JavaScript(包含 jQuery)来实现这些效果。通过本文,你将学习如何监听滚动事件、动态修改 CSS 样式以及处理导航链接的激活状态。

导航栏滚动显示/隐藏

实现导航栏在滚动时显示和隐藏的关键在于监听 window.onscroll 事件,并根据当前滚动位置与之前滚动位置的比较来动态修改导航栏的 top 样式属性。

var prevScrollpos = window.pageYOffset;

window.onscroll = function() {
  var currentScrollPos = window.pageYOffset;
  if (prevScrollpos > currentScrollPos) {
    document.getElementById("navbarSection").style.top = "0";
  } else {
    document.getElementById("navbarSection").style.top = "-70px";
  }
  prevScrollpos = currentScrollPos;
};

这段代码首先获取页面初始的滚动位置 prevScrollpos。然后在 window.onscroll 函数中,获取当前的滚动位置 currentScrollPos,并将其与 prevScrollpos 进行比较。如果 prevScrollpos 大于 currentScrollPos,说明用户向上滚动,此时将导航栏的 top 属性设置为 "0",使其显示。反之,如果用户向下滚动,则将 top 属性设置为 "-70px",使其隐藏。最后,更新 prevScrollpos 为 currentScrollPos,以便下一次滚动时进行比较。

注意事项:

ONLYOFFICE
ONLYOFFICE

用ONLYOFFICE管理你的网络私人办公室

下载
  • 确保你的导航栏元素具有 id="navbarSection" 属性,以便 JavaScript 代码能够找到它。
  • 根据你的导航栏高度调整 -70px 的值。
  • 为了使过渡效果更平滑,可以在 CSS 中为导航栏添加 transition 属性。

激活导航链接

激活导航链接需要两个功能:一是点击导航链接时,平滑滚动到对应的 section,并激活该链接;二是页面滚动时,根据当前视口位置,自动激活对应的导航链接。

点击激活

以下代码使用 jQuery 实现点击导航链接时的平滑滚动和激活效果:

$(document).ready(function() {
  $(document).on("scroll", onScroll);

  //smoothscroll
  $(".navbar-toggler").on("click", function(e) {
    e.preventDefault();
    $(document).off("scroll");

    $(".closeIcon").on("click", function(e) {
      $(this).removeClass("active");
    });
    $(this).addClass("active");

    var target = $(this).parents("div.container-fluid").find(".navbar-brand").attr("href")
    menu = target;
    $target = $(target);
    $("html, body")
      .stop()
      .animate({
          scrollTop: $target.offset().top + 2,
        },
        500,
        "swing",
        function() {
          window.location.hash = target;
          $(document).on("scroll", onScroll);
        }
      );
  });
});

这段代码首先在文档加载完成后,绑定 scroll 事件到 onScroll 函数。然后,监听导航链接的 click 事件。当点击链接时,首先阻止默认行为,然后移除所有导航链接的 active 类,并为当前点击的链接添加 active 类。接着,使用 animate 函数实现平滑滚动到目标 section 的效果。在滚动完成后,更新 URL 的 hash 值,并重新绑定 scroll 事件。

注意事项:

  • 确保引入 jQuery 库。
  • e.preventDefault() 用于阻止默认的链接跳转行为。
  • $(document).off("scroll") 和 $(document).on("scroll", onScroll) 用于在滚动过程中暂停和恢复滚动事件的监听,避免冲突。
  • 500 是动画的持续时间,可以根据需要调整。
  • swing 是动画的缓动函数,也可以选择其他缓动函数。

滚动激活

以下代码实现页面滚动时,根据当前视口位置自动激活对应的导航链接:

function onScroll(event) {
  var scrollPos = $(document).scrollTop();
  $("#navbarSection a").each(function() {
    var currLink = $(this);
    var refElement = $(currLink.attr("href"));
    if (
      refElement.position().top <= scrollPos &&
      refElement.position().top + refElement.height() > scrollPos
    ) {
      $("#navbarSection ul li a").removeClass("active");
      currLink.addClass("active");
    } else {
      currLink.removeClass("active");
    }
  });
}

这段代码首先获取当前的滚动位置 scrollPos。然后,遍历所有的导航链接。对于每个链接,获取其 href 属性对应的 section 元素。如果该 section 元素在视口范围内,则移除所有导航链接的 active 类,并为当前链接添加 active 类。否则,移除当前链接的 active 类。

注意事项:

  • 确保每个导航链接的 href 属性与对应的 section 元素的 id 属性一致。
  • refElement.position().top 获取 section 元素相对于文档顶部的距离。
  • refElement.height() 获取 section 元素的高度。

完整示例代码

以下是完整的 HTML、CSS 和 JavaScript 示例代码:





  
  
  Navbar Scroll & Active
  
  
  




  

  
Hero Section
Work Section
About Us Section
Service Section
Contact Section
* {
  margin: 0px;
  padding: 0px;
  box-sizing: border-box;
  font-family: 'Poppins', sans-serif !important;
}

#navbarSection {
  position: sticky !important;
  top: 0; /* 添加此行 */
  background: white !important;
  transition: all .25s ease-in-out 0s !important;
  z-index: 1000; /* 确保导航栏在其他内容之上 */
}

Section {
  margin-bottom: 150px;
  height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center; /* 水平居中内容 */
  font-size: 2em; /* 增大字体,更易于查看滚动效果 */
}

.blue-button {
  padding: 12px 24px !important;
  background-color: #3130F2 !important;
  border-radius: 37px !important;
  color: white !important;
  font-weight: 700 !important;
}

.blue-button:hover {
  background-color: #FECD00 !important;
  /* color: #3130F2 !important; */
  transition: all .25s ease-in-out 0s !important;
}

.closeButton {
  background-color: rgba(254, 205, 0, 0.4);
  /* border: none; */
  border: 1px solid transparent;
  border-radius: 10px;
}

.closeButton:hover {
  background-color: rgba(254, 205, 0, 0.8);
  /* background-color: rgba(49, 48, 242, 0.5) ; */
  /* border: none; */
  border: 1px solid #3130f2;
  border-radius: 10px;
}

.offcanvas-backdrop.show {
  opacity: 0.8;
}

.offcanvas-backdrop {
  background-color: #8E90A6;
}

.closeIcon {
  width: 40px;
  height: 40px;
}

.nav-link {
  padding: 0px !important;
  font-weight: 400;
  font-size: 20px !important;
  line-height: 40px !important;
  letter-spacing: 0.08em !important;
}

.nav-link:hover {
  color: #3130F2 !important;
  border-bottom-left-radius: 0%;
  border-bottom-right-radius: 0%;
  border-bottom: 3px solid #FECD00 !important;
  cursor: pointer !important;
  transition: all .18s ease-in-out 0s !important;
}

.nav-item:active a {
  background-color: #8E90A6 !important;
}

.navbar-nav .nav-link.active,
.navbar-nav .show>.nav-link {
  color: #3130F2 !important;
  font-weight: 600;
  border-radius: 37px;
  border-bottom-left-radius: 0%;
  border-bottom-right-radius: 0%;
  border-bottom: 3px solid #FECD00;
}

.btn:hover {
  border-color: transparent !important;
}
var prevScrollpos = window.pageYOffset;

window.onscroll = function() {
  var currentScrollPos = window.pageYOffset;
  if (prevScrollpos > currentScrollPos) {
    document.getElementById("navbarSection").style.top = "0";
  } else {
    document.getElementById("navbarSection").style.top = "-70px";
  }
  prevScrollpos = currentScrollPos;
};

$(document).ready(function() {
  $(document).on("scroll", onScroll);

  //smoothscroll
  $(".navbar-toggler").on("click", function(e) {
    e.preventDefault();
    $(document).off("scroll");

    $(".closeIcon").on("click", function(e) {
      $(this).removeClass("active");
    });
    $(this).addClass("active");

    var target = $(this).parents("div.container-fluid").find(".navbar-brand").attr("href")
    menu = target;
    $target = $(target);
    $("html, body")
      .stop()
      .animate({
          scrollTop: $target.offset().top + 2,
        },
        500,
        "swing",
        function() {
          window.location.hash = target;
          $(document).on("scroll", onScroll);
        }
      );
  });
});

function onScroll(event) {
  var scrollPos = $(document).scrollTop();
  $("#navbarSection a").each(function() {
    var currLink = $(this);
    var refElement = $(currLink.attr("href"));
    if (
      refElement.position().top <= scrollPos &&
      refElement.position().top + refElement.height() > scrollPos
    ) {
      $("#navbarSection ul li a").removeClass("active");
      currLink.addClass("active");
    } else {
      currLink.removeClass("active");
    }
  });
}

总结:

通过以上步骤,你可以实现导航栏在滚动时自动显示和隐藏,并且导航链接根据当前视口位置以及点击事件动态激活。这个教程提供了一个基础的实现,你可以根据自己的需求进行修改和扩展。例如,你可以添加更多的导航链接和 section,或者修改动画效果和样式。记住,理解代码背后的逻辑是关键,这样才能更好地应用和定制这些技术。

Close Icon

相关文章

Windows激活工具
Windows激活工具

Windows激活工具是正版认证的激活工具,永久激活,一键解决windows许可证即将过期。可激活win7系统、win8.1系统、win10系统、win11系统。下载后先看完视频激活教程,再进行操作,100%激活成功。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
jquery插件有哪些
jquery插件有哪些

jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

150

2023.09.12

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

jquery删除元素的方法
jquery删除元素的方法

jquery可以通过.remove() 方法、 .detach() 方法、.empty() 方法、.unwrap() 方法、.replaceWith() 方法、.html('') 方法和.hide() 方法来删除元素。更多关于jquery相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

395

2023.11.10

jQuery hover()方法的使用
jQuery hover()方法的使用

hover()是jQuery中一个常用的方法,它用于绑定两个事件处理函数,这两个函数将在鼠标指针进入和离开匹配的元素时执行。想了解更多hover()的相关内容,可以阅读本专题下面的文章。

504

2023.12.04

jquery实现分页方法
jquery实现分页方法

在jQuery中实现分页可以使用插件或者自定义实现。想了解更多jquery分页的相关内容,可以阅读本专题下面的文章。

182

2023.12.06

jquery中隐藏元素是什么
jquery中隐藏元素是什么

jquery中隐藏元素是非常重要的一个概念,在使用jquery隐藏元素之前,需要先了解css样式中关于元素隐藏的属性,比如display、visibility、opacity等属性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

120

2024.02.23

jquery中什么是高亮显示
jquery中什么是高亮显示

jquery中高亮显示是指对页面搜索关键词时进行高亮显示,其实现办法:1、先获取要高亮显示的行,获取搜索的内容,再遍历整行内容,最后添加高亮颜色;2、使用“jquery highlight”高亮插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

176

2024.02.23

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

38

2026.01.13

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

CSS教程
CSS教程

共754课时 | 24.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号