Git Product home page Git Product logo

vue-in-viewport-directive's Introduction

Vue In Viewport Directive Build Status

Vue 2 directive that sets CSS classes on its host element based on the elements current position in the viewport. These classes are:

  • in-viewport - Some part of the element is within the viewport
  • above-viewport - Some part of the element is above the viewport
  • below-viewport - Some part of the element is below the viewport

You may want to check out the mixin version of this package: vue-in-viewport-mixin.

Demo: https://bkwld.github.io/vue-in-viewport-directive

Usage

Note, this should not be applied to elements / components that are setting a dynamic class through Vue. See this issue.

  • Register the directive:

     import Vue from 'vue'
     import inViewportDirective from 'vue-in-viewport-directive'
     Vue.directive('in-viewport', inViewportDirective)
  • Use the classes to trigger CSS transitions (for instance):

     <div class='box' v-in-viewport></div>
     <div class='box' v-in-viewport.once='-100px 0px'></div>
     <div class='box' v-in-viewport.once='{ margin: "-10% 0%" }'></div>
     .box {
     	opacity: 0;
     	transition: opacity .3s;
     }
     .box.in-viewport {
     	opacity: 1;
     }
  • Set default offsets:

import inViewportDirective from 'vue-in-viewport-directive'
inViewportDirective.defaults.margin = '-10% 0%'
Vue.directive('in-viewport', inViewportDirective)

Global methods

You can disable all updates and re-enable them globally:

import { enable, disable } from 'vue-in-viewport-directive'
disable()
setTimeout(enable, 500)

This can be used during full page transitions to trigger all the in viewport transitions only once the page transition finishes.

Arguments

Modifiers

  • once - Whether to remove listeners once the element enters viewport. If the element is in viewport when mounted, listeners are never added.

Value

  • Set the value to a string in the style of IntersectionObserver rootMargin to apply an offset to when the in viewport classes get added.

     <div v-in-viewport="'-100px 0px'"></div>
  • Or, set it via an option:

     <div v-in-viewport='{ margin: "-100px 0px" }'></div>
  • Conditionally disable with disabled:

     <div v-in-viewport='{ disabled: true }'></div>

Tests

  1. Start Storybook: yarn storybook
  2. Open Cypress: yarn cypress open

The Travis tests that run on deploy run against the demo site which gets updated as part of the npm version

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.