Scroll to bottom of div?

前端 未结 30 2708
日久生厌
日久生厌 2020-11-21 11:56

I am creating a chat using Ajax requests and I\'m trying to get messages div to scroll to the bottom without much luck.

I am wrapping everything in this div:



        
30条回答
  •  感动是毒
    2020-11-21 12:03

    I have encountered the same problem, but with an additional constraint: I had no control over the code that appended new elements to the scroll container. None of the examples I found here allowed me to do just that. Here is the solution I ended up with .

    It uses Mutation Observers (https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver) which makes it usable only on modern browsers (though polyfills exist)

    So basically the code does just that :

    var scrollContainer = document.getElementById("myId");
    
    // Define the Mutation Observer
    var observer = new MutationObserver(function(mutations) {
    
      // Compute sum of the heights of added Nodes
      var newNodesHeight = mutations.reduce(function(sum, mutation) {
          return sum + [].slice.call(mutation.addedNodes)
            .map(function (node) { return node.scrollHeight || 0; })
            .reduce(function(sum, height) {return sum + height});
      }, 0);
    
      // Scroll to bottom if it was already scrolled to bottom
      if (scrollContainer.clientHeight + scrollContainer.scrollTop + newNodesHeight + 10 >= scrollContainer.scrollHeight) {
        scrollContainer.scrollTop = scrollContainer.scrollHeight;
      }
    
    });
    
    // Observe the DOM Element
    observer.observe(scrollContainer, {childList: true});
    

    I made a fiddle to demonstrate the concept : https://jsfiddle.net/j17r4bnk/

提交回复
热议问题