v-body-scroll-lock
A Vue directive to lock the body from scrolling without stopping the target element from scrolling.
Uses the body-scroll-lock library (https://github.com/willmcpo/body-scroll-lock).
Works on mobile and tablet (iOS, Android) and desktop (Chrome, Firefox, Safari).
Installation
Yarn
yarn add v-body-scroll-lock
Npm
npm i v-body-scroll-lock --save
Install the Vue plugin
In your main JS file first import this plugin
import VBodyScrollLock from 'v-body-scroll-lock'
Install the plugin
Vue.use(VBodyScrollLock)
How to use
Add v-body-scroll-lock
or v-bsl
(short version) to the element which you want to keep scrollable.
v-body-scroll-lock
and v-bsl
take a boolean
as an argument like v-body-scroll-lock="modalIsOpen"
If modalIsOpen
is true, body scroll lock will be applied to other elements except for the one which has v-body-scroll-lock="modalIsOpen"
Code
For a more deep example checkout App.vue
in /src/App.vue
.
<template>
<div
v-body-scroll-lock="modalIsOpen"
v-show="modalIsOpen"
class="modal"
>
<p>This is a modal! I am scrollable while the body is not!</p>
<button @click="closeModal">Close modal</button>
</div>
</template>
<script>
export default {
name: 'modal',
data() {
return {
modalIsOpen: false,
}
},
methods: {
closeModal() {
this.$set(this, 'modalIsOpen', false)
},
openModal() {
this.$set(this, 'modalIsOpen', true)
}
}
}
</script>
Options
reserveScrollBarGap
Reserves the width of the scrollbar and prevents the unpleasant flickering effect that can occur when locking the body scroll.
More info here.
To enable the reserveScrollBarGap
option add :reserve-scroll-bar-gap
after v-body-scroll-lock
or v-bsl
.
Example: v-body-scroll-lock:reserve-scroll-bar-gap="modalIsOpen"
.
Issues
Issues can be created on the issues page.