jQuery 导航自动跟随滚动的实现代码

jQuery 导航自动跟随滚动是一种常见的页面交互效果,它可以使页面导航栏在用户滚动页面时自动跟随滚动并保持固定位置。下面是实现这个效果的详细攻略:

1.添加导航栏

首先,在 HTML 文件中添加一个导航栏,通常是一个 ul 列表,其中包含若干个 li 子项。

<nav>
  <ul>
    <li><a href="#section1">Section1</a></li>
    <li><a href="#section2">Section2</a></li>
    <li><a href="#section3">Section3</a></li>
  </ul>
</nav>

2.为导航栏添加样式

为导航栏添加样式,使其具有固定位置和样式。

nav {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  background-color: #FFF;
  box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.2);
  z-index: 100;
}
nav ul {
  margin: 0;
  padding: 0;
  list-style: none;
  display: flex;
  justify-content: space-between;
  align-items: center;
  height: 50px;
}
nav li {
  margin: 0;
  padding: 0;
}
nav a {
  display: block;
  line-height: 50px;
  padding: 0 15px;
  color: #333;
}

3.监听页面滚动事件

使用 jQuery 监听页面滚动事件,当页面滚动时,计算当前滚动位置所在的页面区域,并将对应的导航项添加 .active 样式。

$(window).scroll(function() {
  var scrollTop = $(this).scrollTop();
  var scrollHeight = $(document).height();
  var windowHeight = $(this).height();
  $('nav a').each(function() {
    var href = $(this).attr('href');
    var targetTop = $(href).offset().top;
    var targetHeight = $(href).height();
    if (scrollTop >= targetTop && scrollTop < targetTop + targetHeight) {
      $(this).addClass('active');
    } else {
      $(this).removeClass('active');
    }
  });
});

4.添加动画效果

使用 jQuery 的 .animate() 方法为导航栏添加动画效果,使其在滚动时平滑过渡。

$(window).scroll(function() {
  var scrollTop = $(this).scrollTop();
  var scrollHeight = $(document).height();
  var windowHeight = $(this).height();
  $('nav a').each(function() {
    var href = $(this).attr('href');
    var targetTop = $(href).offset().top;
    var targetHeight = $(href).height();
    if (scrollTop >= targetTop && scrollTop < targetTop + targetHeight) {
      $(this).addClass('active');
    } else {
      $(this).removeClass('active');
    }
  });
  $('nav').stop().animate({top: scrollTop}, 500);
});

示例说明

示例一:简单的单页网站

在这个示例中,我们使用上面的攻略实现了一个简单的单页网站,网站包含三个部分,每个部分都是一个 div 元素,用于演示导航栏跟随滚动的效果。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>jQuery 导航自动跟随滚动示例一</title>
  <style>
    nav {
      position: fixed;
      top: 0;
      left: 0;
      width: 100%;
      background-color: #FFF;
      box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.2);
      z-index: 100;
    }
    nav ul {
      margin: 0;
      padding: 0;
      list-style: none;
      display: flex;
      justify-content: space-between;
      align-items: center;
      height: 50px;
    }
    nav li {
      margin: 0;
      padding: 0;
    }
    nav a {
      display: block;
      line-height: 50px;
      padding: 0 15px;
      color: #333;
    }
    #section1 {
      height: 500px;
      background-color: #EEE;
    }
    #section2 {
      height: 500px;
      background-color: #DDD;
    }
    #section3 {
      height: 500px;
      background-color: #CCC;
    }
  </style>
</head>
<body>
  <nav>
    <ul>
      <li><a href="#section1">Section1</a></li>
      <li><a href="#section2">Section2</a></li>
      <li><a href="#section3">Section3</a></li>
    </ul>
  </nav>
  <div id="section1">Section1</div>
  <div id="section2">Section2</div>
  <div id="section3">Section3</div>
  <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
  <script>
    $(window).scroll(function() {
      var scrollTop = $(this).scrollTop();
      var scrollHeight = $(document).height();
      var windowHeight = $(this).height();
      $('nav a').each(function() {
        var href = $(this).attr('href');
        var targetTop = $(href).offset().top;
        var targetHeight = $(href).height();
        if (scrollTop >= targetTop && scrollTop < targetTop + targetHeight) {
          $(this).addClass('active');
        } else {
          $(this).removeClass('active');
        }
      });
      $('nav').stop().animate({top: scrollTop}, 500);
    });
  </script>
