Scrollen Sie mit Vue.js zum Ende von div

Lesezeit: 5 Minuten

Benutzer-Avatar
wütender Koala

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

Benutzer-Avatar
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.

Hier ist eine Geige.

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 😉

    – Dippas

    3. Juni 2020 um 1:05 Uhr

  • danke für lösung. Sie können diese Füllwatte verwenden github.com/stipsan/scroll-into-view-if-needed

    – mostafaznv

    24. August 2020 um 7:42 Uhr

  • Danke @mostafaznv, dass du das gefunden hast – ich habe meine Antwort mit deinem Polyfill-Vorschlag aktualisiert.

    – maxhuty

    24. August 2020 um 14:34 Uhr


Benutzer-Avatar
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 clientHeight ABER 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


Benutzer-Avatar
Alpesh Patil

  1. Verwenden Sie die ref -Attribut für das DOM-Element als Referenz
<div class="content scrollable" ref="msgContainer">
    <!-- content -->
</div>
  1. Sie müssen eine UHR einrichten
  data() {
    return {
      count: 5
    };
  },
  watch: {
    count: function() {
      this.$nextTick(function() {
        var container = this.$refs.msgContainer;
        container.scrollTop = container.scrollHeight + 120;
      });
    }
  }
  1. Stellen Sie sicher, dass Sie das richtige CSS verwenden
.scrollable {
  overflow: hidden;
  overflow-y: scroll;
  height: calc(100vh - 20px);
}

Benutzer-Avatar
capncanuck

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;
<div id='vue-content'>
  <div ref="messageDisplay" id='messages'>
    <div v-for="message in messages">
      {{ message }}
    </div>
  </div>
</div>

Beachten Sie dies, indem Sie setzen ref="messageDisplay" im HTML haben Sie Zugriff auf das Element durch vueContent.$refs.messageDisplay

Wenn Sie IE11 und (altes) Edge unterstützen müssen, können Sie Folgendes verwenden:

scrollToBottom() {
    let element = document.getElementById("yourID");
    element.scrollIntoView(false);
}

Wenn Sie IE11 nicht unterstützen müssen, funktioniert Folgendes (klarerer Code):

scrollToBottom() {
    let element = document.getElementById("yourID");
    element.scrollIntoView({behavior: "smooth", block: "end"});
}

Benutzer-Avatar
Daljit Singh

Versuchen vue-chat-scroll:

Per npm installieren: npm install --save vue-chat-scroll

Importieren:

import Vue from 'vue'
import VueChatScroll from 'vue-chat-scroll'
Vue.use(VueChatScroll)

in app.js nach window.Vue = require('vue').default;

dann benutze es mit:

<ul class="messages" v-chat-scroll>
  // your message/chat code...
</ul>

1176590cookie-checkScrollen Sie mit Vue.js zum Ende von div

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy