我有一个Vue.js组件,其中有几个元素。当组件中的某个方法被调用时,我希望自动滚动到该元素的底部。
基本上,与这里相同。 然而,我没有找到一种方法来获取我的组件内的元素并修改scrollTop
我目前正在使用Vue.js 2.0.8。
我有一个Vue.js组件,其中有几个元素。当组件中的某个方法被调用时,我希望自动滚动到该元素的底部。
基本上,与这里相同。 然而,我没有找到一种方法来获取我的组件内的元素并修改scrollTop
我目前正在使用Vue.js 2.0.8。
el.scrollIntoView()
scrollIntoView()
有一些选项可以传递给它,比如scrollIntoView({behavior: 'smooth'})
,可以获得开箱即用的平滑滚动效果,而且不需要任何外部库。
methods: {
scrollToElement() {
const el = this.$refs.scrollToMe;
if (el) {
// Use el.scrollIntoView() to instantly scroll to the element
el.scrollIntoView({behavior: 'smooth'});
}
}
}
mounted() {
this.scrollToElement();
}
如果你想在按钮点击或其他操作时滚动到它,你可以以同样的方式调用它:
<button @click="scrollToElement">scroll to me</button>
v-for
循环生成的组件中添加mounted() {this.$el.scrollIntoView();}
,以便在添加新元素时自动滚动到该元素。 - Dustin Michels据我理解,您想要的效果是在某些情况下(例如:向列表中添加项时),将列表(或可滚动的
var container = this.$el.querySelector("#container");
container.scrollTop = container.scrollHeight;
我在这个 fiddle中提供了一个可用的示例。
每次向列表添加项目时,列表将滚动到末尾以显示新项目。
scrollToTop:false
,以使其在更改路由之间生效。 - tObithis.$refs
来获取元素。 - Jesús Vera我尝试了被接受的解决方案,但它对我没有用。我使用浏览器调试器,并发现实际应该使用的高度是 clientHeight
,但是您必须将其放入整个解决方案的 updated()
钩子中才能使其正常工作。
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;
},
$nextTick()
的回调函数(或等待它)。这将产生相同的效果,但可能需要更少的资源。 - phil294scrollToTop: false
,以便在更改路由时它能够正常工作。 - tObiref
属性进行引用<div class="content scrollable" ref="msgContainer">
<!-- content -->
</div>
data() {
return {
count: 5
};
},
watch: {
count: function() {
this.$nextTick(function() {
var container = this.$refs.msgContainer;
container.scrollTop = container.scrollHeight + 120;
});
}
}
.scrollable {
overflow: hidden;
overflow-y: scroll;
height: calc(100vh - 20px);
}
这里是一个使用ref
将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>
注意,通过在HTML中添加ref='messageDisplay'
,您可以通过vueContent.$refs.messageDisplay
访问该元素。
如果你需要支持IE11和(旧版)Edge浏览器,可以使用以下代码:
scrollToBottom() {
let element = document.getElementById("yourID");
element.scrollIntoView(false);
}
scrollToBottom() {
let element = document.getElementById("yourID");
element.scrollIntoView({behavior: "smooth", block: "end"});
}
尝试使用vue-chat-scroll
:
通过npm安装:npm install --save vue-chat-scroll
导入:
import Vue from 'vue'
import VueChatScroll from 'vue-chat-scroll'
Vue.use(VueChatScroll)
window.Vue = require('vue').default;
之后使用它,如下所示:<ul class="messages" v-chat-scroll>
// your message/chat code...
</ul>
如果以上没有找到可行的解决方案,我相信我有一个可行的解决方案。我的具体使用情况是,当数组中添加新消息时,我想要滚动到特定 div 的底部,例如我的聊天框。
const container = this.$el.querySelector('#messagesCardContent');
this.$nextTick(() => {
// DOM updated
container.scrollTop = container.scrollHeight;
});
在数据改变后滚动之前,我们需要等待dom更新,因此我必须使用nextTick!
我将上述代码放在了messages数组的watcher中:
messages: {
handler() {
// this scrolls the messages to the bottom on loading data
const container = this.$el.querySelector('#messagesCard');
this.$nextTick(() => {
// DOM updated
container.scrollTop = container.scrollHeight;
});
},
deep: true,
},
ref
属性}}声明对html元素的引用,以便在vue的组件方法中使用它们。方法
是某个UI事件的处理程序,并且目标与您想要在空间中滚动的div相关,则可以简单地{{link2:传递事件对象}}以及您想要的参数,并像scroll(event.target.nextSibling)
这样进行滚动。这是对我有效的方法。
this.$nextTick(() => {
let scrollHeight = this.$refs.messages.scrollHeight
window.scrollTo(0, scrollHeight)
})