UNPKG

vue3-chat-scroll-next

Version:

Automatic, yet conditional, scroll-to-bottom directive for Vue.js 3.0

126 lines (93 loc) 4.21 kB
# vue-chat-scroll [![](https://flat.badgen.net/npm/v/vue-chat-scroll?color=red)](https://www.npmjs.com/package/vue-chat-scroll) [![](https://flat.badgen.net/jsdelivr/hits/npm/vue-chat-scroll)](https://www.jsdelivr.com/package/npm/vue-chat-scroll) [![](https://flat.badgen.net/bundlephobia/minzip/vue-chat-scroll?color=orange)](https://bundlephobia.com/result?p=vue-chat-scroll) [![](https://flat.badgen.net/npm/license/vue-chat-scroll)](https://github.com/theomessin/vue-chat-scroll/blob/master/license.md) A plugin for Vue.js that scrolls to the bottom of an element when new content is added within said element. [See demo](https://jsfiddle.net/theomessin/n7542hk1/). ## Installation ### NPM (recommended) ``` npm install --save vue-chat-scroll ``` ``` js import Vue from 'vue' import VueChatScroll from 'vue-chat-scroll' Vue.use(VueChatScroll) ``` ### Simple Script Tag See _examples_ for both Vue 2 and Vue 3 initialization. #### Vue 2 Just include `dist/vue-chat-scroll.js` _after including Vue_. ```html <script src="https://cdn.jsdelivr.net/npm/vue-chat-scroll/dist/vue-chat-scroll.min.js"></script> ``` #### Vue 3 Include `dist/vue-chat-scroll.js` _after including Vue_. ```html <script src="https://cdn.jsdelivr.net/npm/vue-chat-scroll/dist/vue-chat-scroll.min.js"></script> ``` In the app construction, import `window["vue-chat-scroll"]` ```html <script> const { createApp } = Vue; const VueChatScroll = window["vue-chat-scroll"] var App = { ... } createApp(App).use(VueChatScroll).mount("#app") </script> ``` ## Usage There's nothing you need to do in JavaScript except for installation. To use the plugin, simply use the `v-chat-scroll` directive. ``` html <ul class="messages" v-chat-scroll> <li class="message" v-for="n in messages">{{ n }}</li> </ul> ``` #### Prevent scroll down when user has scrolled up & smooth scrolling Alternatively, you can pass a config value to the directive: ``` html <ul class="messages" v-chat-scroll="{always: false, smooth: true}"> <li class="message" v-for="n in messages">{{ n }}</li> </ul> ``` #### Smooth scrolling for updates but not the first time the container comes in view ``` html <ul class="messages" v-chat-scroll="{smooth: true, notSmoothOnInit: true}"> <li class="message" v-for="n in messages">{{ n }}</li> </ul> ``` #### Scroll with dissapearing elements in chat window (see [#30](https://github.com/theomessin/vue-chat-scroll/issues/30)) If you have a "loading" animation that disappears when you receive a message from an external source, use the `scrollonremoved` option to ensure the scroll will happen after the element has been removed ``` html <ul class="messages" v-chat-scroll="{always: false, smooth: true, scrollonremoved:true}"> <li class="message" v-for="n in messages">{{ n }}</li> <li v-if="loading">&bull;&bull;&bull;</li> </ul> ``` If you want to avoid having smooth scroll in this situation (so it instantly scrolls to bottom after loading), but keep it when new messages come, use the `smoothonremoved` set to `false`, while being able to keep `smooth` set to `true` for later messages. ``` html <ul class="messages" v-chat-scroll="{always: false, smooth: true, scrollonremoved:true, smoothonremoved: false}"> <li class="message" v-for="n in messages">{{ n }}</li> <li v-if="loading">&bull;&bull;&bull;</li> </ul> ``` This option only applies if `scrollonremoved` is set to `true`. When not defined behavior defaults to `smooth` property. #### Disable vue-chat-scroll using configuration prop You may use the `enabled` configuration property to control `v-chat-scroll`. ``` html <ul class="messages" :v-chat-scroll="{enabled: enabled}"> <li class="message" v-for="n in messages">{{ n }}</li> </ul> ``` ```js data () => { enabled: false, } ``` ### Events - **v-chat-scroll-top-reached** Will be triggered when the top of scrollbar is reached. If you are using this event for prepending items to the list then also make sure that the config option **always** is set to false. ``` html <ul class="messages" v-chat-scroll="{always: false}" @v-chat-scroll-top-reached="customMethod"> <li class="message" v-for="n in messages">{{ n }}</li> </ul> ```