Div en altına kaydırılsın mı?


807

Raylarda ajax isteklerini kullanarak bir sohbet oluşturuyorum ve çok şans olmadan altına kaydırmak için bir div almaya çalışıyorum.

Bu div her şeyi sarma:

#scroll {
    height:400px;
    overflow:scroll;
}

JS kullanarak varsayılan olarak en alta kaydırmanın bir yolu var mı?

Bir ajax isteğinden sonra onu aşağıya kaydırmanın bir yolu var mı?

Yanıtlar:


1324

Sitemde kullandığım bilgiler:

var objDiv = document.getElementById("your_div");
objDiv.scrollTop = objDiv.scrollHeight;

13
Bu yöntem tüm tarayıcılarda uygun mu?
jondinham

1
@PaulDinh: Ben sadece bu baktı ve scrollHeight kullanarak IE7 ve daha düşük bir sorun var. IE7 için bir çalışma etrafında yok gibi geliyor buraya .
Sean

2
Div içine öğeleri dinamik olarak ekledikten sonra neden çalışmıyor?
Vince

3
@Vince - Bir kerelik bir anlaşma. İçeriği değiştirirseniz, yeniden yürütmeniz gerekir. Komut temel olarak "kaydırma çubuğunu bu konuma taşı" der.
DrFriedParts

8
Ayrıca, örneğin bir div içine yerleştirilmiş öğeleriniz varsa, belirli bir öğeyi görünüme kaydırabilirsiniz. (örneğin, öğe üst div içinde görünür) .. şu şekilde: $ ("#" + instanceID) .scrollTop ($ ("#" + instanceID) [0] .scrollIntoView);
netfed

360

JQuery scrollTop kullanıyorsanız bu çok daha kolaydır :

$("#mydiv").scrollTop($("#mydiv")[0].scrollHeight);

272
Bu nasıl daha kolay?
captainspi

78
2 yerine 1 satır? hiçbir ipucu yok, ancak JQuery ile kolayca yapabileceğiniz şey şu şekilde canlandırın: $ ("# div-id"). animate ({scrollTop: $ ("# div-id") [0] .scrollHeight}, 1000 ); Umarım bu herkese yardımcı olur :)
Samuel

28
kaydırma yapmak için jquery öğesinden dom öğesi almak için [0] gerekir
Jimmy Bosse

14
"JQ'dan bahsetmemek bile, okumak / anlamak daha zor!" Tamamen bir fikir. Örneğin ben JQuery okumak, anlamak ve ile bir şeyler yapmak çok daha kolay buluyorum. Zaten zaten JQuery kullanıyorsanız ve bu çözüm daha iyidir.
Hanna

47
Kendinizi tekrar etmeden:$("#mydiv").scrollTop(function() { return this.scrollHeight; });
Eric

98

Aşağıdaki kodu kullanabilirsiniz:

function scrollToBottom (id) {
   var div = document.getElementById(id);
   div.scrollTop = div.scrollHeight - div.clientHeight;
}

JQuery ile yumuşak bir kaydırma yapmak için :

function scrollSmoothToBottom (id) {
   var div = document.getElementById(id);
   $('#' + id).animate({
      scrollTop: div.scrollHeight - div.clientHeight
   }, 500);
}

Üzerindeki örneğe bakın JSFiddle

Bunun neden işe yaradığı aşağıda açıklanmıştır:

resim açıklamasını buraya girin

Ref: scrollTop , scrollHeight , clientHeight


92

jQuery animate kullanarak :

$('#DebugContainer').stop().animate({
  scrollTop: $('#DebugContainer')[0].scrollHeight
}, 800);

5
Sam bu yorumda söyledi . Yine de gerçek bir cevapta muhtemelen daha yararlıdır!
Quentin Pradet

6
Bu yanıtın birden çok animasyonla ilgili sorunları önleyen .stop () yöntemini nasıl kullandığına dikkat edin .
kalyfe

