Glide.js testimonial slider with pagination dots

Create a slider carousel of content (testimonials or whatever you’d like) using glide.js. Also includes pagination dots that appear depending on however many ‘glide__slide’ elements there are, which glide.js doesn’t do for some reason.

CodePen

JavaScript

// ***********************************
//  glide.js
// ***********************************
const glideElement = document.querySelector('.glide__slide')

if (glideElement) {
    // content slider
    document.querySelectorAll('.content-slider .glide').forEach((glide) => {
        let slideshow = new Glide(glide, {
            type: 'slider', // 'slideshow'
            bound: true,
            perView: 1,
            autoplay: 2000,
            swipeThreshold: 40
        })

        // generate pagination bullet for each slide
        let glideIndex = glide.querySelectorAll('.glide__slide').length
        let glideCount = 0;
        while (glideCount < glideIndex) {
            const bullet = document.createElement('button')
            bullet.classList.add('glide__bullet')
            bullet.setAttribute("data-glide-dir", '=' + glideCount)
            const glideBullets = glide.querySelector('.glide__bullets')
            glideBullets.appendChild(bullet)
            glideCount++
        }

        slideshow.mount({})
        // slideshow.mount({ Autoplay, Controls, Swipe })
    })
}

HTML

<div class="testimonials | content-slider pagination-text | mbl-5 mbl-3-vw400 | text-4 ta-c">
    <div class="glide">
        <div class="glide__track" data-glide-el="track">
            <div class="glide__slides">
                <figure class="testimonials__item | glide__slide">
                    <blockquote>Lorem ipsum rutrum hendrerit vehicula. Nullam ac nibh aliquet dolor vulputate porttitor eget et risus. In hac habitasse platea dictumst. Phasellus pretium, dui id maximus pulvinar, ex ex bibendum justo, a commodo justo dolor ut arcu. Donec sit amet eleifend sem, accumsan faucibus lacus. Proin vitae nisl sed neque posuere consequat. Nunc facilisis ipsum at leo pulvinar, placerat mollis sapien rhoncus. Mauris dapibus condimentum metus, sit amet iaculis dui commodo a. Donec pretium dignissim ipsum, vitae congue sapien faucibus sed. In condimentum dapibus vulputate. Sed vel nisi ut felis porta blandit.</blockquote>
                    <figcaption>Nigel, <cite>Cat</cite></figcaption>
                </figure>

                <figure class="testimonials__item | glide__slide">
                    <blockquote>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer dictum fringilla mauris, a mollis ipsum ultricies vel. Vivamus at ultricies quam. Phasellus venenatis quam sit amet quam bibendum, in accumsan velit interdum. Curabitur sagittis, mi eu vulputate aliquet, tellus augue auctor justo, ac feugiat magna sem vel nisl. In sed est erat. Nullam orci purus, ultrices vel lacus nec, maximus efficitur est. Sed dictum sem nec turpis laoreet consequat. Vestibulum scelerisque, nibh tristique placerat vulputate, arcu urna tempor nisi, at ultrices enim nisl sit amet nunc. Suspendisse ac dui sem.</blockquote>
                    <figcaption>Micia, <cite>Cat</cite></figcaption>
                </figure>

                <figure class="testimonials__item | glide__slide">
                    <blockquote>Lorem ipsum  tincidunt risus id ligula pharetra eleifend. Morbi hendrerit odio ac vehicula condimentum. Nam quis magna vitae leo porta tincidunt ultrices facilisis metus. In pulvinar nec magna non rutrum. Vivamus placerat nibh sit amet urna cursus, ut tempus odio facilisis. Vivamus pellentesque eu sapien eu lobortis. Nulla vel iaculis justo. Vivamus id tristique ligula, in volutpat ligula. Integer id diam gravida, pretium magna eget, dignissim velit. Vivamus tincidunt elementum diam.</blockquote>
                    <figcaption>Clyde, <cite>Dog</cite></figcaption>
                </figure>

                <figure class="testimonials__item | glide__slide">
                    <blockquote>Lorem ipsum  posuere metus vitae est ultrices congue. Quisque vel placerat felis. Maecenas egestas, est id hendrerit lacinia, magna nibh interdum lorem, sed pretium dui odio sed elit. Vestibulum ut cursus tortor, quis congue felis. Maecenas convallis porttitor erat, et scelerisque odio luctus sed. Donec sed dolor volutpat, eleifend metus vitae, consectetur leo. Donec quis ornare mi, sed malesuada lorem. Suspendisse potenti. Suspendisse lobortis turpis vitae egestas porttitor. Maecenas et pretium ipsum. Fusce accumsan tortor eget mauris porttitor, vitae faucibus lectus scelerisque. Phasellus nec tincidunt quam. Integer turpis sapien, accumsan vel gravida quis, dignissim nec quam.</blockquote>
                    <figcaption>Nancy, <cite>Cat</cite></figcaption>
                </figure>
            </div>

            <div class="glide__bullets" data-glide-el="controls[nav]">
            </div>
        </div>
    </div>
</div>

CSS

// ***********************************
//  Testimonials
// ***********************************
.testimonials {
  figure {
    margin: 0;
  }

  blockquote {
    font-style: italic;
    font-weight: 400;
  }

  figcaption {
    font-style: normal;
  }
}

.pagination-text {
  .glide {
    list-style: none;

    .glide__bullets {
      width: 100%;
      text-align: center;
      transition: 300ms opacity;
      transform: translate3d(0, 0, 0);
      z-index: 100;

      .glide__bullet {
        background: #000;
        opacity: 0.5;
        width: 10px;
        height: 10px;
        margin: 0 0.1em;
        padding: 0;
        border-radius: 50%;
        border: 2px solid transparent;
        box-shadow: 0 0.25em 0.5em 0 rgba(0, 0, 0, 0.1);
        transition: all .3s ease-in-out;
        line-height: 0;
        cursor: pointer;

        &.glide__bullet--active {
          opacity: 1;
        }
      }
    }
  }
}





// ***********************************
//  glide.js
// ***********************************
/*! Glide main CSS by Jedrzej Chalubek | glidejs.com */

.glide {
  position: relative;
  width: 100%;
  box-sizing: border-box;
}

.glide * {
  box-sizing: inherit;
}

.glide__track {
  overflow: hidden;
}

.glide__slides {
  position: relative;
  width: 100%;
  list-style: none;
  backface-visibility: hidden;
  transform-style: preserve-3d;
  touch-action: pan-Y;
  overflow: hidden;
  margin: 0;
  padding: 0;
  white-space: nowrap;
  display: flex;
  flex-wrap: nowrap;
  will-change: transform;
}

.glide__slides--dragging {
  user-select: none;
}

.glide__slide {
  width: 100%;
  height: 100%;
  flex-shrink: 0;
  white-space: normal;
  user-select: none;
  -webkit-touch-callout: none;
  -webkit-tap-highlight-color: transparent;
}

.glide__slide a {
  user-select: none;
  -webkit-user-drag: none;
  -moz-user-select: none;
  -ms-user-select: none;
}

.glide__arrows {
  -webkit-touch-callout: none;
  user-select: none;
}

.glide__bullets {
  -webkit-touch-callout: none;
  user-select: none;
}

.glide--rtl {
  direction: rtl;
}