Slick: Multiple sliders makes a problem with the navigation

Created on 4 Mar 2016  Â·  7Comments  Â·  Source: kenwheeler/slick

I am using the Slick jQuery carousel and I have a problem whenever I use the "appendArrows" option:

    $(document).ready(function(){
      $('.post-slider').slick({
        dots: true,
        infinite: true,
        speed: 500,
        slidesToShow: 2,
        slidesToScroll: 1,
        appendArrows: '.button-container',
        centerMode: true
    });
    });

You see, I need to output multiple carousels and yet the number of carousels I display is also the number of times the appendArrows function seems to run inside each carousel.

    <div id="slidersort">
    <div class="slider">
        <span class="drag-handle">☰</span>
        <div class="wrap_lined_header"><h2>News</h2><div class="button-container"></div></div>

        <div class="clr"></div>
        <div class="post-slider">
            <?php 
            $args = array('post_type' => 'news');
            $loop = new WP_Query( $args );

            while ( $loop->have_posts() ) : $loop->the_post();
            ?>
            <div>
                <a class="post-link" href="<?php the_permalink() ?>"> </a>
                <h2><?php the_title(); ?></h2>
                <div class="post-date"><?php the_date('d/m/Y') ?></div>
                <div class="entry-content">
                    <p><?php the_field('summary'); ?></p>
                </div>
            </div>
            <?php endwhile;?>

        </div>
    </div>

    <div class="slider">
        <span class="drag-handle">☰</span>
        <div class="wrap_lined_header"><h2>Weather</h2><div class="button-container"></div></div>

        <div class="clr"></div>
        <div class="post-slider">
            <?php 
            $args = array('post_type' => 'news');
            $loop = new WP_Query( $args );

            while ( $loop->have_posts() ) : $loop->the_post();
            ?>
            <div>
                <a class="post-link" href="<?php the_permalink() ?>"> </a>
                <h2><?php the_title(); ?></h2>
                <div class="post-date"><?php the_date('d/m/Y') ?></div>
                <div class="entry-content">
                    <p><?php the_field('summary'); ?></p>
                </div>
            </div>
            <?php endwhile;?>

        </div>
    </div>

    <div class="slider">
        <span class="drag-handle">☰</span>
        <div class="wrap_lined_header"><h2>Sports</h2><div class="button-container"></div></div>

        <div class="clr"></div>
        <div class="post-slider">
            <?php 
            $args = array('post_type' => 'news');
            $loop = new WP_Query( $args );

            while ( $loop->have_posts() ) : $loop->the_post();
            ?>
            <div>
                <a class="post-link" href="<?php the_permalink() ?>"> </a>
                <h2><?php the_title(); ?></h2>
                <div class="post-date"><?php the_date('d/m/Y') ?></div>
                <div class="entry-content">
                    <p><?php the_field('summary'); ?></p>
                </div>
            </div>
            <?php endwhile;?>

        </div>
    </div>
</div>

So let's say I have 3 carousels displaying (as above), whenever I display the page, it returns me 3 buttons like this in EACH carousel:

    <div class="button-container">
    <button type="button" data-role="none" class="slick-prev slick-arrow" aria-label="Previous" role="button">Previous</button>
    <button type="button" data-role="none" class="slick-prev slick-arrow" aria-label="Previous" role="button">Previous</button>
    <button type="button" data-role="none" class="slick-prev slick-arrow" aria-label="Previous" role="button">Previous</button>
    <button type="button" data-role="none" class="slick-next slick-arrow" aria-label="Next" role="button">Next</button>
    <button type="button" data-role="none" class="slick-next slick-arrow" aria-label="Next" role="button">Next</button>
    <button type="button" data-role="none" class="slick-next slick-arrow" aria-label="Next" role="button">Next</button>
    </div>

Any ideas on how I can alter the original jQuery call to play nice with 3 carousels? I was thinking how I could get the appendArrows option to display only the BEGINNING of a class name then I could run a simple PHP loop to add numerical values to each of them, but I'm afraid my jQuery isn't that up to scratch.

Unless you have a better idea?

Needs Fiddle

Most helpful comment

@quantafire: I've been working around this issue by using a loop and passing selector context to appendArrows and appendDots:

    $('.slider).each(function() {
      $(this).slick({
        appendArrows: $('.slider__arrows', this),
        appendDots:   $('.slider__dots',   this),
        arrows: true,
        dots:   true
      });
    });

It looks like the arrows/dots append calls don't scope things to the current carousel so if you pass a general selector like appendArrows: '.slider__arrows' it'll append to all instances of .slider__arrows on the page and you'll see what you've reported.

It might make sense to scope selectors to within the parent carousel to make things more intuitive to folks trying to implement and customize the carousel.

All 7 comments

Hey @quantafire can you recreate in a reduced test case like a jsfiddle or codepen? See the contribution guidelines. Thanks

Closing pending test case

@quantafire: I've been working around this issue by using a loop and passing selector context to appendArrows and appendDots:

    $('.slider).each(function() {
      $(this).slick({
        appendArrows: $('.slider__arrows', this),
        appendDots:   $('.slider__dots',   this),
        arrows: true,
        dots:   true
      });
    });

It looks like the arrows/dots append calls don't scope things to the current carousel so if you pass a general selector like appendArrows: '.slider__arrows' it'll append to all instances of .slider__arrows on the page and you'll see what you've reported.

It might make sense to scope selectors to within the parent carousel to make things more intuitive to folks trying to implement and customize the carousel.

Late to the conversation but for anyone else looking for answers, This worked for me:

 var index = 0;

  $('.slider').each(function() {
      index++;
      $(this).attr('data-slider', index);

      $(this).slick({
        appendArrows: '.slider[data-slider="+ index +"] .slick-slide',
        appendDots:  '.slider[data-slider="+ index +"] .slick-slide',
        arrows: true,
        dots:   true
      });
    });

I had to add the arrows and dots into the slide for this particular design.

@jmelendev thanks for this solution. You can even simplify it like this:

$('.slider').each(function( index ) {
      $(this).attr('data-slider', index);

      $(this).slick({
        appendArrows: '[data-slider="' + index + '"] .slick-slide',
        appendDots:  '[data-slider="' + index + '"] .slick-slide',
        arrows: true,
        dots:   true
      });
    });

Not all the slick configurations are appending the navigation as a child element of the carousel, some are appending this as a sibling of the slides wrapper (for styling purpose perhaps). In this case, you have to target the element differently.

$('.slider').each(function() {
    $(this).slick({
        ...
        appendArrows: $(this).siblings('.slick-nav'),
        ...
    });
});

@quantafire: I've been working around this issue by using a loop and passing selector context to appendArrows and appendDots:

    $('.slider).each(function() {
      $(this).slick({
        appendArrows: $('.slider__arrows', this),
        appendDots:   $('.slider__dots',   this),
        arrows: true,
        dots:   true
      });
    });

It looks like the arrows/dots append calls don't scope things to the current carousel so if you pass a general selector like appendArrows: '.slider__arrows' it'll append to all instances of .slider__arrows on the page and you'll see what you've reported.

It might make sense to scope selectors to within the parent carousel to make things more intuitive to folks trying to implement and customize the carousel.

Thank you so much man

Was this page helpful?
0 / 5 - 0 ratings

Related issues

jeremymandel picture jeremymandel  Â·  3Comments

Libig picture Libig  Â·  3Comments

rahi-rajeev picture rahi-rajeev  Â·  3Comments

barzev picture barzev  Â·  3Comments

msavov picture msavov  Â·  3Comments