单击时平滑滚动到特定div

Eri*_*her 74 javascript jquery

我正在尝试做的是,如果你点击一个按钮,它会向下滚动(平滑)到页面上的特定div.

我在这里开始了一个JSFiddle:http://jsfiddle.net/ryXFt/2/

我需要的是,如果你点击按钮,它会平滑滚动到div'second'.

HTML:

.first {
    width: 100%;
    height: 1000px;
    background: #ccc;
}

.second {
    width: 100%;
    height: 1000px;
    background: #999;
}
Run Code Online (Sandbox Code Playgroud)

CSS:

<div class="first"><button type="button">Click Me!</button></div>
<div class="second">Hi</div>
Run Code Online (Sandbox Code Playgroud)

请帮忙.

Sud*_*oti 157

做:

$("button").click(function() {
    $('html,body').animate({
        scrollTop: $(".second").offset().top},
        'slow');
});
Run Code Online (Sandbox Code Playgroud)

更新了Jsfiddle


小智 32

有许多使用JS库(如jQuery,Mootools,Prototype等)进行平滑滚动的示例.

以下示例适用于纯JavaScript.如果您在页面上没有jQuery/Mootools/Prototype,或者您不想使用繁重的JS库重载页面,那么示例将会有所帮助.

http://jsfiddle.net/rjSfP/

HTML部分:

<div class="first"><button type="button" onclick="smoothScroll(document.getElementById('second'))">Click Me!</button></div>
<div class="second" id="second">Hi</div>
Run Code Online (Sandbox Code Playgroud)

CSS部分:

.first {
    width: 100%;
    height: 1000px;
    background: #ccc;
}

.second {
    width: 100%;
    height: 1000px;
    background: #999;
}
Run Code Online (Sandbox Code Playgroud)

JS部分:

window.smoothScroll = function(target) {
    var scrollContainer = target;
    do { //find scroll container
        scrollContainer = scrollContainer.parentNode;
        if (!scrollContainer) return;
        scrollContainer.scrollTop += 1;
    } while (scrollContainer.scrollTop == 0);

    var targetY = 0;
    do { //find the top of target relatively to the container
        if (target == scrollContainer) break;
        targetY += target.offsetTop;
    } while (target = target.offsetParent);

    scroll = function(c, a, b, i) {
        i++; if (i > 30) return;
        c.scrollTop = a + (b - a) / 30 * i;
        setTimeout(function(){ scroll(c, a, b, i); }, 20);
    }
    // start scrolling
    scroll(scrollContainer, scrollContainer.scrollTop, targetY, 0);
}
Run Code Online (Sandbox Code Playgroud)

  • 5 年后仍然有用 (4认同)

Ion*_* B. 10

如果你使用 scrollIntoView 函数怎么办?

var elmntToView = document.getElementById("sectionId");
elmntToView.scrollIntoView(); 
Run Code Online (Sandbox Code Playgroud)

也有 {behavior: "smooth"} .... ;) https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView


Ned*_*son 9

我用nico的答案玩了一下,感觉很跳跃.做了一些调查,发现window.requestAnimationFrame哪个是每个重绘周期调用的函数.这允许更清晰的动画.仍在努力研究步长的良好默认值,但对于我的示例,使用此实现看起来相当不错.

var smoothScroll = function(elementId) {
    var MIN_PIXELS_PER_STEP = 16;
    var MAX_SCROLL_STEPS = 30;
    var target = document.getElementById(elementId);
    var scrollContainer = target;
    do {
        scrollContainer = scrollContainer.parentNode;
        if (!scrollContainer) return;
        scrollContainer.scrollTop += 1;
    } while (scrollContainer.scrollTop == 0);

    var targetY = 0;
    do {
        if (target == scrollContainer) break;
        targetY += target.offsetTop;
    } while (target = target.offsetParent);

    var pixelsPerStep = Math.max(MIN_PIXELS_PER_STEP,
                                 (targetY - scrollContainer.scrollTop) / MAX_SCROLL_STEPS);

    var stepFunc = function() {
        scrollContainer.scrollTop =
            Math.min(targetY, pixelsPerStep + scrollContainer.scrollTop);

        if (scrollContainer.scrollTop >= targetY) {
            return;
        }

        window.requestAnimationFrame(stepFunc);
    };

    window.requestAnimationFrame(stepFunc);
}
Run Code Online (Sandbox Code Playgroud)


Jyo*_*han 8

对我有用的解决方案:

var element = document.getElementById("box");

element.scrollIntoView({behavior: "smooth"});
Run Code Online (Sandbox Code Playgroud)

您可以在这里探索更多选项


小智 7

可以使用基本的css来实现平滑滚动

html {
  scroll-behavior: smooth;
}
Run Code Online (Sandbox Code Playgroud)