• Stars
    star
    1,619
  • Rank 27,903 (Top 0.6 %)
  • Language
    JavaScript
  • Created over 7 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Detect when an element is becoming visible or hidden on the page.

vue-observe-visibility logo

vue-observe-visibility

Detect when an element is becoming visible or hidden on the page. Demo

Become a Patreon

Sponsors

sponsors logos


Table of contents

Installation

npm install --save vue-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 Vue from 'vue'
import VueObserveVisibility from 'vue-observe-visibility'

Vue.use(VueObserveVisibility)

Or:

import Vue from 'vue'
import { ObserveVisibility } from 'vue-observe-visibility'

Vue.directive('observe-visibility', ObserveVisibility)

Browser

<script src="vue.js"></script>
<script src="https://unpkg.com/vue-observe-visibility/dist/vue-observe-visibility.min.js"></script>

The plugin should be auto-installed. If not, you can install it manually with the instructions below.

Install all the directives:

Vue.use(VueObserveVisibility)

Use specific directives:

Vue.directive('observe-visibility', VueObserveVisibility.ObserveVisibility)

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>
new Vue({
  el: '#app',
  data: {
    show: true,
    isVisible: true,
  },
  methods: {
    visibilityChanged (isVisible, entry) {
      this.isVisible = isVisible
      console.log(entry)
    },
  },
})
</script>

License

MIT

More Repositories

1

vue-virtual-scroller

⚡️ Blazing fast scrolling for any amount of data
Vue
8,256
star
2

floating-vue

💬 Easy tooltips, popovers, dropdown, menus... for Vue
TypeScript
2,955
star
3

guijs

🐣️ The app that makes your #devlife easier.
Vue
1,269
star
4

peeky

A fast and fun test runner for Vite & Node 🐈️ Powered by Vite ⚡️
TypeScript
683
star
5

vue-9-perf-secrets

Demos from my talk "9 performance secrets revealed"
Vue
555
star
6

vue-googlemaps

Integrate Google Maps in your Vue application
JavaScript
534
star
7

vue-mention

Mention component for Vue.js
Vue
496
star
8

vue-resize

A generic component to detect DOM elements resizing
JavaScript
491
star
9

vue-cli-plugin-apollo

🚀 @vue/cli plugin for Vue Apollo
JavaScript
477
star
10

vue-cli-plugin-ssr

✨ Simple SSR plugin for Vue CLI
JavaScript
444
star
11

vue-progress-path

Progress bars and loading indicators for Vue.js
Vue
421
star
12

awesomejs.dev

Find awesome packages for the framework you are using
Vue
205
star
13

nodepack

📦 A progressive Node.js framework
JavaScript
200
star
14

monorepo-run

Run scripts in monorepo with colors, streaming and separated panes
JavaScript
184
star
15

vue-summit-app

Example App: Vue + GraphQL + Apollo (Devfest Nantes 2017)
JavaScript
183
star
16

vue-supply

Create resources that can automatically be activated and deactivated when used (like subscriptions)
JavaScript
159
star
17

vue-share-components

vue-cli template to publish components easily
JavaScript
153
star
18

portless

Easy local domains with superpowers
TypeScript
113
star
19

vue-apollo-example

Simple vue-apollo example app
Vue
107
star
20

apollo-server-example

A very simple Apollo GraphQL server
JavaScript
92
star
21

vue-router-multi-view

router-view meet v-show meet keep-alive
JavaScript
87
star
22

vue-apollo-todos

Vue Apollo GraphQL mutation examples
Vue
80
star
23

frontpage-vue-app

Apollo "hello world" app, for Vue 2.0
Vue
79
star
24

vueconf-2017-demo

VueConf 2017 GraphQL client demo
Vue
79
star
25

vue-safe-teleport

Recommended for teleporting inside the app
TypeScript
72
star
26

graphql-migrate

🔀 Instantly create or update a SQL database from a GraphQL API schema
TypeScript
58
star
27

kickstart-meteor-vue-huge-app

Example meteor project featuring vue, code-splitting and hot-reload
Vue
48
star
28

meteor-vue2-example

Meteor & Vue 2.0 example
Vue
44
star
29

