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
Permalink
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

README.md

VueWaypoint

trigger functions based on elements' positions, based on viewport

Build Status

Demo

demo page

Installation

npm

$ npm install vue-waypoint --save-dev

Vue

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

// Waypoint plugin
Vue.use(VueWaypoint)

Usage

VueWaypoint is a directive named v-waypoint

Template

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

Javascript

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!')
      }
    }
  }
}

API

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:

this.$waypointMap

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.

Caveats

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)