Şaşırtıcı bir şekilde, daha önce tüm cevaplardan benim için çalışan tek kişi bu. Diğer
div'larımın

Bu benim için işe
yarayan tek şeydi (


31

Mevcut tüm tarayıcılarda çalışan daha yeni bir yöntem :

this.scrollIntoView(false);

1
Bunun yalnızca firefox üzerinde çalıştığını düşünün: developer.mozilla.org/en/docs/Web/API/Element/…
Amrit Kahlon

3
Destek gerçekten atm eksik, ama bu kabul edilirse, o zaman harika olurdu.
Kristjan Liiva

Güncelleme var mı? Bunun iyi bir cevap olarak kabul edilmesi gerektiğini hissediyorum. Yani jQuery hadi?
lkahtz

working: document.querySelector (". mdl-list"). scrollIntoView (false);
Johann Medina

15

Javascript ile yumuşak kaydırma:

document.getElementById('messages').scrollIntoView({ behavior: 'smooth', block: 'end' });


8

Güvenmek istemiyorsanız scrollHeight, aşağıdaki kod yardımcı olur:

$('#scroll').scrollTop(1000000);

1
Sizinkiler de dahil olmak üzere yukarıdaki çözümlerin hiçbiri Android'de Firefox'ta çalışmıyor gibi görünüyor ... herhangi bir düşünce lütfen?
Kaya Toast

Boş ver, çok büyük bir sayı kullanıyordum ( 1E10). Daha küçük bir sayı çalışıyor
andrewtweber

Her zaman önemli
Ben Taliadoros

4
Neden kötü performans olsun ki? Her piksel üzerinde yineleniyor gibi değil. Şimdi kötü uygulama başka bir soru…
devios1

$ ('# scroll'). scrollTop (Infinity), bu da çalışmalıdır.
Madhav Poudel

5

JQuery kullanarak, scrollTop herhangi bir öğe için kaydırma çubuğunun dikey konumunu ayarlamak için kullanılır. güzel de vardır jQuery scrollTo eklentisi animasyon ve farklı seçeneklerle kaydırma için kullanılan ( demos )

var myDiv = $("#div_id").get(0);
myDiv.scrollTop = myDiv.scrollHeight;

aşağı kaydırırken animasyon eklemek için jQuery'nin animate yöntemini kullanmak istiyorsanız , aşağıdaki snippet'i kontrol edin:

var myDiv = $("#div_id").get(0);
myDiv.animate({
    scrollTop: myDiv.scrollHeight
  }, 500);

4

Aynı sorunla karşılaştım, ancak ek bir kısıtlamayla: Kaydırma kabına yeni öğeler ekleyen kod üzerinde hiçbir denetimim yoktu. Burada bulduğum örneklerin hiçbiri tam da bunu yapmama izin vermedi. İşte sonuçta bulduğum çözüm.

Yalnızca modern tarayıcılarda kullanılabilir olmasını sağlayan (çoklu dolgular mevcut olsa da) Mutation Observers( https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver ) kullanır ( çoklu dolgular mevcut olsa da)

Temelde kod sadece bunu yapar:

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});

Kavramı göstermek için bir keman yaptım: https://jsfiddle.net/j17r4bnk/


dinamik kimlik nasıl alınır? <div class="abc"><div data-bind=attr : {'id': myId } ></div></div>Bu kodda olduğu gibi myId bir değişkendir. Bu kimliğe komut dosyasında nasıl erişebilirim?
Irfan Yusanif

Sorunuzu anladığımdan emin değilim. Örneğimde, "myId" kaydırma kabının kimliğidir. Kullanıcının kaydırma yapabileceği birden fazla alan oluşturmak istiyor musunuz?
Benkinass

4

Javascript veya jquery:

var scroll = document.getElementById('messages');
   scroll.scrollTop = scroll.scrollHeight;
   scroll.animate({scrollTop: scroll.scrollHeight});

