Skip to content

A Vue directive to lock the body scroll without stopping the target element from scrolling.

Notifications You must be signed in to change notification settings

BramHoningh/vue-body-scroll-lock

Repository files navigation

npm

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).

Table of Contents

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.

Contributing

To contribute, please make a pull request.

About

A Vue directive to lock the body scroll without stopping the target element from scrolling.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published