Plugins

You can extend Embla Carousel with additional features by using plugins. A complete list of official plugins is available here.


Installation

All official plugins are published as separate NPM packages. Each package name starts with the embla-carousel prefix, followed by the plugin's unique name. For example, to install the Autoplay plugin:

npm install embla-carousel-autoplay --save

Usage

The Embla Carousel constructor accepts an array of plugins. Each plugin can provide its own options, methods, and events.

Adding a plugin

The constructor's plugin array is the standard way to add plugins to Embla Carousel. In the example below, the Autoplay plugin is added to the carousel:

import EmblaCarousel from 'embla-carousel'import Autoplay from 'embla-carousel-autoplay'
const wrapperNode = document.querySelector('.embla')const viewportNode = wrapperNode.querySelector('.embla__viewport')
const emblaApi = EmblaCarousel(viewportNode, { loop: true }, [Autoplay()])
emblaApi.plugins().autoplay?.play()
<div class="embla">  <div class="embla__viewport">    <div class="embla__container">      <div class="embla__slide">Slide 1</div>      <div class="embla__slide">Slide 2</div>      <div class="embla__slide">Slide 3</div>    </div>  </div></div>

Note that you can update the plugins passed to the Embla Carousel constructor after initialization using the reInit method.

Constructor options

Plugins can accept their own specific options as the first argument to the plugin constructor. This allows you to configure the plugin to suit your needs:

import EmblaCarousel from 'embla-carousel'import Autoplay from 'embla-carousel-autoplay'
const wrapperNode = document.querySelector('.embla')const viewportNode = wrapperNode.querySelector('.embla__viewport')
const emblaApi = EmblaCarousel(viewportNode, { loop: true }, [  Autoplay({ delay: 4000 })])
emblaApi.plugins().autoplay?.play()
<div class="embla">  <div class="embla__viewport">    <div class="embla__container">      <div class="embla__slide">Slide 1</div>      <div class="embla__slide">Slide 2</div>      <div class="embla__slide">Slide 3</div>    </div>  </div></div>

Global options

All official plugins allow you to set global options that apply to every carousel instance. This lets you override the default plugin settings with your own preferences:

import EmblaCarousel from 'embla-carousel'import Autoplay from 'embla-carousel-autoplay'
Autoplay.globalOptions = { delay: 4000 }
const wrapperNode = document.querySelector('.embla')const viewportNode = wrapperNode.querySelector('.embla__viewport')
const emblaApi = EmblaCarousel(viewportNode, { loop: true }, [Autoplay()])
emblaApi.plugins().autoplay?.play()
<div class="embla">  <div class="embla__viewport">    <div class="embla__container">      <div class="embla__slide">Slide 1</div>      <div class="embla__slide">Slide 2</div>      <div class="embla__slide">Slide 3</div>    </div>  </div></div>

Make sure to assign global options before initializing any carousel and only once. Reassigning global options may cause unexpected behavior and lead to confusing code.

Calling methods

Some plugins also provide their own API methods. You can access these plugin methods using the plugins method, as shown in the example below:

import EmblaCarousel from 'embla-carousel'import Autoplay from 'embla-carousel-autoplay'
const wrapperNode = document.querySelector('.embla')const viewportNode = wrapperNode.querySelector('.embla__viewport')
const emblaApi = EmblaCarousel(viewportNode, { loop: true }, [Autoplay()])
emblaApi.plugins().autoplay?.play()
<div class="embla">  <div class="embla__viewport">    <div class="embla__container">      <div class="embla__slide">Slide 1</div>      <div class="embla__slide">Slide 2</div>      <div class="embla__slide">Slide 3</div>    </div>  </div></div>

Adding event listeners

Some plugins emit their own events, structured as <plugin-name>:eventname. Adding and removing plugin event listeners works the same way as with native Embla events.

The example below shows how to add an event listener to the Autoplay plugin:

import EmblaCarousel from 'embla-carousel'import Autoplay from 'embla-carousel-autoplay'
const wrapperNode = document.querySelector('.embla')const viewportNode = wrapperNode.querySelector('.embla__viewport')
const emblaApi = EmblaCarousel(viewportNode, { loop: true }, [Autoplay()])
const logAutoplayStart = (emblaApi, event) => {  console.log(`${event.type} fired`)}
emblaApi.on('autoplay:play', logAutoplayStart)emblaApi.plugins().autoplay?.play()
<div class="embla">  <div class="embla__viewport">    <div class="embla__container">      <div class="embla__slide">Slide 1</div>      <div class="embla__slide">Slide 2</div>      <div class="embla__slide">Slide 3</div>    </div>  </div></div>

TypeScript

The EmblaPluginType is exported from the core embla-carousel package and can be used as shown below:

import EmblaCarousel, { EmblaPluginType } from 'embla-carousel'import Autoplay from 'embla-carousel-autoplay'
const wrapperNode = <HTMLElement>document.querySelector('.embla')const viewportNode = <HTMLElement>wrapperNode.querySelector('.embla__viewport')
const plugins: EmblaPluginType[] = [Autoplay()]const emblaApi = EmblaCarousel(viewportNode, { loop: true }, plugins)
emblaApi.plugins().autoplay?.play()
<div class="embla">  <div class="embla__viewport">    <div class="embla__container">      <div class="embla__slide">Slide 1</div>      <div class="embla__slide">Slide 2</div>      <div class="embla__slide">Slide 3</div>    </div>  </div></div>
Edit this page on GitHub