JavaScript trình duyệt chéo (không phải jQuery jQuery) cuộn đến hình động hàng đầu


222

Tôi đang tìm kiếm một hình ảnh động "cuộn lên đầu" đơn giản, đa trình duyệt mà tôi có thể áp dụng cho một liên kết. Tôi không muốn yêu cầu một thư viện JS như jQuery / Moo, v.v.

// jQuery Equivilant to convert to pure JS...
$('html, body').animate({scrollTop:0}, 400);

Tôi là một trường hợp hoàn hảo cho một người đáng lẽ phải học JS 100% trước khi nhảy vào thư viện. :


78
+1 vì không muốn sử dụng jQuery, với lý do hợp lệ :) Để có cảm hứng, bạn có thể xem mã nguồn của các thư viện này, ví dụ jquery-1.7.1.js .
Rob W


10
@seand JavaScript không phải là jQuery, nhưng jQuery là JavaScript. Nếu một người (chẳng hạn như OP) muốn học JavaScript, anh ta không nên chạm vào bất kỳ thư viện cồng kềnh nào, trừ khi họ có ý tưởng làm thế nào để viết cùng một mã trong JavaScript.
Rob W

3
@RobW sử dụng một thư viện như jQuery giúp loại bỏ sự khác biệt giữa các trình duyệt, vì vậy tôi sẽ thấy nó rất quan trọng đối với phát triển web; bạn không cần phải biết những khác biệt đó nếu một triển khai hoàn toàn tốt tồn tại và có sẵn miễn phí
seand

6
@seand và đó là cách chúng tôi sản xuất các lập trình viên xảo quyệt. Họ không hiểu ngôn ngữ, nhưng có thể sinh ra số lượng mã jQuery không giới hạn, vì họ biết nó. Điều này dẫn đến các vụ hack như lưu trữ mọi thứ trong DOM (vì đôi khi họ thậm chí không biết biến là gì, ngoài var something = $(...)), tái tạo lại các đối tượng trong mọi chức năng (họ biết các biến, nhưng không biết rằng var veryBigObject = {...}với vài trăm thuộc tính tại đỉnh của chức năng là hiệu suất giết người). Và họ thường không biết tên ngôn ngữ là Javascript, không phải jQuery.
Killah

Câu trả lời:


139
function scrollTo(element, to, duration) {
    if (duration <= 0) return;
    var difference = to - element.scrollTop;
    var perTick = difference / duration * 10;

    setTimeout(function() {
        element.scrollTop = element.scrollTop + perTick;
        if (element.scrollTop === to) return;
        scrollTo(element, to, duration - 10);
    }, 10);
}

Bản giới thiệu:

function runScroll() {
  scrollTo(document.body, 0, 600);
}
var scrollme;
scrollme = document.querySelector("#scrollme");
scrollme.addEventListener("click",runScroll,false)

function scrollTo(element, to, duration) {
  if (duration <= 0) return;
  var difference = to - element.scrollTop;
  var perTick = difference / duration * 10;

  setTimeout(function() {
    element.scrollTop = element.scrollTop + perTick;
    if (element.scrollTop == to) return;
    scrollTo(element, to, duration - 10);
  }, 10);
}
<p>Very long page.Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.  Very long page.Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.  Very long page.Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.  Very long page.Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.  Very long page.Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
</p>
<button id=scrollme type="button">To the top</button>


11
document.documentElementthay vì document.body(trừ khi bạn đặt CSS body{height:100%;}:). Bản demo hoạt động sử dụng khái niệm này: jsfiddle.net/S5ALP/1
Rob W

7
@RobW Bổ sung của bạn không hoạt động ở đây trong Google Chrome @ Ubuntu Linux
TimWolla

2
Nó cũng có trong Firefox 9.0, Ubuntu cũng vậy :). Mã của bạn không thành công trong Firefox, nhưng hoạt động trong Chrome, mã của tôi bị lỗi trong Chrome, nhưng hoạt động trong FF.
Rob W

2
Đó phải làif (duration <= 0) return;
Jon Koops

4
Sửa đổi nó để sử dụng top.window.scroll(0, value)thay vì element.scrollTop = valuelàm cho nó hoạt động trong cả Chrome và Firefox (Ubuntu). :)
Shomz

113

Có vẻ như đã có rất nhiều giải pháp. dù sao, đây là một cái khác, sử dụng phương trình nới lỏng ..

// first add raf shim
// http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/
window.requestAnimFrame = (function(){
  return  window.requestAnimationFrame       ||
          window.webkitRequestAnimationFrame ||
          window.mozRequestAnimationFrame    ||
          function( callback ){
            window.setTimeout(callback, 1000 / 60);
          };
})();

// main function
function scrollToY(scrollTargetY, speed, easing) {
    // scrollTargetY: the target scrollY property of the window
    // speed: time in pixels per second
    // easing: easing equation to use

    var scrollY = window.scrollY || document.documentElement.scrollTop,
        scrollTargetY = scrollTargetY || 0,
        speed = speed || 2000,
        easing = easing || 'easeOutSine',
        currentTime = 0;

    // min time .1, max time .8 seconds
    var time = Math.max(.1, Math.min(Math.abs(scrollY - scrollTargetY) / speed, .8));

    // easing equations from https://github.com/danro/easing-js/blob/master/easing.js
    var easingEquations = {
            easeOutSine: function (pos) {
                return Math.sin(pos * (Math.PI / 2));
            },
            easeInOutSine: function (pos) {
                return (-0.5 * (Math.cos(Math.PI * pos) - 1));
            },
            easeInOutQuint: function (pos) {
                if ((pos /= 0.5) < 1) {
                    return 0.5 * Math.pow(pos, 5);
                }
                return 0.5 * (Math.pow((pos - 2), 5) + 2);
            }
        };

    // add animation loop
    function tick() {
        currentTime += 1 / 60;

        var p = currentTime / time;
        var t = easingEquations[easing](p);

        if (p < 1) {
            requestAnimFrame(tick);

            window.scrollTo(0, scrollY + ((scrollTargetY - scrollY) * t));
        } else {
            console.log('scroll done');
            window.scrollTo(0, scrollTargetY);
        }
    }

    // call it once to get started
    tick();
}

// scroll it!
scrollToY(0, 1500, 'easeInOutQuint');

10
Vui mừng khi ai đó đang sử dụngrequestAnimationFrame
Lucas

4
Nên được bình chọn và chọn làm câu trả lời. Đây là chỉ một trong những hoạt trình duyệt chéo
wlingke

requestAnimationFramekhông tương thích với tất cả các trình duyệt một số điện thoại di động, vì vậy đây không phải là một giải pháp động, xem: developer.mozilla.org/en-US/docs/Web/API/window/
SUB-HDR