css:

 .messages
 {
      height: 100%;
      overflow: auto;
  }

4

Bunu gerçekten yararlı buldum, teşekkürler.

Orada Açısal 1.X millet için:

angular.module('myApp').controller('myController', ['$scope', '$document',
  function($scope, $document) {

    var overflowScrollElement = $document[0].getElementById('your_overflow_scroll_div');
    overflowScrollElement[0].scrollTop = overflowScrollElement[0].scrollHeight;

  }
]);

HTML DOM öğelerine karşı jQuery öğelerinin kaydırılmasının açısal ile biraz kafa karıştırıcı olması.

Ayrıca bir sohbet uygulaması için, sohbetlerinizin faydalı olması için yüklendikten sonra bu atamayı yaptığımı buldum, kısa zaman aşımına da tokat atmanız gerekebilir.


3

küçük ek: yalnızca son satır görünürse kayar. küçük bir parça kaydırılırsa içeriği olduğu yerde bırakır (dikkat: farklı yazı tipi boyutlarıyla test edilmez. "> = karşılaştırma" içinde bazı ayarlamalar yapılması gerekebilir):

var objDiv = document.getElementById(id);
var doScroll=objDiv.scrollTop>=(objDiv.scrollHeight-objDiv.clientHeight);                   

// add new content to div
$('#' + id ).append("new line at end<br>"); // this is jquery!

// doScroll is true, if we the bottom line is already visible
if( doScroll) objDiv.scrollTop = objDiv.scrollHeight;

3

Tıpkı bonus pasajı gibi. Açısal kullanıyorum ve bir kullanıcı kullanıcılarla farklı konuşmalar seçtiğinde bir mesaj dizisini aşağı kaydırmaya çalışıyordum. Yeni verilerin iletiler için ng yinelemesiyle div'a yüklendikten sonra kaydırmanın çalıştığından emin olmak için kaydırma snippet'ini zaman aşımı ile sarmanız yeterlidir.

$timeout(function(){
    var messageThread = document.getElementById('message-thread-div-id');
    messageThread.scrollTop = messageThread.scrollHeight;
},0)

Bu, veriler DOM'a eklendikten sonra scroll olayının tetiklenmesini sağlar.


$ Scope şüpheli. $ Uygulamak (geri arama) yanı sıra bu görünüm sindirimi ve yeniden değerlendirme zorlar gibi çalışır.
SStanley

Teşekkür ederim! Gerçekten neden işe alamadım merak ediyorum ve $ zaman aşımı sorunu oldu.
Wayferer

@Wayferer samesetTimeout(function() { ... }, n)
KingRider

3

Ayrıca, jQuery kullanarak aşağıdakiler html,bodyyoluyla belgeye bir animasyon ekleyebilirsiniz :

$("html,body").animate({scrollTop:$("#div-id")[0].offsetTop}, 1000);

"div-id" kimliğiyle div'in üstüne yumuşak bir kaydırma sağlar.


3

Java Komut Dosyası:

document.getElementById('messages').scrollIntoView(false);

Mevcut içeriğin son satırına kaydırır.


2

Bu, belge yüksekliğine göre tamamen aşağı kaydırmanıza olanak tanır

$('html, body').animate({scrollTop:$(document).height()}, 1000);

1

Bunun için çok basit bir yöntem scroll todiv'in yüksekliğine ayarlamaktır .

var myDiv = document.getElementById("myDiv");
window.scrollTo(0, myDiv.innerHeight);

1

Div içindeki son öğeye gidin:

myDiv.scrollTop = myDiv.lastChild.offsetTop

1

Açısal 6 uygulamamda bunu yaptım:

postMessage() {
  // post functions here
  let history = document.getElementById('history')
  let interval    
  interval = setInterval(function() {
    history.scrollTop = history.scrollHeight
    clearInterval(interval)
  }, 1)
}