</body>
</html>

示例二:带有子菜单的导航栏

在这个示例中,我们对导航栏进行了扩展,添加了子菜单,并对攻略进行了适当的修改,使其可以处理子菜单,并且在滚动到子菜单区域时高亮其父菜单。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>jQuery 导航自动跟随滚动示例二</title>
  <style>
    nav {
      position: fixed;
      top: 0;
      left: 0;
      width: 100%;
      background-color: #FFF;
      box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.2);
      z-index: 100;
    }
    nav ul {
      margin: 0;
      padding: 0;
      list-style: none;
      display: flex;
      justify-content: space-between;
      align-items: center;
      height: 50px;
    }
    nav li {
      margin: 0;
      padding: 0;
      position: relative;
    }
    nav a {
      display: block;
      line-height: 50px;
      padding: 0 15px;
      color: #333;
    }
    nav ul ul {
      position: absolute;
      top: 100%;
      left: 0;
      background-color: #FFF;
      box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.2);
      z-index: 200;
      display: none;
    }
    nav ul li:hover ul {
      display: block;
    }
    nav ul ul li {
      width: 200px;
      border-bottom: 1px solid #DDD;
    }
    nav ul ul li:last-child {
      border-bottom: none;
    }
    nav ul ul a {
      line-height: 30px;
      padding: 0 15px;
    }
    nav ul ul ul {
      left: 100%;
      top: 0;
      padding-left: 10px;
    }
    nav ul ul li:hover > a {
      background-color: #EEE;
    }
    nav a.active {
      background-color: #EEE;
    }
  </style>
</head>
<body>
  <nav>
    <ul>
      <li><a href="#section1">Section1</a></li>
      <li>
        <a href="#">Section2</a>
        <ul>
          <li><a href="#section2-1">Section2-1</a></li>
          <li>
            <a href="#">Section2-2</a>
            <ul>
              <li><a href="#section2-2-1">Section2-2-1</a></li>
              <li><a href="#section2-2-2">Section2-2-2</a></li>
            </ul>
          </li>
          <li><a href="#section2-3">Section2-3</a></li>
        </ul>
      </li>
      <li><a href="#section3">Section3</a></li>
    </ul>
  </nav>
  <div id="section1">Section1</div>
  <div id="section2">
    <h2>Section2</h2>
    <div id="section2-1">Section2-1</div>
    <div id="section2-2">
      <h3>Section2-2</h3>
      <div id="section2-2-1">Section2-2-1</div>
      <div id="section2-2-2">Section2-2-2</div>
    </div>
    <div id="section2-3">Section2-3</div>
  </div>
  <div id="section3">Section3</div>
  <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
  <script>
    $(window).scroll(function() {
      var scrollTop = $(this).scrollTop();
      var scrollHeight = $(document).height();
      var windowHeight = $(this).height();
      $('nav a').each(function() {
        var href = $(this).attr('href');
        var targetTop = $(href).offset().top;
        var targetHeight = $(href).height();
        if (scrollTop >= targetTop && scrollTop < targetTop + targetHeight) {
          $(this).addClass('active');
          $(this).parents('li').children('a').addClass('active');
          $(this).parents('li').parents('ul').children('li').children('a').not($(this).parents('li').children('a')).removeClass('active');
        } else {
          $(this).removeClass('active');
        }
      });
      $('nav').stop().animate({top: scrollTop}, 500);
    });
  </script>
</body>
</html>

