Attach and detach event listeners

slider.on(event, handler) and slider.off(event, handler) let you subscribe and unsubscribe to any lifecycle event at any time after initialization — not just in the options. This is useful when UI state changes: for example, only track analytics while a modal is open, or pause logging during a bulk rebuild. The log below shows each event fired in real time.

1
2
3
4
    View code
    <div class="c--slider-a" id="my-slider">
      <div class="c--slider-a__wrapper">
        <div class="c--slider-a__slide">1</div>
        <div class="c--slider-a__slide">2</div>
        <div class="c--slider-a__slide">3</div>
        <div class="c--slider-a__slide">4</div>
      </div>
    </div>
    <div id="my-pag" class="c--slider-a__pagination"></div>
    <div class="ctrl-row">
      <button id="btn-on">on('afterSlideChange')</button>
      <button id="btn-off">off('afterSlideChange')</button>
      <button id="btn-clear">Clear log</button>
    </div>
    <ul id="event-log"></ul>
    .c--slider-a { position: relative; width: 100%; overflow: hidden; }
    .c--slider-a__wrapper { display: flex; will-change: transform; }
    .c--slider-a__slide { flex-shrink: 0; width: 100%; height: 260px; }
    
    .ctrl-row { display: flex; gap: 8px; margin-top: 12px; }
    button { padding: 7px 14px; border: 1px solid #d1d5db; border-radius: 6px; background: #fff; cursor: pointer; font-size: 0.82rem; }
    
    #event-log {
      margin-top: 12px; list-style: none;
      max-height: 180px; overflow-y: auto;
      border: 1px solid #e5e7eb; border-radius: 6px;
      padding: 8px 12px; font-size: 0.82rem; font-family: monospace;
    }
    .ctrl-row {
      display: flex;
      gap: 8px;
      margin-top: 12px;
    }
    
    button {
      padding: 7px 14px;
      border: 1px solid #d1d5db;
      border-radius: 6px;
      background: #fff;
      cursor: pointer;
      font-size: 0.82rem;
    }
    
    #event-log {
      margin-top: 12px;
      list-style: none;
      max-height: 180px;
      overflow-y: auto;
      border: 1px solid #e5e7eb;
      border-radius: 6px;
      padding: 8px 12px;
      font-size: 0.82rem;
      font-family: monospace;
    }
    
    .c--slider-a {
      position: relative;
      width: 100%;
      overflow: hidden;
    
      &__wrapper {
        display: flex;
        will-change: transform;
      }
    
      &__slide {
        flex-shrink: 0;
        width: 100%;
        height: 260px;
      }
    }
    import { Slider } from '@andresclua/sliderkit'
    import { arrows, pagination } from '@andresclua/sliderkit-plugins'
    
    const log = document.getElementById('event-log')
    let listening = false
    
    const handler = ({ index, previousIndex }) => {
      const li = document.createElement('li')
      li.textContent = `[${new Date().toLocaleTimeString()}] afterSlideChange: ${previousIndex} → ${index}`
      log.prepend(li)
    }
    
    const slider = new Slider('#my-slider', {
      loop: true,
      plugins: [
        arrows(),
        pagination({ el: '#my-pag', type: 'dots', clickable: true }),
      ],
    })
    
    document.getElementById('btn-on').addEventListener('click', () => {
      if (!listening) { slider.on('afterSlideChange', handler); listening = true }
    })
    document.getElementById('btn-off').addEventListener('click', () => {
      if (listening) { slider.off('afterSlideChange', handler); listening = false }
    })
    document.getElementById('btn-clear').addEventListener('click', () => { log.innerHTML = '' })

    Multiple events

    Attach handlers to multiple events at once using the on option at init, or call slider.on() for each event you need. Here, beforeSlideChange and afterSlideChange are both logged — letting you see the full lifecycle of each transition, including the brief animation window between them.

    1
    2
    3
    4
      View code
      <div class="c--slider-a" id="my-slider">
        <div class="c--slider-a__wrapper">
          <div class="c--slider-a__slide">1</div>
          <div class="c--slider-a__slide">2</div>
          <div class="c--slider-a__slide">3</div>
        </div>
      </div>
      <div id="my-pag" class="c--slider-a__pagination"></div>
      <button id="btn-clear-multi">Clear log</button>
      <ul id="multi-log"></ul>
      .c--slider-a { position: relative; width: 100%; overflow: hidden; }
      .c--slider-a__wrapper { display: flex; will-change: transform; }
      .c--slider-a__slide { flex-shrink: 0; width: 100%; height: 260px; }
      
      #multi-log {
        margin-top: 12px; list-style: none;
        max-height: 180px; overflow-y: auto;
        border: 1px solid #e5e7eb; border-radius: 6px;
        padding: 8px 12px; font-size: 0.82rem; font-family: monospace;
      }
      #multi-log li.before { color: #2563eb; }
      #multi-log li.after  { color: #059669; }
      #multi-log {
        margin-top: 12px;
        list-style: none;
        max-height: 180px;
        overflow-y: auto;
        border: 1px solid #e5e7eb;
        border-radius: 6px;
        padding: 8px 12px;
        font-size: 0.82rem;
        font-family: monospace;
      }
      
      #multi-log li.before {
        color: #2563eb;
      }
      
      #multi-log li.after {
        color: #059669;
      }
      
      .c--slider-a {
        position: relative;
        width: 100%;
        overflow: hidden;
      
        &__wrapper {
          display: flex;
          will-change: transform;
        }
      
        &__slide {
          flex-shrink: 0;
          width: 100%;
          height: 260px;
        }
      }
      import { Slider } from '@andresclua/sliderkit'
      import { arrows, pagination } from '@andresclua/sliderkit-plugins'
      
      const log = document.getElementById('multi-log')
      
      function addEntry(event, msg, cls) {
        const li = document.createElement('li')
        li.className = cls
        li.textContent = `[${new Date().toLocaleTimeString()}] ${event}: ${msg}`
        log.prepend(li)
      }
      
      const slider = new Slider('#my-slider', {
        loop: true,
        plugins: [
          arrows(),
          pagination({ el: '#my-pag', type: 'dots', clickable: true }),
        ],
        on: {
          beforeSlideChange: ({ index }) =>
            addEntry('beforeSlideChange', `going to ${index}`, 'before'),
          afterSlideChange: ({ index }) =>
            addEntry('afterSlideChange', `now at ${index}`, 'after'),
        },
      })
      
      document.getElementById('btn-clear-multi').addEventListener('click', () => { log.innerHTML = '' })