ClearInterval (aralık) işlevi, manuel yukarı / aşağı kaydırmaya izin vermek için zamanlayıcıyı durduracaktır.


1

Senaryom: Bir kullanıcı tarafından verilen bir dize eklemek ve otomatik olarak listenin sonuna kaydırmak zorunda dize bir listesi vardı. Liste ekranının sabit yüksekliği vardı, bundan sonra taşması gerekiyor.

Jeremy Ruten'in cevabını denedim, işe yaradı, ancak (n-1). Elemente ilerliyordu. Herhangi biri bu tür bir sorunla karşı karşıyaysa, setTimeOut()yöntem geçici çözümünü kullanabilirsiniz . Kodu aşağıdaki şekilde değiştirmeniz gerekir:

setTimeout(() => {
    var objDiv = document.getElementById('div_id');
    objDiv.scrollTop = objDiv.scrollHeight
}, 0)

Sorunu ve çözümünü gösteren oluşturduğum StcakBlitz bağlantısı: https://stackblitz.com/edit/angular-ivy-x9esw8


-1

Bunun eski bir soru olduğunu biliyorum, ama bu çözümlerin hiçbiri benim için işe yaramadı. İstenen sonuçları almak için offset (). Ekranı , sohbet uygulamamdaki son iletiye yavaşça kaydırmak için kullandığım şey :

$("#html, body").stop().animate({
     scrollTop: $("#last-message").offset().top
}, 2000);

Umarım bunun bir başkasına yardımı olur.


-1

Bazen en basit en iyi çözümdür: Bunun yardımcı olup olmayacağını bilmiyorum, istediğim gibi kaydırmamda bana yardımcı oldu. "Y =" ne kadar yüksekse, o kadar aşağı kayar ve elbette "0" en üst demektir, bu nedenle örneğin "1000" alt olabilir veya "2000" veya "3000" vb. sayfası. Bu genellikle onclick veya overmouseover ile bir düğme içinde çalışır.

window.scrollTo(x=0,y=150);

-1

Kaydırılabilir öğenin üstünden mesafeyi, öğenin toplam yüksekliği olarak ayarlayın.

const element = this.shadowRoot.getElementById('my-scrollable-div')
element.scrollTop = element.scrollHeight

Zaten varsa aynı çözümü eklemeyin.
Ason

evet çözüm zaten varsa bunu yapmayın
Oswaldo

-1

HTML DOM scrollIntoView Yöntemini şu şekilde kullanabilirsiniz:

var element = document.getElementById("scroll");
element.scrollIntoView();

-2

kullanın:

var element= $('element');
var maxScrollTop = element[0].scrollHeight - element.outerHeight();
element.scrollTop(maxScrollTop);

veya aşağı kaydırmayı işaretleyin:

    var element = $(element);
    var maxScrollTop = element[0].scrollHeight - element.outerHeight();
    element.on('scroll', function() {
        if ( element.scrollTop() >= maxScrollTop ) {
            alert('scroll to bottom');
        }
    });

scrollTopMax öğesini var olarak maxScrollTop = element [0] .scrollHeight - element.outerHeight ();
Mehdi Bagheri

-2

Bu, sohbet penceresinin altına kaydırmak için yapılıyorsa, aşağıdakileri yapın

Sohbette belirli bir div'e kaydırma fikri şuydu:

1) Kişi, zaman ve mesajdan oluşan her sohbet div, sınıf chat ile bir for döngüsü içinde çalıştırılır.

2) querySelectorAll tüm bu dizileri bulur. 400 düğüm olabilir (400 sohbet)

3) sonuncusuna git

4) scrollIntoView ()

let lastChatBox = document.querySelectorAll('.chatContentBox'); 
lastChatBox = lastChatBox[lastChatBox.length-1]; 
lastChatBox.scrollIntoView(); 

Kullanarak birkaç cevap verilir scrollIntoView, bu yüzden bir tane daha eklemenize gerek yoktur.
Ason
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.