@uxieverity/vue3-observe-visibility
v1.0.1
Published
Detect when an element is becoming visible or hidden on the page.
Downloads
8
Readme
Table of contents
Installation
npm install --save @uxieverity/vue3-observe-visibility
⚠️ This plugin uses the Intersection Observer API that is not supported in every browser (currently supported in Edge, Firefox and Chrome). You need to include a polyfill to make it work on incompatible browsers.
Import
import { createApp } from 'vue'
import VueObserveVisibility from '@uxieverity/vue3-observe-visibility'
const app = createApp()
app.use(VueObserveVisibility)
Or:
import { createApp } from 'vue'
import { ObserveVisibility } from '@uxieverity/vue3-observe-visibility'
const app = createApp()
app.directive('observe-visibility', ObserveVisibility)
Browser
<script src="vue.js"></script>
<script src="https://unpkg.com/@uxieverity/[email protected]/dist/index.browser.js"></script>
<script type="module">
const app = Vue.createApp()
app.use(VueObserveVisibility)
</script>
Usage
The v-observe-visibility
directive is very easy to use. Just pass a function as the value:
<div v-observe-visibility="visibilityChanged">
This also works on components:
<MyComponent v-observe-visibility="visibilityChanged" />
The function will be called whenever the visiblity of the element changes with the argument being a boolean (true
means the element is visible on the page, false
means that it is not).
The second argument is the corresponding IntersectionObserverEntry object.
visibilityChanged (isVisible, entry) {
this.isVisible = isVisible
console.log(entry)
}
IntersectionObserver options
It's possible to pass the IntersectionObserver options
object using the intersection
attribute:
<div v-observe-visibility="{
callback: visibilityChanged,
intersection: {
root: ...,
rootMargin: ...,
threshold: 0.3,
},
}">
Once
It can be useful to listen for when the element is visible only once, for example to build introduction animations. Set the once
option to true
:
<div v-observe-visibility="{
callback: visibilityChanged,
once: true,
}">
Throttling visibility
You can use the throttle
options (in ms) specifying minimal state duration after which an event will be fired. It's useful when you are tracking visibility while scrolling and don't want events from fastly scrolled out elements.
<div v-observe-visibility="{
callback: visibilityChanged,
throttle: 300,
}">
You can also pass a leading
option to trigger the callback the first time when the visibility changes without waiting for the throttle delay.
I can either be visible
, hidden
or both
.
<div v-observe-visibility="{
callback: visibilityChanged,
throttle: 300,
throttleOptions: {
leading: 'visible',
},
}">
Passing custom arguments
You can add custom argument by using an intermediate function:
<div v-observe-visibility="(isVisible, entry) => visibilityChanged(isVisible, entry, customArgument)">
Here visibilityChanged
will be call with a third custom argument customArgument
.
Disabling the observer
Passing a falsy value to the directive will disable the observer:
<div
v-for="(item, index) of items"
:key="item.id"
v-observe-visibility="index === items.length - 1 ? visibilityChanged : false"
>
Example
<div id="app">
<button @click="show = !show">Toggle</button>
<label>
<input type="checkbox" v-model="isVisible" disabled/> Is visible?
</label>
<div ref="test" v-show="show" v-observe-visibility="visibilityChanged">Hello world!</div>
</div>
<script setup>
import { ref } from 'vue'
const show = ref(true);
const isVisible = ref(true);
visibilityChanged (isVisible, entry) {
isVisible.value = isVisible
console.log(entry)
}
</script>