JavaScript平滑滚动效果与scrollIntoView



好的,我试图得到一个单一的页面(两个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);
});

让我知道它是否有效

相关内容

  • 没有找到相关文章

最新更新