A lightweight, dependency-free JavaScript library for creating smooth CSS linear gradient transitions.
Gradient Animation Plugin provides a powerful utility function that enables smooth, frame-by-frame transitions between CSS linear gradients. Unlike instant CSS changes, this plugin creates fluid animations by interpolating color values, positions, and angles over time using requestAnimationFrame for optimal performance.
Live Demo — Try it in your browser!
Transform your UI with smooth gradient transitions:
Before: ████████████████ → After: ████████████████
[Gold → Pink] [Blue → Purple]
180° angle 270° angle
| Technology | Purpose |
|---|---|
| JavaScript (ES6+) | Core animation logic with modern syntax |
| requestAnimationFrame | Smooth, performant animation loop |
| CSS3 Linear Gradients | Visual rendering with RGBA color support |
| ES6 Modules | Native import/export support |
import changeGradient, { easings } from './gradient_plugin.js';
<script type="module">
import changeGradient from './gradient_plugin.js';
// Your code here
</script>
const { promise, cancel } = changeGradient({
element: '#hero-section', // CSS selector or DOM element
from: {
colors: [[253, 183, 26], [211, 22, 131]], // [top RGB, bottom RGB]
positions: [0, 86], // Color stop positions (%)
angle: 180 // Gradient angle (degrees)
},
to: {
colors: [[66, 134, 244], [156, 39, 176]],
positions: [0, 100],
angle: 270
},
duration: 1000, // Animation duration (ms)
easing: easings.easeInOutQuad // Optional easing function
});
// Async/await
async function animateGradient() {
const { promise } = changeGradient({
element: '#background',
from: {
colors: [[255, 0, 0], [0, 0, 255]],
positions: [0, 100],
angle: 90
},
to: {
colors: [[0, 255, 0], [255, 255, 0]],
positions: [0, 100],
angle: 180
},
duration: 2000
});
await promise;
console.log('Animation complete!');
}
// Promise chain
changeGradient({ /* options */ })
.promise
.then(() => console.log('Done!'))
.catch((err) => console.log('Cancelled:', err.message));
const { promise, cancel } = changeGradient({
element: '#hero',
from: { colors: [[255, 0, 0], [0, 0, 255]], angle: 0 },
to: { colors: [[0, 255, 0], [255, 255, 0]], angle: 360 },
duration: 5000
});
// Cancel after 2 seconds
setTimeout(() => {
cancel();
}, 2000);
// Handle cancellation
promise.catch((err) => {
if (err.message === 'Animation cancelled') {
console.log('Animation was cancelled');
}
});
import changeGradient, { easings } from './gradient_plugin.js';
// Available easings:
// - easings.linear (default)
// - easings.easeInQuad
// - easings.easeOutQuad
// - easings.easeInOutQuad
// - easings.easeInCubic
// - easings.easeOutCubic
// - easings.easeInOutCubic
changeGradient({
element: '#box',
from: { colors: [[100, 100, 100], [50, 50, 50]], angle: 45 },
to: { colors: [[200, 100, 50], [150, 50, 100]], angle: 135 },
duration: 1500,
easing: easings.easeInOutCubic
});
// Or provide a custom easing function
changeGradient({
element: '#box',
from: { colors: [[100, 100, 100], [50, 50, 50]], angle: 45 },
to: { colors: [[200, 100, 50], [150, 50, 100]], angle: 135 },
duration: 1500,
easing: (t) => 1 - Math.pow(1 - t, 3) // Custom ease-out cubic
});
<!DOCTYPE html>
<html>
<head>
<style>
#hero-section {
width: 100%;
height: 400px;
background: linear-gradient(180deg, rgba(253,183,26,1) 0%, rgba(211,22,131,1) 86%);
}
</style>
</head>
<body>
<div id="hero-section">
<h1>Welcome</h1>
</div>
<script type="module">
import changeGradient, { easings } from './gradient_plugin.js';
// Animate on page load
changeGradient({
element: '#hero-section',
from: {
colors: [[253, 183, 26], [211, 22, 131]],
positions: [0, 86],
angle: 180
},
to: {
colors: [[66, 134, 244], [156, 39, 176]],
positions: [0, 100],
angle: 270
},
duration: 1500,
easing: easings.easeInOutQuad
});
</script>
</body>
</html>
changeGradient(options)Creates a smooth gradient animation on the specified element.
| Option | Type | Required | Default | Description |
|---|---|---|---|---|
element |
String \| Element |
Yes | — | CSS selector or DOM element |
from |
Object |
Yes | — | Starting gradient state |
from.colors |
Array<Array<number>> |
Yes | — | RGB arrays [[R,G,B], [R,G,B]] |
from.positions |
Array<number> |
No | [0, 100] |
Color stop positions [0-100, 0-100] |
from.angle |
number |
No | 180 |
Gradient angle in degrees |
to |
Object |
Yes | — | Ending gradient state |
to.colors |
Array<Array<number>> |
Yes | — | RGB arrays [[R,G,B], [R,G,B]] |
to.positions |
Array<number> |
No | [0, 100] |
Color stop positions [0-100, 0-100] |
to.angle |
number |
No | 180 |
Gradient angle in degrees |
duration |
number |
No | 1000 |
Animation duration in milliseconds |
easing |
Function |
No | linear |
Easing function (t: number) => number |
{
promise: Promise<void>, // Resolves when animation completes
cancel: () => void // Stops the animation immediately
}
easingsObject containing built-in easing functions:
| Easing | Description |
|---|---|
linear |
Constant speed (default) |
easeInQuad |
Slow start, accelerating |
easeOutQuad |
Fast start, decelerating |
easeInOutQuad |
Slow start and end |
easeInCubic |
Slower start, more acceleration |
easeOutCubic |
Faster start, more deceleration |
easeInOutCubic |
Smoother slow start and end |
| Browser | Support |
|---|---|
| Chrome | Latest |
| Firefox | Latest |
| Safari | Latest |
| Edge | Latest |
| Opera | Latest |
Requires ES6+ support (all modern browsers).
gradient-animation/
├── README.md # Documentation
└── gradient_plugin.js # Core plugin (ES6 module)
This project showcases proficiency in:
Contributions are welcome! Feel free to submit issues or pull requests.
This project is open source and available under the MIT License.
Built with JavaScript and a passion for smooth user experiences.