📅  最后修改于: 2023-12-03 15:40:11.940000             🧑  作者: Mango
在网页开发中,导航菜单是一个非常重要的组件。为了提升用户体验,我们通常会给导航菜单添加一些动画效果。但是,很多前端框架提供的动画效果并不是原生的,这就会影响性能和动画的流畅度。因此,在本文中,我们将介绍如何更改导航动画反应原生,提升用户体验。
在更改导航动画反应原生之前,我们需要选择一个合适的动画库。这里推荐使用 anime.js,它是一个高度可配置、轻量级的 JavaScript 动画库,支持 CSS 属性、SVG、DOM 属性和 JavaScript 对象。
在实现导航动画前,需要先定义好导航菜单的基本样式,包括菜单项样式、选中样式等。在本例中,我们的导航菜单样式如下:
.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;
}
在选择好动画库并定义好样式后,就可以开始编写导航动画了。在本例中,我们使用的是 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')
})
})
完整代码如下:
<!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 动画来实现导航动画,这个可以当作进阶的学习内容。