1
@ SUB-HDR ở đầu đoạn trích, có một requestAnimationFrameđiều cần lưu ý là nên quan tâm đến bất kỳ sự không tương thích nào của trình duyệt
shunryu111

Các hình ảnh động trở nên rất lag khi một trang có một phần có nhiều hình ảnh trên Firefox stackoverflow.com/questions/56394100/
trộm

79
window.scroll({top: 0, left: 0, behavior: 'smooth' });

Có nó từ một bài viết về Smooth Scrolling .

Nếu cần, có một số polyfill có sẵn.


4
Hầu như bị hạ thấp bởi vì tôi nghĩ rằng đây là một giải pháp jQuery. Bài viết đó được phân loại khó hiểu! Ngoài ra, tôi cũng muốn chỉ ra rằng nó scrollIntoView({behavior: 'smooth'})tồn tại và có thể làm những gì mọi người cần cho loại vấn đề này.
Brendan

1
Điều này gây ra lỗi trong Chrome mới nhấtUncaught TypeError: Failed to execute 'scroll' on 'Window': No function was found that matched the signature provided.
rorymorris89

1
@Sgnl có thể xác nhận điều này hiện đã được sửa. Chrome cũ cập nhật những thứ tuyệt vời :)
rorymorris89

4
Tôi không biết tại sao điều này không có nhiều phiếu bầu hơn, một cuộn đơn giản lên đầu mà không có 100000 dòng mã! Cảm ơn bạn!
Smokey Dawson

4
Câu trả lời này phải được đánh dấu là câu trả lời được chấp nhận. Một cách tiếp cận tích hợp mà không sử dụng các chức năng chuyển đổi tùy chỉnh, tại sao không!? Cảm ơn bạn!
Sagar

70

Tôi đã sửa đổi câu trả lời của TimWolla để sử dụng nới lỏng bậc hai (mượt hơn một chút :). Đây là một ví dụ trong hành động: trên jsFiddle . Chức năng nới lỏng có sẵn ở đây: Chức năng nới lỏng của Robert Penner

document.getElementsByTagName('button')[0].onclick = function () {
    scrollTo(document.body, 0, 1250);   
}

function scrollTo(element, to, duration) {
    var start = element.scrollTop,
        change = to - start,
        increment = 20;

    var animateScroll = function(elapsedTime) {        
        elapsedTime += increment;
        var position = easeInOut(elapsedTime, start, change, duration);                        
        element.scrollTop = position; 
        if (elapsedTime < duration) {
            setTimeout(function() {
                animateScroll(elapsedTime);
            }, increment);
        }
    };

    animateScroll(0);
}

function easeInOut(currentTime, start, change, duration) {
    currentTime /= duration / 2;
    if (currentTime < 1) {
        return change / 2 * currentTime * currentTime + start;
    }
    currentTime -= 1;
    return -change / 2 * (currentTime * (currentTime - 2) - 1) + start;
}

5
Mã của bạn không hoạt động trong firefox. Có giải pháp cho việc này?
Milos

2
@Milos Chỉ cần sử dụng "scrollTo (document.documentEuity, 0, 1250);" thay vì "scrollTo (document.body, 0, 1250);" và nó sẽ hoạt động cả trong Firefox và Chrome.
Daniel

Tại sao bạn đang sử dụng Toán? Không có Toán, nó đang hoạt động demo
bCliks

2
@Daniel document. documentElementkhông hoạt động trong Chrome.
đánh vào

@bCliks, đó là một phương pháp nới lỏng
Clayton Graul

27

Không có mã JQuery, Hy vọng điều này sẽ giúp bạn.

function TopscrollTo() {
if(window.scrollY!=0)
{
    setTimeout(function() {
       window.scrollTo(0,window.scrollY-30);
        TopscrollTo();
    }, 100);
   }
}

gọi hàm TopscrollTo () này trên sự kiện nhấn nút hoặc trên bất kỳ yếu tố / sự kiện nào khác mà bạn muốn.


19

Tôi đã sửa đổi mã của @TimWolla để thêm nhiều tùy chọn và một số chức năng di chuyển. Ngoài ra, đã thêm hỗ trợ cho crossbrowser với document.body.scrollTopdocument.documentEuity.scrollTop

// scroll to top
scrollTo(0, 1000);

// Element to move, time in ms to animate
function scrollTo(element, duration) {
    var e = document.documentElement;
    if(e.scrollTop===0){
        var t = e.scrollTop;
        ++e.scrollTop;
        e = t+1===e.scrollTop--?e:document.body;
    }
    scrollToC(e, e.scrollTop, element, duration);
}

// Element to move, element or px from, element or px to, time in ms to animate
function scrollToC(element, from, to, duration) {
    if (duration <= 0) return;
    if(typeof from === "object")from=from.offsetTop;
    if(typeof to === "object")to=to.offsetTop;

    scrollToX(element, from, to, 0, 1/duration, 20, easeOutCuaic);
}

function scrollToX(element, xFrom, xTo, t01, speed, step, motion) {
    if (t01 < 0 || t01 > 1 || speed<= 0) {
        element.scrollTop = xTo;
        return;
    }
    element.scrollTop = xFrom - (xFrom - xTo) * motion(t01);
    t01 += speed * step;

    setTimeout(function() {
        scrollToX(element, xFrom, xTo, t01, speed, step, motion);
    }, step);
}
function easeOutCuaic(t){
    t--;
    return t*t*t+1;
}

http://jsfiddle.net/forestrf/tPQSv/

Phiên bản rút gọn: http://jsfiddle.net/forestrf/tPQSv/139/

// c = element to scroll to or top position in pixels
// e = duration of the scroll in ms, time scrolling
// d = (optative) ease function. Default easeOutCuaic
function scrollTo(c,e,d){d||(d=easeOutCuaic);var a=document.documentElement;if(0===a.scrollTop){var b=a.scrollTop;++a.scrollTop;a=b+1===a.scrollTop--?a:document.body}b=a.scrollTop;0>=e||("object"===typeof b&&(b=b.offsetTop),"object"===typeof c&&(c=c.offsetTop),function(a,b,c,f,d,e,h){function g(){0>f||1<f||0>=d?a.scrollTop=c:(a.scrollTop=b-(b-c)*h(f),f+=d*e,setTimeout(g,e))}g()}(a,b,c,0,1/e,20,d))};
function easeOutCuaic(t){
    t--;
    return t*t*t+1;
}

Và điểm cần làm 1 / durationkhi bạn gọi scrollToX lần đầu tiên là gì?
Jessica

t01 là thời gian được tăng từ 0 đến 1. Nếu đạt 1, thì kết thúc. Tôi đã làm điều này 2 năm trước, tôi không nhớ tất cả mọi thứ, xin lỗi.
Forestrf

