v-waypoint directive for Vue, this is the easiest way to trigger a function when you scroll
Clone or download
Latest commit c90506b Jan 23, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
dist better intersection Jan 14, 2019
docs fonts Jan 21, 2019
src better intersection Jan 14, 2019
test Store clientRect Dec 7, 2017
.babelrc 📝 Babel setup Oct 27, 2017
.eslintrc.js 🚧 Ground Oct 23, 2017
.gitignore 🚧 Ground Oct 23, 2017
.travis.yml 🚑 Crypt Mar 9, 2018
LICENSE Initial commit Dec 6, 2016
README.md offset Jan 23, 2019
package-lock.json 3.3.1 Jan 23, 2019
package.json 3.3.1 Jan 23, 2019
webpack.config.js 🚑 Library export Dec 17, 2017



trigger functions based on elements' positions, based on viewport

Build Status


demo page



$ npm install vue-waypoint --save-dev


import Vue from 'vue'
import VueWaypoint from 'vue-waypoint'

// Waypoint plugin


VueWaypoint is a directive named v-waypoint


  <div v-waypoint="{ active: true, callback: onWaypoint, options: intersectionOptions }"></div>


export default {
  data: () => ({
    intersectionOptions: {
      root: null,
      rootMargin: '0px 0px 0px 0px',
      threshold: [0, 1] // [0.25, 0.75] if you want a 25% offset!
    } // https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API
  methods: {
    onWaypoint ({ going, direction }) {
      // going: in, out
      // direction: top, right, bottom, left
      if (going === this.$waypointMap.GOING_IN) {
        console.log('waypoint going in!')

      if (direction === this.$waypointMap.DIRECTION_TOP) {
        console.log('waypoint going top!')


Directive's options

  • active [boolean]: set this parameter as you wish, changing dynamically the waypoint status (it removes and adds the waypoint physically)

  • callback [function]: every time the waypoint triggers this function will be called with a Waypoint object as parameter

  • options [object]: you can leave this undefined or follow IntersectionObserver API (options)

Waypoint object

Each callback call comes with a Waypoint object defined as follows:

  el: Node,
  going: String,
  direction: String,
  _entry: IntersectionObserverEntry

You can map going and direction with the following global map, callable in every Vue's Component:


Then you can compare map's elements with the callback's parameters:

if (direction === this.$waypointMap.DIRECTION_TOP) {}

Public API methods

  • VueWaypoint.addObserver (Element el, function callback, Object options)

  • VueWaypoint.removeObserver (Element el, function callback)

  • VueWaypoint.map

Best practices

You are encouraged to use v-waypoint directive since it follows the Vue's flow, anyway you can progammatically add new waypoints as you like, even outside Vue's context.

This can be accomplished with addObserver and removeObserver.

You can call them inside Vue's components with this.$addObserver and this.$removeObserver.

They are also available as standalone-plugin, just go with VueWaypoint.addObserver and VueWaypoint.removeObserver.


Waypoint first trigger is on page load, this means it actually triggers its own callback with direction = undefined (yes, we can't determine direction if no scroll has been made by the user)