A library used to position poppers in web applications.
A popper is an element on the screen which "pops out" from the natural flow of your application.
Common examples of poppers are tooltips, popovers and drop-downs.
Well, basically, no.
Popper.js is a positioning engine, its purpose is to calculate the position of an element
to make it possible to position it near a given reference element.
The engine is completely modular and most of its features are implemented as modifiers
(similar to middlewares or plugins).
The whole code base is written in ES2015 and its features are automatically tested on real browsers thank to SauceLabs and TravisCI.
Popper.js has zero dependencies. No jQuery, no LoDash, nothing.
It's used by big companies like Microsoft in WebClipper and Atlassian in AtlasKit.
This is the engine, the library that computes and, optionally, applies the styles to the poppers.
Some of the key points are:
- Position elements keeping them in their original DOM context (doesn't mess with your DOM!);
- Allows to export the computed informations to integrate with React and other view libraries;
- Supports Shadow DOM elements;
- Completely customizable thanks to the modifiers based structure;
Visit our project page to see a lot of examples of what you can do with Popper.js!
Find the documentation here.
Since lot of users just need a simple way to integrate powerful tooltips in their projects,
we created Tooltip.js.
It's a small library that makes it easy to automatically create tooltips using as engine Popper.js.
It's API is almost identical to the famous tooltip system of Bootstrap, in this way it will be
easy to integrate it in your projects.
The tooltips generated by Tooltip.js are accessible thanks to the aria
tags.
Find the documentation here.
Popper.js is available on the following package managers and CDNs:
Source | |
---|---|
npm | npm install popper.js --save |
yarn | yarn add popper.js |
Bower | bower install popper.js --save |
unpkg | https://unpkg.com/popper.js |
cdnjs | https://cdnjs.com/libraries/popper.js |
Tooltip.js as well:
Source | |
---|---|
npm | npm install tooltip.js --save |
yarn | yarn add tooltip.js |
Bower | bower install tooltip.js=https://unpkg.com/tooltip.js --save |
unpkg | https://unpkg.com/tooltip.js |
cdnjs | https://cdnjs.com/libraries/popper.js |
Given an existing popper, ask Popper.js to position it near its button
var reference = document.querySelector('.my-button');
var popper = document.querySelector('.my-popper');
var anotherPopper = new Popper(
reference,
popper,
{
// popper options here
}
);
Popper.js supports two kind of callbacks, the onCreate
callback is called after
the popper has been initalized. The onUpdate
one is called on any subsequent update.
const reference = document.querySelector('.my-button');
const popper = document.querySelector('.my-popper');
new Popper(reference, popper, {
onCreate: (data) => {
// data is an object containing all the informations computed
// by Popper.js and used to style the popper and its arrow
// The complete description is available in Popper.js documentation
},
onUpdate: (data) => {
// same as `onCreate` but called on subsequent updates
}
});
Popper.js is based on a "plugin-like" architecture, most of the features of it are fully encapsulated "modifiers".
A modifier is a function that is called each time Popper.js needs to compute the position of the popper. For this reason, modifiers should be very performant to avoid bottlenecks.
To learn how to create a modifier, read the modifiers documentaton
Integrate 3rd party libraries in React or other libraries can be a pain because
they usually alter the DOM and drives the libraries crazy.
Popper.js limits all its DOM modifications inside the applyStyle
modifier,
you can simply disable it and manually apply the popper coordinates using
your library of choice.
This made possible for some great developers to create libraries based on Popper.js that integrate in popular frameworks:
- react-popper by @souporserious for React
- ak-layer by @Atlassian for React
- vue-popper-component by @antongorodezkiy for Vue.js
Alternatively, you may even define your own applyStyles
with your custom one and
integrate Popper.js by yourself!
function applyReactStyle(data) {
// export data in your framework and use its content to apply the style to your popper
};
const reference = document.querySelector('.my-button');
const popper = document.querySelector('.my-popper');
new Popper(reference, popper, {
modifiers: {
applyStyle: { enabled: false },
applyReactStyle: {
enabled: true,
function: applyReactStyle,
order: 800,
},
},
});
Since the API changed, we prepared some migration instructions to make it easy to upgrade to Popper.js v1.
Feel free to comment inside the issue if you have any questions.
Popper.js is very performant. It usually takes 0.5ms to compute a popper's position (on an iMac with 3.5G GHz Intel Core i5).
This means that it will not cause any jank, leading to a smooth user experience.
The aim of Popper.js is to provide a stable and powerful positioning engine ready to
be used in 3rd party libraries.
Lot of projects are already using Popper.js, you can see the complete list visiting
the related npm page.
Another useful list is provided by NPM-Graph.
I want to thank some friends and projects for the work they did:
- @AndreaScn for its work on the GitHub Page and the manual testing he did during the development;
- @vampolo for the original idea and for the name of the library;
- Sysdig for all the awesome things I learned during these years that made possible for me to write this library;
- Tether.js for having inspired me in writing a positioning library ready for the real world;
- The Contributors for their much appreciated Pull Requests and bug reports;
- you for the star you'll give to this project and for being so awesome to give this project a try :)
Code and documentation copyright 2016 Federico Zivolo. Code released under the MIT license. Docs released under Creative Commons.