11

Có thực sự là một cách javascript tinh khiết để thực hiện điều này mà không sử dụng setTimeouthoặc requestAnimationFramehoặc jQuery.

Nói tóm lại, tìm phần tử trong scrollView mà bạn muốn cuộn và sử dụng scrollIntoView

el.scrollIntoView({behavior:"smooth"});

Đây là một plunkr .


Câu trả lời hay nhất: một dòng mã, ngắn nhất và hiệu quả;)
Jacopo Pace

1
Lưu ý rằng việc vượt qua scrollIntoViewOptionkhông có hỗ trợ trình duyệt chéo. developer.mozilla.org/en-US/docs/Web/API/Euity/scrollIntoView
WebWanderer

9

Chuyển thể từ câu trả lời này :

function scroll(y, duration) {

    var initialY = document.documentElement.scrollTop || document.body.scrollTop;
    var baseY = (initialY + y) * 0.5;
    var difference = initialY - baseY;
    var startTime = performance.now();

    function step() {
        var normalizedTime = (performance.now() - startTime) / duration;
        if (normalizedTime > 1) normalizedTime = 1;

        window.scrollTo(0, baseY + difference * Math.cos(normalizedTime * Math.PI));
        if (normalizedTime < 1) window.requestAnimationFrame(step);
    }
    window.requestAnimationFrame(step);
}

Điều này sẽ cho phép bạn cuộn trơn tru (chức năng cosine) từ bất cứ đâu đến "y" được chỉ định.


9

Không ai đề cập đến hành vi cuộn thuộc tính CSS

CSS

html {
  scroll-behavior: smooth;
}

Mã não

window.scrollTo(0,0)

Điều này làm việc tuyệt vời! Không được hỗ trợ trong tất cả các trình duyệt, nhưng điều đó không sao vì nó quay trở lại tốt đẹp.
Bánh mỳ kẹp thịt

Chúa ơi, nơi đây đã là tất cả cuộc sống của tôi?
Mitya

8

LỚP LỚP JAVASCRIPT

