Ich habe eine Vue.js-Komponente mit mehreren Elementen darin. Ich möchte automatisch zum Ende dieses Elements scrollen, wenn eine Methode in der Komponente aufgerufen wird.
Machen Sie im Grunde dasselbe. Ich habe jedoch keine Möglichkeit gefunden, das Element in meiner Komponente zu erhalten und zu ändern scrollTop
Ich verwende derzeit Vue.js 2.0.8.
hat bei mir gut funktioniert stackoverflow.com/questions/11715646/…
– jo jo
22. Februar 2017 um 1:28 Uhr
Max
2022 einfach, lesbar, reibungsloses Scrollen und schadet Ihrem Gehirn nicht … verwenden el.scrollIntoView()
scrollIntoView() hat Optionen, die Sie wie übergeben können scrollIntoView({behavior: 'smooth'}) um reibungsloses Scrollen aus der Box zu erhalten und benötigt keine externen Bibliotheken.
methods: {
scrollToElement() {
const el = this.$refs.scrollToMe;
if (el) {
// Use el.scrollIntoView() to instantly scroll to the element
el.scrollIntoView({behavior: 'smooth'});
}
}
}
Wenn Sie dann beim Laden der Seite zu diesem Element scrollen möchten, können Sie diese Methode wie folgt aufrufen:
mounted() {
this.scrollToElement();
}
Andernfalls, wenn Sie mit einem Klick auf eine Schaltfläche oder einer anderen Aktion dorthin scrollen möchten, können Sie es auf die gleiche Weise nennen:
<button @click="scrollToElement">scroll to me</button>
Das Scrollen funktioniert bis hinunter zu IE 8. Die glattes Scrollen Der Effekt funktioniert nicht standardmäßig in IE oder Safari. Bei Bedarf gibt es eine Füllwatte dafür hier erhältlich wie @mostafaznv in den Kommentaren erwähnt.
Sollte es nicht statt heißen. Denken Sie daran, @ ist die Abkürzung für v-on: und : ist die Abkürzung für v-bind:
– Rohit Nair
5. September 2019 um 4:22 Uhr
Dies scrollt ein Element in die Ansicht, hat bei mir perfekt funktioniert. Hochgestimmt
– James Shisiah
26. November 2019 um 17:20 Uhr
Ich musste aktualisiert statt montiert verwenden, aber funktionierte perfekt 😉
Danke @mostafaznv, dass du das gefunden hast – ich habe meine Antwort mit deinem Polyfill-Vorschlag aktualisiert.
– maxhuty
24. August 2020 um 14:34 Uhr
Italo Ayres
Soweit ich weiß, besteht der gewünschte Effekt darin, zum Ende einer Liste zu scrollen (oder scrollbar div), wenn etwas passiert (z. B.: ein Element zur Liste hinzugefügt wird). In diesem Fall können Sie zum Ende eines Containerelements (oder sogar der Seite selbst) nur mit reinem JavaScript und den VueJS-Selektoren scrollen.
var container = this.$el.querySelector("#container");
container.scrollTop = container.scrollHeight;
Ich habe ein funktionierendes Beispiel in bereitgestellt diese Geige.
Jedes Mal, wenn ein Element zur Liste hinzugefügt wird, wird die Liste zum Ende gescrollt, um das neue Element anzuzeigen.
Hoffe das hilft dir.
Anstatt von this.$el.querySelector Sie können Ihr gewünschtes div auch erhalten, indem Sie es mit auswählen Ref Mechanismus.
– Existiere Deja
12. September 2018 um 7:49 Uhr
Wenn keine Lösung funktioniert, sollten Sie vielleicht $nextTick() googeln. Sie müssen warten, bis der Inhalt vollständig gezeichnet ist, bevor Sie scrollen. (überprüfen Sie Alpeshs Antwort)
– magsch
7. September 2020 um 15:27 Uhr
Für alle, die NUXT verwenden: Sie müssen setzen scrollToTop: false auf Ihrer Seite, damit es zwischen wechselnden Routen funktioniert
– tObi
22. September 2020 um 11:08 Uhr
@GeorgeAbitbol Refs sind eher ein letzter Ausweg (Hack), und das Vertrauen auf sie kann zu Problemen mit dynamischen Komponenten führen: Das $refs-Objekt ist beispielsweise nicht reaktiv, sodass es weiter wächst, wenn Komponenten hinzugefügt und gelöscht werden.
– PeterT
28. November 2020 um 6:30 Uhr
Warum nicht einfach verwenden window.scrollTo(0, document.body.scrollHeight); ?
– nonNumericalFloat
26. Juli 2021 um 9:48 Uhr
Ich habe die akzeptierte Lösung ausprobiert und sie hat bei mir nicht funktioniert. Ich benutze den Browser-Debugger und habe herausgefunden, dass die tatsächliche Höhe, die verwendet werden sollte, die ist clientHeightABER Sie müssen dies in die einfügen updated() Haken, damit die gesamte Lösung funktioniert.
data(){
return {
conversation: [
{
}
]
},
mounted(){
EventBus.$on('msg-ctr--push-msg-in-conversation', textMsg => {
this.conversation.push(textMsg)
// Didn't work doing scroll here
})
},
updated(){ <=== PUT IT HERE !!
var elem = this.$el
elem.scrollTop = elem.clientHeight;
},
Es ist eine gute Lösung, aber alle Aktionen mit Komponenten lösen einen aktualisierten Haken aus, und bei jedem Aktualisierungselement wird nach unten gescrollt
– Schrödingerkatze
26. Juli 2018 um 14:38 Uhr
Danke, ich hatte das gleiche Problem mit der akzeptierten Antwort. Ihre Antwort hat es auch für mich gelöst. 🙂
– Subtraktiv
27. Juli 2018 um 12:37 Uhr
Ein besserer Weg wäre, dies in die relevante Watcher-Methode als Rückruf von (oder nach Erwarten) einzufügen. $nextTick(). Dies hat den gleichen Effekt, benötigt aber möglicherweise deutlich weniger Ressourcen.
– phil294
28. September 2018 um 19:26 Uhr
Für alle, die NUXT verwenden: Sie müssen setzen scrollToTop: false auf Ihrer Seite, damit es zwischen wechselnden Routen funktioniert
– tObi
22. September 2020 um 11:07 Uhr
Alpesh Patil
Verwenden Sie die ref -Attribut für das DOM-Element als Referenz
Hier ist ein einfaches Beispiel mit ref zum Ende von a scrollen div.
/*
Defined somewhere:
var vueContent = new Vue({
el: '#vue-content',
...
*/
var messageDisplay = vueContent.$refs.messageDisplay;
messageDisplay.scrollTop = messageDisplay.scrollHeight;
hat bei mir gut funktioniert stackoverflow.com/questions/11715646/…
– jo jo
22. Februar 2017 um 1:28 Uhr