【发布时间】:2021-09-15 21:07:18
【问题描述】:
我有这个导航栏,每次单击导航栏中的选项时,绝对定位指示器都会在 getBoundingClientRect() 的帮助下获取左侧选项的位置和宽度,并将其移动到目标。
问题是当我调整窗口大小时,指示器会改变它的位置并移开。为了在调整窗口大小时保持在同一个位置,我将 eventListener 应用于窗口,每次调整大小时,我都会得到 @987654322 的新值@ 和 width 和 getBoundingClientRect()。
它有效,但我想知道这是否是一种不好的方法,因为每次调整窗口大小时都会发生计算,如果是这种情况,有什么更好的方法。
代码如下:
const navigator = document.querySelector('.navigator');
const firstOption = document.querySelector('.first-option');
const navOptions = document.querySelectorAll('.nav-option');
const nav = document.querySelector('nav');
navigator.style.left = `${firstOption.getBoundingClientRect().left}px`;
navigator.style.width = `${firstOption.getBoundingClientRect().width}px`;
nav.addEventListener('click', function(e) {
if(e.target.classList.contains('nav-option')) {
navOptions.forEach(option => option.classList.remove('nav-option-active'));
e.target.classList.add('nav-option-active');
navigator.style.left = `${e.target.getBoundingClientRect().left}px`;
navigator.style.width = `${e.target.getBoundingClientRect().width}px`;
};
});
window.addEventListener('resize', function() {
let navOptionActive = nav.querySelector('.nav-option-active');
navigator.style.left = `${navOptionActive.getBoundingClientRect().left}px`;
navigator.style.width = `${navOptionActive.getBoundingClientRect().width}px`;
});
* {
margin: 0;
padding: 0;
}
nav {
position: relative;
display: flex;
justify-content: space-between;
align-items: center;
margin: 100px auto;
padding: 7vh 30vw;
width: auto;
background:#eeeeee;
}
.nav-option {
padding: 0 15px;
font-size: 22px;
cursor: pointer;
}
.navigator {
position: absolute;
left: 0;
bottom: 0;
height: 5px;
background: orangered;
transition: .4s ease all;
}
@media (max-width: 1200px) {
.nav-option {
font-size: 18px;
padding: 10px;
}
}
<nav>
<div class="navigator"></div>
<div class="nav-option first-option nav-option-active">HOME</div>
<div class="nav-option">INFO</div>
<div class="nav-option">CONTACT</div>
<div class="nav-option">ABOUT</div>
<div class="nav-option">MENU</div>
</nav>
【问题讨论】:
-
如果您不想在脚本中完成所有这些工作(计算),您可以考虑在每个
nav-option下添加一个navigator,并根据活动@987654330 选择性地显示/隐藏它们@.
标签: javascript html css