当访问者单击 anchor 时,我正在尝试构建滚动动画部分。您可能会注意到变量“id”将显示#1,这将与该部分本身的 id 值匹配。我怎样才能将滚动动画添加到这个 JavaScript 中?
var section = document.getElementsByTagName("section"),
nav = document.getElementById("nav-bar"),
navHeight = nav.offsetHeight,
navAnchor = nav.querySelectorAll("li a");
for (var i = 0; i < navAnchor.length; i++) {
var element = navAnchor[i];
element.addEventListener("click", function(e) {
e.preventDefault();
var el = this,
id = el.getAttribute("href");
function scrollTo(element, to, duration) {
var element = element,
to = section + id;
console.log(id);
if (duration <= 0) {
return;
}
var difference = to - element.scrollTop;
var perTick = difference / duration * 10;
consolelo
setTimeout(function() {
element.scrollTop = element.scrollTop + perTick;
if (element.scrollTop === to) return;
scrollTo(element, to, duration - 10);
}, 500);
}
});
}
ul li {
list-style-type: none;
display: inline-block;
}
li a {
text-decoration: none;
display: block;
width: 120px;
padding-top: 10px;
padding-bottom: 10px;
border: 1px solid black;
text-align: center;
}
section {
width: 100%;
height: 300px;
border: 1px solid red;
}
<div class="nav-block" id="nav-bar">
<ul class="navbar-unordered-list">
<li class="link">
<a href="#1" class="active">Profile</a>
</li>
<li class="link">
<a href="#2" class="scroll">Personal Project</a>
</li>
<li class="link">
<a href="#3" class="scroll">Skills</a>
</li>
<li class="link">
<a href="#4" class="scroll">CSS Drawings</a>
</li>
<li class="link">
<a href="#5" class="scroll">Contact</a>
</li>
</ul>
</div>
<section class="sections section1" id="1">
1
</section>
<section class="sections section2" id="2">
2
</section>
<section class="sections section3" id="3">
3
</section>
<section class="sections section4" id="4">
4
</section>
<section class="sections section5" id="5">
5
</section>
最佳答案
您看到它移动的原因是您没有阻止跟踪链接的默认操作,该操作会将您带到链接引用的 anchor 。 :-)
此外,scrollTo
函数不应位于事件处理程序内部。
假设你想调整主滚动条,我不会使用setInterval
,我会使用requestAnimationFrame
,请参阅评论:
var section = document.getElementsByTagName("section"),
nav = document.getElementById("nav-bar"),
navHeight = nav.offsetHeight,
navAnchor = nav.querySelectorAll("li a"),
animate = findAnimationElement();
for (var i = 0; i < navAnchor.length; i++) {
var element = navAnchor[i];
element.addEventListener("click", function(e) {
var el = this,
id = el.getAttribute("href");
e.preventDefault(); // <=== Don't follow the link
scrollTo(document.getElementById(id.substring(1)), 300);
// Skip the "#" on "#1" -----------^^^^^^^^^^^^^
});
}
function findAnimationElement() {
// Webkit browsers animate `body`, others animate `html` (the document element)
var bodyCurrent = document.body.scrollTop;
var docElCurrent = document.documentElement.scrollTop;
document.documentElement.scrollTop = document.body.scrollTop = 10;
var animate;
if (document.body.scrollTop > 0) {
animate = document.body;
document.body.scrollTop = bodyCurrent;
} else {
animate = document.documentElement;
document.documentElement.scrollTop = docElCurrent;
}
return animate;
}
function scrollTo(to, duration) {
// When should we finish?
var finishAt = Date.now() + duration;
// Start
requestAnimationFrame(tick);
function tick() {
// How many frames left? (60fps = 16.6ms per frame)
var framesLeft = (finishAt - Date.now()) / 16.6;
// How far do we have to go?
var distance = to.getBoundingClientRect().top;
if (distance <= 0) {
// Done (this shouldn't happen, belt & braces)
return;
}
// Adjust by one frame's worth
if (framesLeft <= 1) {
// Last call
animate.scrollTop += distance;
} else {
// Not the last, adjust and schedule next
animate.scrollTop += Math.max(1, distance / framesLeft);
requestAnimationFrame(tick);
}
}
}
ul li {
list-style-type: none;
display: inline-block;
}
li a {
text-decoration: none;
display: block;
width: 120px;
padding-top: 10px;
padding-bottom: 10px;
border: 1px solid black;
text-align: center;
}
section {
width: 100%;
height: 300px;
border: 1px solid red;
}
<div class="nav-block" id="nav-bar">
<ul class="navbar-unordered-list">
<li class="link">
<a href="#1" class="active">Profile</a>
</li>
<li class="link">
<a href="#2">Personal Project</a>
</li>
<li class="link">
<a href="#3">Skills</a>
</li>
<li class="link">
<a href="#4">CSS Drawings</a>
</li>
<li class="link">
<a href="#5">Contact</a>
</li>
</ul>
</div>
<section class="sections section1" id="1">
1
</section>
<section class="sections section2" id="2">
2
</section>
<section class="sections section3" id="3">
3
</section>
<section class="sections section4" id="4">
4
</section>
<section class="sections section5" id="5">
5
</section>
关于javascript - 纯 JavaScript 中的滚动动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43697749/