packt-vue-project-guide

Vue Project Guide Book Sources
JavaScript
43
star
30

reactive-fs

Reactive file system interface
TypeScript
38
star
31

sheep

🐑 Opinionated CLI command to release pnpm monorepos
TypeScript
38
star
32

vue-typegen

Generate types for TypeScript Vue components libraries
TypeScript
37
star
33

blaze2

Vue-powered blaze
JavaScript
35
star
34

meteor-vite

JavaScript
32
star
35

meteor-vue-example

Simple meteor example with vue
Vue
31
star
36

vue-perf-tests

Demos for my 'Vue performance tricks' talk
Vue
27
star
37

meteor-socket-io

Simple meteor example with socket.io
JavaScript
25
star
38

window-button-layout

Retrieve OS window buttons layout (close, maximize, minimize...)
TypeScript
21
star
39

vue-amsterdam-2018

🚀 Demo sources of my talk at Vue Amsterdam 2018
18
star
40

graphql-annotations

Annotate a GraphQL schema
JavaScript
17
star
41

mincopy

a CLI that synchronizes two folders with minimal writes
JavaScript
14
star
42

vue3-devtools-plugin-example

JavaScript
14
star
43

meteor-vue2-example-routing

Simple meteor example with vue 2.x and routing
Vue
14
star
44

apollo-client-browser

A browser-ready version of apollo-client
HTML
12
star
45

nux

Node-webkit web browser
HTML
10
star
46

meteor-vuex-example

Simple meteor app with vuex
JavaScript
10
star
47

vue-ssr-after-2-6

Vue
10
star
48

vue-cli-locale-fr

French localization for @vue/cli
9
star
49

vue2-devtools-plugin-example

TypeScript
8
star
50

code-civil

Static website for the french "code civil"
JavaScript
8
star
51

vue-cli-plugin-demo

A demo plugin for Vue CLI 3
JavaScript
7
star
52

nuxt3-demo

Vue
6
star
53

vue-template-explorer

Explore Vue templates
Vue
6
star
54

meteor-vue-blaze

Example meteor project
JavaScript
5
star
55

wear-calculator

Calculator for Wear OS 3
Kotlin
5
star
56

turbo-vs-vite

Pre-generated apps from vercel/turbo bundler benchmark + additional variations
JavaScript
4
star
57

test-video-perf

Vue
4
star
58

vue-apollo-githunt

Githunt example
JavaScript
4
star
59

electron-vite-vue-test

TypeScript
4
star
60

yarn-check-node

[Yarn berry] Check node version from engines field in package.json
JavaScript
4
star
61

peeky-vue-demo

TypeScript
3
star
62

vue-example

Vue
3
star
63

nuxt-i18n-hmr

Hot reload issue reproduction for nuxt-i18n
Vue
3
star
64

guijs-generator-nuxt

Nuxt project generator for guijs
TypeScript
2
star
65

vue-test-functional

Testing functional components
Vue
2
star
66

vue-cli-plugin-fs-router

2
star
67

meteor-mysql

This is a MeteorJS package which brings strong and easy way in order to write apps using Mysql.
TypeScript
2
star
68

no-unnecessary-boolean-literal-compare-repro

2
star
69

storybook-issue-app-use

Vue
2
star
70

polytech-pokedex-2019

JavaScript
2
star
71

guijs-website

guijs website
Vue
2
star
72

mahjong

C++
1
star
73

vue-ssr-before-2-6

JavaScript
1
star
74

unplugin-icons-issue-94

JavaScript
1
star
75

nuxt-fallback-404

Vue
1
star
76

graphql-autoquery

Mysterious space augment for resolvers
1
star
77

graphql-demo

Meetup demo
JavaScript
1
star
78

repro-rollup-vue2-jsx

JavaScript
1
star
79

webpack-issue-11612

JavaScript
1
star
80

guijs-generator-vue-cli

guijs generator for Vue CLI project
TypeScript
1
star
81

dd-apm-test-ui

Vue
1
star
82

polytech-pokedex

Vue
1
star
83

meteor-vue-example-routing

Simple meteor example with vue and routing
Vue
1
star
84

md-icons-svg

Material Icons (SVG files)
1
star