🔔 Alert..!! Get 2 Month Free Cloud Hosting With $200 Bonus From Digital Ocean ACTIVATE DEAL

A super easy magic-move transitions for Vue apps, powered by Ramjet.

Animation

Documentation

Heads up!

The fate of this repo is uncertain. I recommend using my new library, vue-flip-toolkit for all of your magic-move transition needs.

vue-overdrive

Super easy magic-move transitions for Vue apps, powered by Ramjet

npm version

Project Install

# npm npm install vue-overdrive
# yarn yarn add vue-overdrive

Warning!

Currently, vue-overdrive isn't able to morph between shapes with percentage-based border-radius values. You'll need to use a pixel-based value, or you'll get a nasty TypeError. The issue is being tracked here: https://github.com/Rich-Harris/ramjet/issues/57

Examples

Material

1) Morph Shapes (source)

https://vue-overdrive.netlify.com/#/shapes

Shape morph

2) Material-esque transformation (source)

https://vue-overdrive.netlify.com/#/libraries

Material transformation

3) iOS-inspired icon effect (source)

https://vue-overdrive.netlify.com/#/icons

iOS icon effect

What is it?

A Vue.js port of the amazing React Overdrive, using Ramjet under the hood.

How does it work?

Just like with React Overdrive, wrap any two elements in a component. Add the same id to create a transition between the elements.

Import and install

import Overdrive from 'vue-overdrive' Vue.use(Overdrive)

or

import { VOverdrive } from 'vue-overdrive'  // Register the component locally components: {   'overdrive': VOverdrive }

Set up (at least) two different routes with Vue Router

Inside your routes file –

{   path: '/circle',   name: 'Circle',   component: Circle }, {   path: '/rectangle',   name: 'Rectangle',   component: Rectangle  }

Scaffold your components

In Circle.vue:

<template>   <overdrive id="element" :easing="easing" :duration="350">     <div class="circle"></div>   </overdrive> </template>  <script> import * as easing from 'eases/quart-in-out' // Bring 'yr own easing functions! export default {   name: 'el-circle',   data () {     return {       easing     }   } } </script>  <style scoped>   .circle {     width: 100px;     height: 100px;     border-radius: 50%;     background: blue;     float: left;   } </style> 

And in Rectangle.vue –

<template>   <overdrive id="element">     <div class="rectangle"></div>   </overdrive> </template>

Usage with v-if

If you're not using Vue Router (and instead using Vue's built-in v-if directive), be sure to specify a unique key prop on each instance of <overdrive>

<overdrive key="a" id="window" :duration="450" v-if="!windowOpen">   <!-- some element --> </overdrive> <overdrive key="b" id="window" :duration="450" v-if="windowOpen">   <!-- some element --> </overdrive>

Customize it (API)

Prop Description Default Value
id Required. A unique string or number to identify the component.
tag Wrapping element type div
duration Animation duration (in milliseconds) 250
easing Easing Function (must pass a function) ramjet.linear
Event Description
@animation-end Fires once the ramjet animation has completed

You May Also Like