好的,我试图得到一个单一的页面(两个div),主要是一个闪屏,当你点击"进入网站",它会向下滚动到"主网站",但是它跳转到它,而不是平滑滚动到元素。
我怎样才能让它平滑地滚动到那个元素而没有这个跳跃效果?
这是我的一个片段:
splash = document.getElementById('intro');
content = document.getElementById('content');
function enterSite() {
content.scrollIntoView({
behaviour: "smooth"
});
}
body {
font-family: 'Archivo Narrow', sans-serif;
margin: 0 auto;
width: 100%;
height: 100%;
}
html,
body {
overflow: hidden;
}
main {
width: 100%;
height: 100%;
position: relative;
}
#intro {
background-image: url(https://i.imgsafe.org/51d0cf26df.jpg);
background-repeat: no-repeat;
background-size: cover;
display: flex;
text-align: center;
height: 100%;
}
#splash {
margin: auto;
width: 40%;
background-color: rgba(56, 56, 56, 0.4);
border-radius: 50px 50px;
}
#splash-p {
width: 70%;
font-size: 1.2em;
line-height: 1.5em;
margin: auto;
text-align: center;
padding-top: 10px;
color: #fff;
}
.btn {
width: 35%;
margin: auto;
margin-top: 10px;
margin-bottom: 10px;
}
/* Main Content Page */
article {
position: absolute;
width: 100%;
height: 100%;
background-color: red;
}
<div id="intro">
<div id="splash">
<p id="splash-p">Just a load of text repeated</p>
<input
type="image"
src="Images/Button.png"
class="btn"
onclick="enterSite()"
/>
</div>
</div>
<article id="content">Just a load of text repeated</article>
如果你点击按钮,它将跳转到下一个div,我需要它顺利滚动,而不是跳转到下一个div。使用纯javascript,我看到的其他地方似乎有插件或使用jquery。
关于更全面的平滑滚动方法列表,请参阅我的回答。
要在精确的时间内滚动到某个位置,可以使用window.requestAnimationFrame
,每次计算合适的当前位置。当不支持requestAnimationFrame
时,可以使用setTimeout
来达到类似的效果。
/*
@param pos: the y-position to scroll to (in pixels)
@param time: the exact amount of time the scrolling will take (in milliseconds)
*/
function scrollToSmoothly(pos, time) {
var currentPos = window.pageYOffset;
var start = null;
if(time == null) time = 500;
pos = +pos, time = +time;
window.requestAnimationFrame(function step(currentTime) {
start = !start ? currentTime : start;
var progress = currentTime - start;
if (currentPos < pos) {
window.scrollTo(0, ((pos - currentPos) * progress / time) + currentPos);
} else {
window.scrollTo(0, currentPos - ((currentPos - pos) * progress / time));
}
if (progress < time) {
window.requestAnimationFrame(step);
} else {
window.scrollTo(0, pos);
}
});
}
演示:function scrollToSmoothly(pos, time) {
var currentPos = window.pageYOffset;
var start = null;
if(time == null) time = 500;
pos = +pos, time = +time;
window.requestAnimationFrame(function step(currentTime) {
start = !start ? currentTime : start;
var progress = currentTime - start;
if (currentPos < pos) {
window.scrollTo(0, ((pos - currentPos) * progress / time) + currentPos);
} else {
window.scrollTo(0, currentPos - ((currentPos - pos) * progress / time));
}
if (progress < time) {
window.requestAnimationFrame(step);
} else {
window.scrollTo(0, pos);
}
});
}
document.getElementById("toElement").addEventListener('click', function(e) {
var elem = document.querySelector("div");
scrollToSmoothly(elem.offsetTop);
});
document.getElementById("toTop").addEventListener('click', function(e){
scrollToSmoothly(0, 700);
});
<button id="toElement">Scroll To Element</button>
<div style="margin: 1000px 0px; text-align: center;">Div element
<button id="toTop">Scroll back to top</button>
</div>
对于更复杂的情况,可以使用SmoothScroll.js库,它可以处理垂直和水平的平滑滚动,在其他容器元素中滚动,不同的缓和行为,从当前位置相对滚动等等。
document.getElementById("toElement").addEventListener('click', function(e) {
smoothScroll({toElement: document.querySelector('div'), duration: 500});
});
document.getElementById("toTop").addEventListener('click', function(e){
smoothScroll({yPos: 0, duration: 700});
});
<script src="https://cdn.jsdelivr.net/gh/LieutenantPeacock/SmoothScroll@1.2.0/src/smoothscroll.min.js" integrity="sha384-UdJHYJK9eDBy7vML0TvJGlCpvrJhCuOPGTc7tHbA+jHEgCgjWpPbmMvmd/2bzdXU" crossorigin="anonymous"></script>
<button id="toElement">Scroll To Element</button>
<div style="margin: 1000px 0px; text-align: center;">Div element
<button id="toTop">Scroll back to top</button>
</div>
或者,您可以将选项对象传递给window.scroll
,它会滚动到特定的x和y位置,而window.scrollBy
则会从当前位置滚动一定数量:
// Scroll to specific values
// scrollTo is the same
window.scroll({
top: 2500,
left: 0,
behavior: 'smooth'
});
// Scroll certain amounts from current position
window.scrollBy({
top: 100, // could be negative value
left: 0,
behavior: 'smooth'
});
演示:<button onClick="scrollToDiv()">Scroll To Element</button>
<div style="margin: 500px 0px;">Div</div>
<script>
function scrollToDiv(){
var elem = document.querySelector("div");
window.scroll({
top: elem.offsetTop,
left: 0,
behavior: 'smooth'
});
}
</script>
现代浏览器支持scroll-behavior
CSS属性,该属性可用于使文档中的滚动平滑(无需JavaScript)。锚标记可以通过给锚标记一个href
或#
加上要滚动到的元素的id
来实现这一点。您还可以为特定容器(如div
)设置scroll-behavior
属性,以使其内容平滑滚动。
html, body{
scroll-behavior: smooth;
}
<a href="#elem">Scroll To Element</a>
<div id="elem" style="margin: 500px 0px;">Div</div>
您的content.scrollIntoView({behaviour: "smooth"});
应该工作,但是,我认为'行为'拼写为行为。
我确实用TypeScript开发了一种平滑滚动的方法,但你应该能够很容易地转换为JS:
查看stackoverflow答案
如果你不想要一个直跳,你应该以某种方式动画滚动。
在jQuery的帮助下很容易做到:
$("html, body").animate({ scrollTop: $([ELEMENT]).position().top }, 1000);
看这提琴:https://jsfiddle.net/8501ckvn/
jQuery解决了很多跨浏览器的问题,但如果你正在寻找一个纯javascript的解决方案,已经有很多答案在Stackoverflow,即看光滑滚动锚链接没有jQuery。
假设您也有JQuery
您可以使用以下JQuery代码来获得平滑的滚动效果
function enterSite(){
$('html, body').stop().animate({
scrollTop: $('#content').offset().top
}, 1500);
});
让我知道它是否有效