📜  更改导航动画反应原生 - Javascript (1)

📅  最后修改于: 2023-12-03 15:40:11.940000             🧑  作者: Mango

更改导航动画反应原生 - Javascript

简介

在网页开发中,导航菜单是一个非常重要的组件。为了提升用户体验,我们通常会给导航菜单添加一些动画效果。但是,很多前端框架提供的动画效果并不是原生的,这就会影响性能和动画的流畅度。因此,在本文中,我们将介绍如何更改导航动画反应原生,提升用户体验。

步骤
1. 选择合适的动画库

在更改导航动画反应原生之前,我们需要选择一个合适的动画库。这里推荐使用 anime.js,它是一个高度可配置、轻量级的 JavaScript 动画库,支持 CSS 属性、SVG、DOM 属性和 JavaScript 对象。

2. 导航菜单基本样式设计

在实现导航动画前,需要先定义好导航菜单的基本样式,包括菜单项样式、选中样式等。在本例中,我们的导航菜单样式如下:

.nav {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 50px;
}
.nav-item {
  margin: 0 10px;
  cursor: pointer;
}
.nav-item.active {
  color: #fff;
  background-color: #ff5a5f;
  border-radius: 5px;
}
3. 定义导航动画

在选择好动画库并定义好样式后,就可以开始编写导航动画了。在本例中,我们使用的是 anime.js。动画效果为:点击菜单项时,当前菜单项向下扩散,其他菜单项向上收缩。代码如下:

const nav = document.querySelector('.nav')
const navItems = Array.from(nav.querySelectorAll('.nav-item'))

// 定义动画
function animate(current) {
  return anime({
    targets: navItems,
    translateY: (_, i) => {
      const distance = i - current
      return distance === 0 ? 0 : distance < 0 ? '-100%' : '100%'
    },
    opacity: (_, i) => i === current ? 1 : 0.5,
    easing: 'easeOutCubic',
    duration: 500
  })
}

// 绑定事件
navItems.forEach((item, i) => {
  item.addEventListener('click', () => {
    // 取消前一个动画
    anime.running.forEach(animation => animation.pause())

    // 执行新的动画
    animate(i).play()
    item.classList.add('active')
  })
})
4. 完整代码

完整代码如下:

<!DOCTYPE html>
<html>
<head>
  <title>更改导航动画反应原生 - Javascript</title>
  <style>
    .nav {
      display: flex;
      justify-content: center;
      align-items: center;
      height: 50px;
    }
    .nav-item {
      margin: 0 10px;
      cursor: pointer;
    }
    .nav-item.active {
      color: #fff;
      background-color: #ff5a5f;
      border-radius: 5px;
    }
  </style>
</head>
<body>
  <div class="nav">
    <div class="nav-item active">Home</div>
    <div class="nav-item">About</div>
    <div class="nav-item">Contact</div>
    <div class="nav-item">Blog</div>
  </div>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js"></script>
  <script>
    const nav = document.querySelector('.nav')
    const navItems = Array.from(nav.querySelectorAll('.nav-item'))

    // 定义动画
    function animate(current) {
      return anime({
        targets: navItems,
        translateY: (_, i) => {
          const distance = i - current
          return distance === 0 ? 0 : distance < 0 ? '-100%' : '100%'
        },
        opacity: (_, i) => i === current ? 1 : 0.5,
        easing: 'easeOutCubic',
        duration: 500
      })
    }

    // 绑定事件
    navItems.forEach((item, i) => {
      item.addEventListener('click', () => {
        // 取消前一个动画
        anime.running.forEach(animation => animation.pause())

        // 执行新的动画
        animate(i).play()
        item.classList.add('active')
      })
    })
  </script>
</body>
</html>
总结

本文介绍了如何使用 anime.js 更改导航动画反应原生。在实际开发项目时,我们也可以根据项目需求选择不同的动画库来实现导航动画。但是,无论使用哪个动画库,都需要保证它的可靠性和性能。同时,我们还可以通过 CSS3 动画来实现导航动画,这个可以当作进阶的学习内容。