我刚刚开始使用JS并且苦苦挣扎。我从Adam Khoury那里获得了这段可爱的代码,并且它在页面上滚动到目标元素的工作非常精美。
ul
位于固定位置导航栏中。
我的问题是:当点击nav
中的锚点时,需要使用什么代码才能使动画向上和向下滚动?
var scrollY = 0;
var distance = 10;
var speed = 24;
function autoScrollTo(el) {
var currentY = window.pageYOffset;
var targetY = document.getElementById(el).offsetTop;
var bodyHeight = document.body.offsetHeight;
var yPos = currentY + window.innerHeight;
var animator = setTimeout('autoScrollTo(\'' + el + '\')', 24);
if (yPos > bodyHeight) {
clearTimeout(animator);
} else {
if (currentY < targetY - distance) {
scrollY = currentY + distance;
window.scroll(0, scrollY);
} else {
clearTimeout(animator);
}
}
}
function resetScroller(el) {
var currentY = window.pageYOffset;
var targetY = document.getElementById(el).offsetTop;
var animator = setTimeout('resetScroller(\'' + el + '\')', speed);
if (currentY > targetY) {
scrollY = currentY - distance;
window.scroll(0, scrollY);
} else {
clearTimeout(animator);
}
}
<ul class="main-nav">
<li><a href="#" onclick="return false;" onmousedown="autoScrollTo('about');">
About</a>
</li>
<li><a href="#" onclick="return false;" onmousedown="autoScrollTo('testimonials');">
Testimonials</a>
</li>
<li><a href="#" onclick="return false;" onmousedown="autoScrollTo('contact');">
Contact</a>
</li>
</ul>
<hr style="margin: 25em 0;" />
<div id="about" class="navButton">
<p>About lorem ipsom....</p>
</div>
<div id="testimonials" class="navButton">
<p>Testimonial lorem ipsom....</p>
</div>
<div id="contact" class="navButton">
<p>Contact lorem ipsum</p>
</div>
答案 0 :(得分:2)
如果您愿意使用jQuery,这将更加简单。您所要做的就是获取要滚动到的元素的.offset()顶部,然后使用jQuery scrollTop函数设置.animate()位置的动画。
function autoScrollTo(el) {
var top = $("#" + el).offset().top;
$("html, body").animate({ scrollTop: top }, 1000);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul class="main-nav">
<li><a href="#" onclick="return false;" onmousedown="autoScrollTo('about');">
About</a>
</li>
<li><a href="#" onclick="return false;" onmousedown="autoScrollTo('testimonials');">
Testimonials</a>
</li>
<li><a href="#" onclick="return false;" onmousedown="autoScrollTo('contact');">
Contact</a>
</li>
</ul>
<hr style="margin: 25em 0;" />
<div id="about" class="navButton">
<p>About lorem ipsom....</p>
</div>
<div id="testimonials" class="navButton">
<p>Testimonial lorem ipsom....</p>
</div>
<div id="contact" class="navButton">
<p>Contact lorem ipsum</p>
</div>
答案 1 :(得分:2)
感谢Dave指导我远离javascript和JQuery。 这段代码非常友好。您根本不需要编辑它,只需将其粘贴到index.html和bam中即可!它的工作原理
<header class="main-header">
<ul class="main-nav">
<li><a href="#about">About</a></li>
<li><a href="#testimonials">Testimonials</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</header>
<!-- SMOOTH SCROLL -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>
$(function() {
$('a[href*=#]:not([href=#])').click(function() {
if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
var target = $(this.hash);
target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
if (target.length) {
$('html,body').animate({
scrollTop: target.offset().top
}, 1000);
return false;
}
}
});
});
</script>
<!-- End of SMOOTH SCROLL -->
答案 2 :(得分:0)
我没有时间把这一切都放在一个页面上来真正测试它,但我首先尝试的是这样的:
if(currentY < targetY-distance){
scrollY = currentY+distance;
window.scroll(0, scrollY);
} else {
scrollY = currentY-distance;
window.scroll(0, scrollY);
}
因此,当currentY大于targetY-distance时,它不会清除超时,而是向相反的方向滚动?可能不行,但值得一试......