Đây là một câu hỏi cũ nhưng tôi nghĩ rằng tôi có thể trả lời với một số nội dung thú vị và một số tùy chọn khác để chơi nếu bạn muốn kiểm soát hoạt hình nhiều hơn một chút.

  • Qua trình duyệt
  • Sao chép / Dán giải pháp sẵn sàng (Bạn chỉ cần CSS và JS)
  • 3 chế độ hoạt hình: ["bình thường" | "tuyến tính" | sai]
  • Tùy chỉnh hoạt hình của bạn với các cài đặt có sẵn - làm cho nó linh hoạt hoặc trôi chảy
  • Nhấp đúp chuột để bỏ qua hình ảnh động
  • Mỗi lần nhấp tiếp theo sẽ thêm tốc độ ban đầu
  • Dừng cuộn hoạt hình bằng cách kéo xuống thanh cuộn
  • Dừng cuộn hình ảnh động bằng cách lăn bánh xe xuống
  • Nút hoạt hình mờ dần trong cuộn
  • Đây là một lớp JS thuần túy để đảm nhiệm việc cuộn cho bạn:

    XEM DEMO TẠI CODEPEN HOẶC ĐI ĐẾN BOTTOM VÀ CHẠY SINPET

    // ------------------- USE EXAMPLE ---------------------
    // *Set options
    var options = {
      'showButtonAfter': 200, // show button after scroling down this amount of px
      'animate': "linear", // [false|normal|linear] - for false no aditional settings are needed
    
      'normal': { // applys only if [animate: normal] - set scroll loop distanceLeft/steps|ms
        'steps': 20, // the more steps per loop the slower animation gets
        'ms': 10 // the less ms the quicker your animation gets
      }, 
      'linear': { // applys only if [animate: linear] - set scroll px|ms
        'px': 30, // the more px the quicker your animation gets
        'ms': 10 // the less ms the quicker your animation gets
      }, 
    };
    
    
    // *Create new Scroller and run it.
    var scroll = new Scroller(options);
    scroll.init();

    LỚP LỚP HOÀN TOÀN + VÍ DỤ SỬ DỤNG:

    // PURE JAVASCRIPT (OOP)
    
    function Scroller(options) {
      this.options = options;
      this.button = null;
      this.stop = false;
    }
    
    Scroller.prototype.constructor = Scroller;
    
    Scroller.prototype.createButton = function() {
    
      this.button = document.createElement('button');
      this.button.classList.add('scroll-button');
      this.button.classList.add('scroll-button--hidden');
      this.button.textContent = "^";
      document.body.appendChild(this.button);
    }
    
    Scroller.prototype.init = function() {
      this.createButton();
      this.checkPosition();
      this.click();
      this.stopListener();
    }
    
    Scroller.prototype.scroll = function() {
      if (this.options.animate == false || this.options.animate == "false") {
        this.scrollNoAnimate();
        return;
      }
      if (this.options.animate == "normal") {
        this.scrollAnimate();
        return;
      }
      if (this.options.animate == "linear") {
        this.scrollAnimateLinear();
        return;
      }
    }
    Scroller.prototype.scrollNoAnimate = function() {
      document.body.scrollTop = 0;
      document.documentElement.scrollTop = 0;
    }
    Scroller.prototype.scrollAnimate = function() {
      if (this.scrollTop() > 0 && this.stop == false) {
        setTimeout(function() {
          this.scrollAnimate();
          window.scrollBy(0, (-Math.abs(this.scrollTop()) / this.options.normal['steps']));
        }.bind(this), (this.options.normal['ms']));
      }
    }
    Scroller.prototype.scrollAnimateLinear = function() {
      if (this.scrollTop() > 0 && this.stop == false) {
        setTimeout(function() {
          this.scrollAnimateLinear();
          window.scrollBy(0, -Math.abs(this.options.linear['px']));
        }.bind(this), this.options.linear['ms']);
      }
    }
    
    Scroller.prototype.click = function() {
    
      this.button.addEventListener("click", function(e) {
        e.stopPropagation();
        this.scroll();
      }.bind(this), false);
    
      this.button.addEventListener("dblclick", function(e) {
        e.stopPropagation();
        this.scrollNoAnimate();
      }.bind(this), false);
    
    }
    
    Scroller.prototype.hide = function() {
      this.button.classList.add("scroll-button--hidden");
    }
    
    Scroller.prototype.show = function() {
      this.button.classList.remove("scroll-button--hidden");
    }
    
    Scroller.prototype.checkPosition = function() {
      window.addEventListener("scroll", function(e) {
        if (this.scrollTop() > this.options.showButtonAfter) {
          this.show();
        } else {
          this.hide();
        }
      }.bind(this), false);
    }
    
    Scroller.prototype.stopListener = function() {
    
      // stop animation on slider drag
      var position = this.scrollTop();
      window.addEventListener("scroll", function(e) {
        if (this.scrollTop() > position) {
          this.stopTimeout(200);
        } else {
          //...
        }
        position = this.scrollTop();
      }.bind(this, position), false);
    
      // stop animation on wheel scroll down
      window.addEventListener("wheel", function(e) {
        if (e.deltaY > 0) this.stopTimeout(200);
      }.bind(this), false);
    }
    
    Scroller.prototype.stopTimeout = function(ms) {
      this.stop = true;
      // console.log(this.stop); //
      setTimeout(function() {
        this.stop = false;
        console.log(this.stop); //
      }.bind(this), ms);
    }
    
    Scroller.prototype.scrollTop = function() {
      var curentScrollTop = document.documentElement.scrollTop || document.body.scrollTop;
      return curentScrollTop;
    }
    
    
    
    // ------------------- USE EXAMPLE ---------------------
    // *Set options
    var options = {
      'showButtonAfter': 200, // show button after scroling down this amount of px
      'animate': "normal", // [false|normal|linear] - for false no aditional settings are needed
    
      'normal': { // applys only if [animate: normal] - set scroll loop distanceLeft/steps|ms
        'steps': 20, // the more steps per loop the slower animation gets
        'ms': 10 // the less ms the quicker your animation gets
      },
      'linear': { // applys only if [animate: linear] - set scroll px|ms
        'px': 30, // the more px the quicker your animation gets
        'ms': 10 // the less ms the quicker your animation gets
      },
    };
    // *Create new Scroller and run it.
    var scroll = new Scroller(options);
    scroll.init();
    /* CSS */
    
    @import url(https://fonts.googleapis.com/css?family=Open+Sans);
     body {
      font-family: 'Open Sans', sans-serif;
      font-size: 1.2rem;
      line-height: 2rem;
      height: 100%;
      position: relative;
      padding: 0 25%;
    }
    .scroll-button {
      font-size: 1.2rem;
      line-height: 2rem;
      padding: 10px;
      width: 50px;
      height: 50px;
      background: black;
      color: white;
      border-radius: 50%;
      position: fixed;
      right: 20px;
      bottom: 20px;
      visibility: visible;
      filter: alpha(opacity=50);
      filter: progid: DXImageTransform.Microsoft.Alpha(Opacity=50);
      opacity: 0.5;
      cursor: pointer;
      transition: all 1.2s;
      -webkit-transition: all 1.2s;
      -moz-transition: all 1.2s;
      -ms-transition: all 1.2s;
      -o-transition: all 1.2s;
    }
    .scroll-button:hover {
      filter: alpha(opacity=100);
      filter: progid: DXImageTransform.Microsoft.Alpha(Opacity=100);
      opacity: 1;
    }
    .scroll-button--hidden {
      filter: alpha(opacity=0);
      filter: progid: DXImageTransform.Microsoft.Alpha(Opacity=0);
      opacity: 0;
      visibility: hidden;
    }
    <!-- HTML -->
    
    <h1>Scroll down by 200px for button to appear</h1>
    <ul>
      <li>Cross-browser</li>
      <li>Copy/Paste solution</li>
      <li>3 animate modes: <b>["normal"|"linear"|false]</b></li>
      <li>Customize your aniamtion with aveilable settings - make it snapy or fluent</li>
      <li>Double click to skip animation</li>
      <li>Every next single click adds initial speed</li>
      <li>Stop scroll animation by draging down the scroll bar</li>
      <li>Stop scroll animation by mouse wheel down</li>
      <li>Animated button fade-in-out on scroll</li>
    </ul>
    
    <br />
    <br />
    <pre>
    // ------------------- USE EXAMPLE ---------------------
    // *Set options
    var options = {
      'showButtonAfter': 200, // show button after scroling down this amount of px
      'animate': "normal", // [false|normal|linear] - for false no aditional settings are needed
      
      'normal': { // applys only if [animate: normal] - set scroll loop distanceLeft/steps|ms
        'steps': 20, // the more steps the slower animation gets
        'ms': 20 // the less ms the quicker your animation gets
      }, 
      'linear': { // applys only if [animate: linear] - set scroll px|ms
        'px': 55, // the more px the quicker your animation gets
        'ms': 10 // the less ms the quicker your animation gets
      }, 
    };
    
    // *Create new Scroller and run it.
    var scroll = new Scroller(options);
    scroll.init();
    </pre>
    <br />
    <br />
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae molestiae illo nobis quo autem molestias voluptatum quam, amet ipsum debitis, iure animi illum soluta eaque qui perspiciatis harum, sequi nesciunt.</span><span>Quisquam nesciunt aspernatur a possimus pariatur enim architecto. Hic aperiam sit repellat doloremque vel est soluta et assumenda dolore, sint sapiente porro, quam impedit. Sint praesentium quas excepturi, voluptatem dicta!</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptate, porro nisi molestias minima corrupti tempore, dolorum fugiat ipsam dicta doloremque accusamus atque consequatur iusto natus, mollitia distinctio odit dolor tempora.</span><span>Perferendis a in laudantium accusantium, dolorum eius placeat velit porro similique, eum cumque veniam neque aspernatur architecto suscipit rem laboriosam voluptates laborum? Voluptates tempora necessitatibus animi nostrum quod, maxime odio.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nihil accusantium, itaque corporis repellat pariatur soluta officia perspiciatis in reprehenderit facere, incidunt saepe excepturi. Inventore atque ex illo, ipsam at deserunt.</span><span>Laborum inventore officia, perspiciatis cumque magni consequatur iste accusantium soluta, nesciunt blanditiis voluptatibus adipisci laudantium mollitia minus quia necessitatibus voluptates. Minima unde quos impedit necessitatibus aspernatur minus maiores ipsa eligendi!</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptate nesciunt, explicabo similique, quo maxime modi, aliquid, voluptatibus repellendus dolorum placeat mollitia ea dicta quia laboriosam alias dignissimos ipsam tenetur. Nulla.</span><span>Vel maiores necessitatibus odio voluptate debitis, error in accusamus nulla, eum, nemo et ea commodi. Autem numquam at, consequatur temporibus. Mollitia placeat nobis blanditiis impedit distinctio! Ad, incidunt fugiat sed.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ipsam voluptatum, odio quam omnis iste laudantium, itaque architecto, eos ullam debitis delectus sapiente nemo autem reprehenderit. Dolorem quidem facere ipsam! Nisi.</span><span>Vitae quaerat modi voluptatibus ratione numquam? Sapiente aliquid officia pariatur quibusdam aliquam id expedita non recusandae, cumque deserunt asperiores. Corrupti et doloribus aspernatur ipsum asperiores, ipsa unde corporis commodi reiciendis?</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima adipisci minus iste, nesciunt itaque quisquam quidem voluptatum assumenda rerum aliquid, excepturi voluptatem tempora. Possimus ratione alias a error vel, rem.</span><span>Officia esse error accusantium veritatis ad, et sit animi? Recusandae mollitia odit tenetur ad cumque maiores eligendi blanditiis nobis hic tempora obcaecati consequatur commodi totam, debitis, veniam, ducimus molestias ut.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Obcaecati quibusdam, tempora cupiditate quaerat tempore ullam delectus voluptates optio eum placeat provident consequatur iure reprehenderit vero quae sapiente architecto earum nemo.</span><span>Quis molestias sint fuga doloribus, necessitatibus nulla. Esse ipsa, itaque asperiores. Tempora a sequi nobis cumque incidunt aspernatur, pariatur rem voluptatibus. Atque veniam magnam, ea laudantium ipsum reprehenderit sapiente repellendus.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima, pariatur at explicabo aliquid repudiandae vero eum quasi totam voluptates iusto unde ad repellendus ipsam et voluptatem hic adipisci! Vero, nobis!</span><span>Consequatur eligendi quo quas omnis architecto dolorum aperiam doloremque labore, explicabo enim incidunt vitae saepe, quod soluta illo odit provident amet beatae quasi animi. Similique nostrum molestiae animi corrupti qui?</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Molestias quis, tempora laborum incidunt qui fuga adipisci doloremque iusto commodi vitae est, nemo iure placeat ut sit optio, consequuntur voluptas impedit.</span><span>Eos officiis, hic esse unde eaque, aut tenetur voluptate quam sint vel exercitationem totam dolor odio soluta illo praesentium non corrupti! Consequuntur velit, mollitia excepturi. Minus, veniam accusantium! Aliquam, ea!</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reprehenderit quis reiciendis veritatis expedita velit vitae amet magni sunt rerum in blanditiis aut tempore quia fugiat, voluptates officia quaerat quam id.</span><span>Sapiente tempore repudiandae, quae doloremque ullam odio quia ea! Impedit atque, ipsa consequatur quis obcaecati voluptas necessitatibus, cupiditate sunt amet ab modi illum inventore, a dolor enim similique architecto est!</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Itaque non aliquam, sit illo quas deserunt esse nobis reprehenderit quidem fuga beatae eligendi reiciendis omnis qui repellat velit earum blanditiis possimus.</span><span>Provident aspernatur ducimus, illum beatae debitis vitae non dolorum rem officia nostrum natus accusantium perspiciatis ad soluta maiores praesentium eveniet qui hic quis at quaerat ea perferendis. Ut, aut, natus.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ratione corrupti quibusdam, sed hic veniam. Perspiciatis ex, quod architecto natus autem totam at commodi excepturi maxime pariatur corporis, veritatis vero, praesentium.</span><span>Nesciunt suscipit, nobis eos perferendis ex quaerat inventore nihil qui magnam saepe rerum velit reiciendis ipsam deleniti ducimus eligendi odio eius minima vero, nisi voluptates amet eaque, iste, labore laudantium.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illo, voluptas accusantium ad omnis velit distinctio! Adipisci magnam nihil nostrum molestiae rem dolores, ut ad nemo, dolor quos itaque maiores quaerat!</span><span>Quia ad suscipit reprehenderit vitae inventore eius non culpa maiores omnis sit obcaecati vel placeat quibusdam, ipsa exercitationem nam odit, magni nobis. Quam quas, accusamus expedita molestiae asperiores eaque ex?</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rerum explicabo doloribus nihil iusto quasi vel expedita dignissimos amet mollitia, temporibus aut atque architecto assumenda dolorum nam velit deserunt totam numquam.</span><span>Ab perferendis labore, quae. Quidem architecto quo officia deserunt ea doloribus libero molestias id nisi perferendis eum porro, quibusdam! Odit aliquid placeat rem aut officia minus sit esse eos obcaecati!</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eligendi nostrum repellendus placeat, unde aperiam. Fuga, voluptas, minima. Debitis nemo ducimus itaque laboriosam error quaerat reprehenderit quo animi incidunt. Nulla, quis!</span><span>Explicabo assumenda dicta ratione? Tempora commodi asperiores, explicabo doloremque eius quia impedit possimus architecto sit nemo odio eum fuga minima dolor iste mollitia sequi dolorem perspiciatis unde quisquam laborum soluta.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veniam officia corporis, reiciendis laudantium, voluptate voluptates necessitatibus assumenda, delectus quisquam velit deserunt! Reprehenderit, vel quaerat accusantium nesciunt libero animi. Sequi, eveniet?</span><span>Animi natus pariatur porro, alias, veniam aut est tempora adipisci molestias harum modi cumque assumenda enim! Expedita eveniet autem illum rerum nostrum ipsum alias neque aut, dolorum impedit pariatur non?</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quis aliquid rerum, odio veniam ipsam ad officia quos repellat ex aperiam voluptatum optio est animi possimus minus. Sapiente voluptates amet dolorem.</span><span>Illo necessitatibus similique asperiores inventore ut cumque nihil assumenda debitis explicabo rerum, dolorum molestiae culpa accusantium. Nisi doloremque optio provident blanditiis, eum ipsam asperiores, consequatur aliquam vel sit mollitia sunt.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Enim, totam harum perferendis. Minus ea perferendis laboriosam, iste, qui corrupti, quas veritatis omnis officiis animi fuga perspiciatis impedit! Error, harum, voluptas.</span><span>Omnis laborum, cum mollitia facilis ipsa unde distinctio maxime nesciunt illum perspiciatis ut officiis, eligendi numquam dolorem quod modi ipsam est rerum perferendis repellendus totam. Maxime excepturi culpa alias labore.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Impedit deleniti, odit sit consequatur dolorum omnis repellendus, alias vel ullam numquam. Nostrum obcaecati hic, possimus delectus nam atque aliquid explicabo cum.</span><span>Explicabo tenetur minima consequatur, aliquam, laudantium non consequuntur facilis sint, suscipit debitis ex atque mollitia magni quod repellat ratione dolorum excepturi molestiae cumque iusto eos unde? Voluptatum dolores, porro provident!</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. At laboriosam fuga aperiam eveniet, obcaecati esse, nulla porro iure molestiae praesentium sint fugiat ea voluptate suscipit voluptates mollitia, voluptatibus. Autem, non.</span><span>Numquam velit culpa tempora ratione ipsum minus modi in? Nisi reiciendis, voluptate voluptatem maxime repellat quae odio, repellendus aliquid laborum dolorem. Labore, fuga ea minima explicabo quae voluptatum necessitatibus, similique.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quasi, rerum dolorum nemo error fugiat ut, modi, architecto libero maxime laborum repellendus doloribus neque aperiam adipisci quaerat obcaecati deserunt consequuntur amet!</span><span>Sint, assumenda nisi obcaecati doloremque iste. Perspiciatis accusantium, distinctio impedit cum esse recusandae sunt. Officiis culpa dolore eius, doloribus natus, dolorum excepturi vitae fugiat ullam provident harum! Suscipit, assumenda, harum.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Odit, nihil tenetur tempore eligendi qui nesciunt consequatur delectus accusantium consectetur ipsa, nulla doloribus dolores rerum corporis, laborum, laboriosam hic mollitia repellat.</span><span>Ab deleniti vitae blanditiis quod tenetur! Voluptatem temporibus ab eaque quis? Quis odio aliquid harum temporibus totam, ipsa eius iusto fugiat enim in, quibusdam molestiae aliquam consequatur nulla, consequuntur sint.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illum odit praesentium quos, earum nesciunt laudantium illo tempora eligendi, porro doloremque mollitia neque aperiam inventore nam maxime dolor labore aspernatur molestias.</span><span>Voluptatibus provident hic cupiditate placeat, ut reprehenderit nisi eum, dolores ad sed quis. Doloribus molestiae, quae rem odit expedita soluta, facilis animi corporis velit ut in, recusandae harum laboriosam veritatis.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Incidunt repudiandae molestias magnam delectus veritatis labore, corporis dicta officia quos, ad corrupti odit! Ad hic officia maxime eveniet consectetur similique adipisci!</span><span>Quia at, nesciunt aliquid delectus ex alias voluptas maxime hic esse. Incidunt, laborum quos mollitia dolores et! Voluptas commodi asperiores, fugit quidem quis corporis, a eaque, animi, autem deserunt repellendus.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sequi quas, voluptas hic minima inventore optio, id quidem placeat necessitatibus omnis voluptatibus vitae mollitia tempora consequuntur consequatur, illo facilis accusamus illum.</span><span>Voluptates consequuntur ipsam odit. Eius quis ipsam vitae, nihil molestias perferendis corporis recusandae consequatur vero iure blanditiis quas adipisci quos voluptatem rem illo voluptate. Eveniet officiis iure sit laborum veniam.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Suscipit a quis cumque nostrum quisquam molestiae pariatur, asperiores natus necessitatibus adipisci illum cupiditate nam vero, tempora excepturi laborum, earum. Voluptates, nobis.</span><span>Pariatur suscipit, hic blanditiis libero, iusto, quam cupiditate nam error id asperiores repellat ab consequatur vitae ipsa voluptatem totam magni reiciendis expedita maxime dolor! Minus explicabo quas, laborum ab omnis!</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Labore qui ad assumenda placeat optio illo molestias corporis dolorum cum. Doloribus eius autem obcaecati minima, asperiores iure dignissimos ducimus suscipit dolorem.</span><span>Blanditiis earum accusamus eaque temporibus necessitatibus voluptatum dolorem enim debitis inventore assumenda quae error perspiciatis aut, nulla delectus quam ipsa sapiente ea aliquam laboriosam repudiandae. Nesciunt praesentium, beatae eos quasi!</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate dicta voluptate impedit? Ad voluptatum dicta earum perferendis asperiores. Dolore distinctio modi expedita consequatur provident perspiciatis neque totam rerum placeat quas.</span><span>Eveniet optio est possimus iste accusantium ipsum illum. Maiores saepe repudiandae facere, delectus iure dolorem vitae nihil pariatur minima, reprehenderit eligendi dolore impedit, nisi doloribus quidem similique. Optio, delectus, minus.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iste ex molestiae architecto enim nihil tempore, atque consequuntur doloribus recusandae sed consequatur veniam quos, in consectetur perspiciatis magni nostrum ab voluptates.</span><span>Nisi quos mollitia quis in maiores asperiores labore deserunt! Voluptate voluptas adipisci qui hic officia molestias, laborum necessitatibus sint nam vel minus incidunt perspiciatis recusandae sunt, rerum suscipit doloremque possimus!</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. At nihil perferendis quae quidem facilis aliquid pariatur possimus hic asperiores, recusandae exercitationem adipisci atque laborum, delectus, odit ab reprehenderit distinctio dolor.</span><span>Non excepturi quos aspernatur repudiandae laboriosam, unde molestias, totam, sapiente harum accusamus delectus laborum ipsam velit amet nisi! Consectetur aliquam provident voluptatibus saepe repudiandae eveniet laborum beatae, animi, voluptate dolores.</span></p>
    <p><span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cumque magni, eum ipsa, veritatis facere voluptatem dolorum nobis neque minus debitis asperiores iste. Pariatur sequi quam, tempora. Dignissimos, esse similique tempora.</span><span>Ex delectus excepturi autem sunt, nemo repudiandae, recusandae nostrum accusantium nobis temporibus magnam eligendi similique veritatis deleniti, eaque blanditiis possimus at! Repellat alias laboriosam ipsum commodi dolorem, corporis dolore suscipit!</span></p>


    1
    Vâng, nó rất đơn giản nếu bạn xem xét kỹ hơn. Có lẽ đó là OOP làm cho nó trông giống như nó sẽ phức tạp hơn một chút so với thực tế. Các đoạn khác sẽ không bao gồm chức năng cuộn. Vì vậy, tôi đã đăng một cái gì đó một chút hoàn thành. Nếu bạn không quan tâm đến điều đó thì giải pháp của tôi có thể xem xét một chút về nhu cầu của bạn. Để làm cho nó hoạt động trong FF và IE, bạn chỉ cần thêm tiền tố cho CSS tôi nghĩ. Tôi sẽ sửa nó trong trường hợp bất cứ ai khác sẽ yêu cầu làm như vậy. Tôi đã thêm CSS vì tôi muốn làm cho nó "sao chép / dán" giải pháp. Tôi không nghĩ rằng điều này có thể nhận được bất kỳ dễ dàng hơn thế :-).
    DevWL

    Ok đây không phải là vấn đề tiền tố :) nhưng dù sao tôi cũng sẽ sửa nó.
    DevWL

    Vấn đề được giải quyết. Bây giờ nó sẽ hoạt động trong IE, FF và Chrome ... trong IE. Để khắc phục sự cố, phương thức mới [scrollTop ()] đã được triển khai cho nguyên mẫu lớp. Phương thức mới trả về các giá trị liên quan từ trình duyệt mà nó hoạt động trong: // var curentScrollTop = document.documentEuity.scrollTop || tài liệu.body.scrollTop; // trả về curentScrollTop;
    DevWL

    Một lỗi IE khác đã được sửa. classList.add ('class1, class2'); sẽ chỉ áp dụng class1, class2 sẽ bị bỏ qua ,. Khắc phục: classList.add ('class1'); classList.add ('class2'); Nút bây giờ bị ẩn khi tải IE.
    DevWL

    6

    Dễ dàng.

    var scrollIt = function(time) {
        // time = scroll time in ms
        var start = new Date().getTime(),
            scroll = document.documentElement.scrollTop + document.body.scrollTop,
            timer = setInterval(function() {
                var now = Math.min(time,(new Date().getTime())-start)/time;
                document.documentElement.scrollTop
                    = document.body.scrollTop = (1-time)/start*scroll;
                if( now == 1) clearTimeout(timer);
            },25);
    }

    Hoặc chỉ window.scrollTo(x, y);.
    Rob W

    3
    Điều đó không làm động nó mặc dù.
    Niet the Dark Tuyệt đối

    Tôi đã cung cấp một lựa chọn thay thế cho .scrollTop.scrollLeft.
    Rob W

    @NiettheDarkAbsol Đây chỉ là Chức năng quan tâm đến body.scrolltop và documentEuity.scrolltop. nhưng có một số lỗi như cuộn không bao giờ sử dụng, bỏ lỡ dấu hai chấm, v.v. Bạn có thể vui lòng sửa lại không.
    Deniz Porsuk

    @DenizPorsuk Bạn nói đúng về "cuộn không được sử dụng", nó được cho là *scrollkhi tính toán vị trí cuộn. Tuy nhiên, tôi không thấy bất kỳ sự mất tích nào ;...
    Niet the Dark Tuyệt đối

    2

    Chỉ cần thực hiện giải pháp javascript này dưới đây.

    Cách sử dụng đơn giản:

    EPPZScrollTo.scrollVerticalToElementById('wrapper', 0);

    Đối tượng công cụ (bạn có thể sử dụng bộ lọc, giá trị fps):

    /**
     *
     * Created by Borbás Geri on 12/17/13
     * Copyright (c) 2013 eppz! development, LLC.
     *
     * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
     * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     *
     */
    
    
    var EPPZScrollTo =
    {
        /**
         * Helpers.
         */
        documentVerticalScrollPosition: function()
        {
            if (self.pageYOffset) return self.pageYOffset; // Firefox, Chrome, Opera, Safari.
            if (document.documentElement && document.documentElement.scrollTop) return document.documentElement.scrollTop; // Internet Explorer 6 (standards mode).
            if (document.body.scrollTop) return document.body.scrollTop; // Internet Explorer 6, 7 and 8.
            return 0; // None of the above.
        },
    
        viewportHeight: function()
        { return (document.compatMode === "CSS1Compat") ? document.documentElement.clientHeight : document.body.clientHeight; },
    
        documentHeight: function()
        { return (document.height !== undefined) ? document.height : document.body.offsetHeight; },
    
        documentMaximumScrollPosition: function()
        { return this.documentHeight() - this.viewportHeight(); },
    
        elementVerticalClientPositionById: function(id)
        {
            var element = document.getElementById(id);
            var rectangle = element.getBoundingClientRect();
            return rectangle.top;
        },
    
        /**
         * Animation tick.
         */
        scrollVerticalTickToPosition: function(currentPosition, targetPosition)
        {
            var filter = 0.2;
            var fps = 60;
            var difference = parseFloat(targetPosition) - parseFloat(currentPosition);
    
            // Snap, then stop if arrived.
            var arrived = (Math.abs(difference) <= 0.5);
            if (arrived)
            {
                // Apply target.
                scrollTo(0.0, targetPosition);
                return;
            }
    
            // Filtered position.
            currentPosition = (parseFloat(currentPosition) * (1.0 - filter)) + (parseFloat(targetPosition) * filter);
    
            // Apply target.
            scrollTo(0.0, Math.round(currentPosition));
    
            // Schedule next tick.
            setTimeout("EPPZScrollTo.scrollVerticalTickToPosition("+currentPosition+", "+targetPosition+")", (1000 / fps));
        },
    
        /**
         * For public use.
         *
         * @param id The id of the element to scroll to.
         * @param padding Top padding to apply above element.
         */
        scrollVerticalToElementById: function(id, padding)
        {
            var element = document.getElementById(id);
            if (element == null)
            {
                console.warn('Cannot find element with id \''+id+'\'.');
                return;
            }
    
            var targetPosition = this.documentVerticalScrollPosition() + this.elementVerticalClientPositionById(id) - padding;
            var currentPosition = this.documentVerticalScrollPosition();
    
            // Clamp.
            var maximumScrollPosition = this.documentMaximumScrollPosition();
            if (targetPosition > maximumScrollPosition) targetPosition = maximumScrollPosition;
    
            // Start animation.
            this.scrollVerticalTickToPosition(currentPosition, targetPosition);
        }
    };

    8
    Người đàn ông, thực sự? Tạo ra đoạn mã quái dị này giống như sử dụng bệ phóng tên lửa để giết ruồi.
    Killah

    3
    @Killah Tôi thực sự quan tâm đến việc sử dụng đơn giản và chỉ đọc. Tôi có thể đăng nó tối thiểu nếu bạn muốn. :)
    Geri Borbás

    Điều tôi muốn nói là có quá nhiều hàm trợ giúp trong đó (tại sao bạn cần một hàm trợ giúp được sử dụng một lần?), console.warnVà tham số chuỗi setTimeoutkhông phù hợp trong mã sản xuất (hàm thứ hai khá không phù hợp bất cứ nơi nào, vì evalcơ bản là vậy).
    Killah

    1
    Giả sử một lệnh gọi hàm không phải là một thứ đắt tiền, tôi thích trích xuất bất kỳ mã nào cho một hàm được đặt tên thay vì nhận xét mọi thứ xung quanh. Vì vậy, bạn (ít nhất là tôi) có thể đọc mã tốt hơn, mã khách hàng có thể ngắn hơn mười phần.
    Geri Borbás

    2

    Dựa trên một số câu trả lời ở đây, nhưng sử dụng một số phép toán đơn giản để chuyển tiếp suôn sẻ bằng cách sử dụng đường cong hình sin:

    scrollTo(element, from, to, duration, currentTime) {
           if (from <= 0) { from = 0;}
           if (to <= 0) { to = 0;}
           if (currentTime>=duration) return;
           let delta = to-from;
           let progress = currentTime / duration * Math.PI / 2;
           let position = delta * (Math.sin(progress));
           setTimeout(() => {
               element.scrollTop = from + position;
               this.scrollTo(element, from, to, duration, currentTime + 10);
           }, 10);
       }

    Sử dụng:

    // Smoothly scroll from current position to new position in 1/2 second.
    scrollTo(element, element.scrollTop, element.scrollTop + 400, 500, 0);

    Tái bút lưu ý về phong cách ES6


    1

    Đây là một cách tiếp cận trình duyệt chéo dựa trên câu trả lời ở trên

    function scrollTo(to, duration) {
        if (duration < 0) return;
        var scrollTop = document.body.scrollTop + document.documentElement.scrollTop;
        var difference = to - scrollTop;
        var perTick = difference / duration * 10;
    
        setTimeout(function() {
          scrollTop = scrollTop + perTick;
          document.body.scrollTop = scrollTop;
          document.documentElement.scrollTop = scrollTop;
          if (scrollTop === to) return;
          scrollTo(to, duration - 10);
        }, 10);
      }

    Câu trả lời tốt đẹp! Bạn có thể vui lòng giải thích những gì đang xảy ra với differenceperTick?
    Jessica

    1

    Một cách tiếp cận khác là sử dụng window.scrollBy

    Câu đố

    function scroll(pxPerFrame, duration) {
            if (!pxPerFrame || !duration) return;
            const end = new Date().getTime() + duration;
            step(); 
    
            function step() {
              window.scrollBy(0, pxPerFrame);
              if (new Date().getTime() < end) {
                window.setTimeout(step, 1000 / 60);
              } else {
                console.log('done scrolling'); 
              }
            }
          }
    body {
      width: 200px;
    }
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    <p>
    <button onclick="scroll(-5, 3000)">
    scroll(-5, 3000)
    </button>
    </p>


    1

    Tôi đã chọn phiên bản @akai của câu trả lời @timwolla và thêm chức năng stopAnimation, vì vậy trước khi bắt đầu hoạt hình mới, cái cũ có thể bị dừng.

    if ( this.stopAnimation )
        this.stopAnimation()
    
        this.stopAnimation = scrollTo( el, scrollDestination, 300 )
    
    
    // definitions
    
    function scrollTo(element, to, duration) {
        var start = element.scrollTop,
            change = to - start,
            increment = 20,
            timeOut;
    
        var animateScroll = function(elapsedTime) {        
            elapsedTime += increment;
            var position = easeInOut(elapsedTime, start, change, duration);                        
            element.scrollTop = position; 
            if (elapsedTime < duration) {
                timeOut = setTimeout(function() {
                    animateScroll(elapsedTime);
                }, increment);
            }
        };
    
        animateScroll(0);
    
        return stopAnimation
    
        function stopAnimation() {
            clearTimeout( timeOut )
        }
    }
    
    function easeInOut(currentTime, start, change, duration) {
        currentTime /= duration / 2;
        if (currentTime < 1) {
            return change / 2 * currentTime * currentTime + start;
        }
        currentTime -= 1;
        return -change / 2 * (currentTime * (currentTime - 2) - 1) + start;
    }

    0

    Một cách tiếp cận trình duyệt chéo khác dựa trên giải pháp trên

    function doScrollTo(to, duration) {
        var element = document.documentElement;
    
            var start = element.scrollTop,
            change = to - start,
            increment = 20,
            i = 0;
    
        var animateScroll = function(elapsedTime) {
            elapsedTime += increment;
            var position = easeInOut(elapsedTime, start, change, duration);
            if (i === 1 && window.scrollY === start) {
                element = document.body;
                start = element.scrollTop;
            }
            element.scrollTop = position;
            if (!i) i++;
            if (elapsedTime < duration) {
                setTimeout(function() {
                    animateScroll(elapsedTime);
                }, increment);
            }
        };
    
        animateScroll(0);
    }

    Mẹo nhỏ là kiểm soát thay đổi cuộn thực tế và nếu bằng không, hãy thay đổi thành phần cuộn.


    -1

    Hoạt hình cuộn tuyến tính xuống dưới cùng. JS thuần túy, không có JQuery. Có lẽ giải pháp của tôi sẽ hữu ích cho ai đó.

    let action_count = 8;
    let speed_ms = 15;
    let objDiv = document.getElementsByClassName('js_y5_area3').item(0);
    
    let scroll_height = objDiv.scrollHeight;
    let window_height = objDiv.offsetHeight;
    
    let scroll_top = objDiv.scrollTop;
    let need_scroll_top = scroll_height - window_height;
    
    if (scroll_top < need_scroll_top)
    {
        let step = Math.ceil((need_scroll_top - scroll_top) / action_count);
    
        let scrollInterval = setInterval(function()
        {
            scroll_top += step;
            objDiv.scrollTop = scroll_top;
    
            if (scroll_top >= need_scroll_top)
            {
                clearInterval(scrollInterval);
            }
    
        }, speed_ms);
    }

    Bạn có thể thay đổi các biến action_count, speed_msđể cấu hình cuộn hoạt hình theo sở thích của bạn.


    -2

    Sử dụng giải pháp này

    animate(document.documentElement, 'scrollTop', 0, 200);

    Cảm ơn


    Thật không may, có vẻ như đây không phải là hiểu biết nhiều về trình duyệt. :(
    Lucas Morgan

    @LucasMorgan bạn chỉ cần tìm đúng yếu tố dom cho "document.documentElemen", Giống như bất cứ điều gì phù hợp với bạn
    Lokesh Gamot

    1
    Trừ khi có một animate()chức năng trong phạm vi cửa sổ ... Tôi nghĩ bạn hiểu sai. Các Element.animate()chức năng không được công nhận bởi nhiều trình duyệt. Xem developer.mozilla.org/en-US/docs/Web/API/Euity/animate
    Lucas Morgan

    Yep tôi hiểu lầm. Bạn nói về một chức năng jquery. Tôi giả sử bạn sẽ không đưa ra jquery vì câu hỏi không yêu cầu jquery. Lỗi của tôi!
    Lucas Morgan

    -3

    Tôi thấy rằng hầu hết / tất cả các bài viết ở trên tìm kiếm một nút bằng javascript. Điều này hoạt động, miễn là bạn chỉ có một nút. Tôi sẽ khuyên bạn nên xác định một yếu tố "onclick" bên trong nút. Mà "onclick" sau đó sẽ gọi hàm khiến nó cuộn.

    Nếu bạn làm như vậy, bạn có thể sử dụng nhiều hơn một nút, miễn là nút đó trông giống như thế này:

    <button onclick="scrollTo(document.body, 0, 1250)">To the top</button>

    3
    Điều này không hoạt hình.
    dmackerman
    Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
    Licensed under cc by-sa 3.0 with attribution required.