通过对这两个示例的对比,我们可以看到,在网站中添加导航自动跟随滚动效果不仅可以提升用户体验,还可以改善网站的整体风格和设计。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jQuery 导航自动跟随滚动的实现代码 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Java异常类型介绍及处理方法

    Java异常类型介绍及处理方法 什么是Java异常 Java异常是程序中出现问题的信号,可以用来指示程序中的错误。它们在程序中自动抛出,也可以使用 throw 关键字手动抛出。在程序中处理异常时,可以使用 try-catch 块来处理异常并且避免程序崩溃。Java中的异常分为两种类型:受检异常和非受检异常。 受检异常 受检异常(Checked Excepti…

    Java 2023年5月26日
    00
  • 使用IDEA配置Mybatis-Plus框架图文详解

    下面是使用IDEA配置Mybatis-Plus框架的完整攻略。 步骤一:创建Maven项目并导入依赖 首先,我们需要在IDEA中创建一个Maven项目。创建项目后,我们需要在pom.xml文件中添加Mybatis-Plus相关的依赖。 <dependencies> <dependency> <groupId>com.bao…

    Java 2023年5月20日
    00
  • struts1登录示例代码_动力节点Java学院整理

    Struts1登录示例代码攻略 简介 Struts1 是一个 Web 应用程序的 MVC 框架,通过使用 Struts1 框架,可以更加方便地管理 Web 应用程序中的各个模块,提高代码的重用性和可维护性。本文将介绍使用 Struts1 实现登录功能的示例代码。 实现步骤 本示例的实现步骤如下: 创建登录页面 login.jsp 创建 Struts1 配置文…

    Java 2023年5月20日
    00
  • 详解hibernate双向多对多关联映射XML与注解版

    关于“详解hibernate双向多对多关联映射XML与注解版”的攻略,我将从以下几个方面进行详细讲解: 双向多对多关联映射的概念与要素 Hibernate双向多对多关联映射XML版的实现步骤及示例 Hibernate双向多对多关联映射注解版的实现步骤及示例 接下来我会一一进行详细讲解。 一、双向多对多关联映射的概念与要素 双向多对多关联映射,指的是两个实体类…

    Java 2023年5月19日
    00
  • 详解Java中native方法的使用

    详解Java中native方法的使用 什么是native方法 在Java中,native方法是指使用C、C++等非Java语言实现的方法,通常用于Java程序中需要与底层操作系统或硬件等交互的场景,比如操作系统中调用一些API,访问硬件等。 使用native方法 在Java中使用native方法需要以下步骤: 声明native方法,以告诉编译器该方法的实现不…

    Java 2023年5月26日
    00
  • Java8 Stream API 详细使用方法与操作技巧指南

    Java8 Stream API 详细使用方法与操作技巧指南 什么是Java8 Stream API Java8 Stream是用于处理集合数据的新操作API,提供了一种更加便捷的、并行化的数据处理方式。它可以优雅地处理数据集合中的数据,也可以高效地并行处理大量的数据。 Stream 本身是不存储数据的,其操作也不会改变源数据,相反,Stream 的每一个操…

    Java 2023年5月26日
    00
  • 如何实现线程安全的单例模式?

    以下是关于如何实现线程安全的单例模式的完整使用攻略: 什么是线程安全的单例模式? 线程安全单例模式是指在多线程环境下,保证有一个实例对象被创建,并且多个线程可以同时访问该实例对象,而不会出现数据不一致或程序崩溃等问题。在多线程编程中,线程安全的单例模式是非常重要的,因为多个线程同时访问单例对象,会出现线程间争用的问题,导致数据不一致或程序崩溃。 如何实现线程…

    Java 2023年5月12日
    00
  • spirngmvc js传递复杂json参数到controller的实例

    下面是关于“Spring MVC中如何传递复杂JSON参数到Controller”的完整攻略,包含两个示例说明。 Spring MVC中如何传递复杂JSON参数到Controller 在Spring MVC中,我们可以使用AJAX来传递复杂JSON参数到Controller。本文将介绍如何实现这一功能。 示例1:使用@RequestBody注解 1. 编写前…

    Java 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部