Draggable & Touch-friendly Carousel In Vanilla JavaScript – embla-carousel

Category: Javascript , Recommended , Slider | June 16, 2019
Author: davidcetinkaya
Views Total: 109
Official Page: Go to website
Last Update: June 16, 2019
License: MIT


Draggable & Touch-friendly Carousel In Vanilla JavaScript – embla-carousel


The embla-carousel JavaScript library which helps developers to create a responsive, customizable, mobile-friendly carousel component on the web app.

Fully responsive based on CSS flexbox.

How to use it:

Install & download.

# Yarn
$ yarn add embla-carousel

$ npm install embla-carousel --save

Import the embla-carousel.

import EmblaCarousel from 'embla-carousel'

Or load the compiled JavaScript in the document.

<script src="https://unpkg.com/embla-carousel"></script>

Add slides to the embla carousel.

<div class="embla" id="embla">
  <div class="embla__container">
    <div class="embla__slide">
      Slide 1
    <div class="embla__slide">
      Slide 2
    <div class="embla__slide">
      Slide 3

Initialize the embla carousel.

const embla = EmblaCarousel(document.getElementById('embla'))

The basic CSS styles for the embla carousel.

.embla {
  overflow: hidden;

.embla__container {
  display: flex;
  will-change: transform;

.embla__slide {
  position: relative;
  flex: 0 0 auto;
  width: 100%;

Available options to customize the embla carousel.

const embla = EmblaCarousel(document.getElementById('embla'),{

      // or 'start', 'end'
      align: 'center',

      // parent container
      container: '*',

      // the number of slides to show per page
      groupSlides: 1,

      // enable draggable
      draggable: true,
      dragFree: false,

      // infinite loop
      loop: false,

      // animation speed
      speed: 10,

      // start index
      // 0 = slide 1
      startIndex: 0,

      // default CSS classes
      selectedClass: 'is-selected',
      draggableClass: 'is-draggable',
      draggingClass: 'is-dragging'


Available API methods which can be used for creating your own carousel controls.

// gets the container node

// returns an array of slide nodes

// gets the current slide

// gets an array of all slides

// gets the previous slide

// checks if is the first slide

// checks if is the last slide

// checks if has previous slide

// checks if has next slide

// goes to the next slide

// goes to the previous slide

// goes to a specific slide
embla.goTo(index: number);

// updates options
embla.changeOptions(options: options)

// destroys the instance

Event handlers.

// embla.on(event, callback)
// embla.off(event, callback)

embla.on('init', function(e){
  // on init

embla.on('destroy', function(e){
  // on destroy

embla.on('select', function(e){
  // on a slide selected

embla.on('dragStart', function(e){
  // on dragStart

embla.on('dragEnd', function(e){
  // on dragEnd


v0.9.0 (06/16/2019)

  • Added more API.

v0.8.0 (06/13/2019)

  • Add: closeOnScroll option to close pickr if the user scrolls the area behind it. Useful on nested scrollable elements.
  • Change: Make pickr’s position absolute to prevent sticking at the top.
  • Change: Make swatches not-centered

v0.7.2 (06/08/2019)

  • Drag threshold has been lowered. Less drag force is now required for a slide change to occur.

You Might Be Interested In:

Leave a Reply