简体   繁体   中英

Swiper.js, multiple swipers with multiple controls on one page

For my Swiper design, I need a new set of controls on each slide, so the controls visually slide away with the slide content itself. Normally, this is no problem.

But as soon as I add multiple swipers on one page and init them using an each function, none of the controls work anymore. Does anyone know how I can have multiple swipers with multiple sets of controls on one page?

Here is my code so far:

 $('.swiper-container').each(function() { var next = $(this).find('.swiper-next'); var prev = $(this).find('.swiper-prev'); var swiper = new Swiper($(this)[0], { navigation: { nextEl: next, prevEl: prev, }, }); });
 * {margin: 0; padding: 0; box-sizing: border-box;} .swiper-container { margin-bottom: 2em; } .swiper-slide { background: rgba(0,0,0,.1); height: 10em; padding: 1em; border-right: 2px solid red; } .swiper-controls { display: flex; } .swiper-controls > div { background: rgba(0,0,0,.2); border: 1px solid white; cursor: pointer; }
 <!-- embed css --> <link href="https://unpkg.com/swiper@8/swiper-bundle.min.css" rel="stylesheet" /> <!-- swiper #01 --> <div class="swiper-container"> <div class="swiper-wrapper"> <!-- slide #01-01 --> <div class="swiper-slide"> <p>slide #01-01</p> <div class="swiper-controls"> <div class="swiper-prev">← previous</div> <div class="swiper-next">next →</div> </div> </div> <!-- slide #01-02 --> <div class="swiper-slide"> <p>slide #01-02</p> <div class="swiper-controls"> <div class="swiper-prev">← previous</div> <div class="swiper-next">next →</div> </div> </div> <!-- slide #01-03 --> <div class="swiper-slide"> <p>slide #01-03</p> <div class="swiper-controls"> <div class="swiper-prev">← previous</div> <div class="swiper-next">next →</div> </div> </div> </div> </div> <!-- swiper #02 --> <div class="swiper-container"> <div class="swiper-wrapper"> <!-- slide #02-01 --> <div class="swiper-slide"> <p>slide #02-01</p> <div class="swiper-controls"> <div class="swiper-prev">← previous</div> <div class="swiper-next">next →</div> </div> </div> <!-- slide #02-02 --> <div class="swiper-slide"> <p>slide #02-02</p> <div class="swiper-controls"> <div class="swiper-prev">← previous</div> <div class="swiper-next">next →</div> </div> </div> <!-- slide #02-03 --> <div class="swiper-slide"> <p>slide #02-03</p> <div class="swiper-controls"> <div class="swiper-prev">← previous</div> <div class="swiper-next">next →</div> </div> </div> </div> </div> <!-- embed js --> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://unpkg.com/swiper@8/swiper-bundle.min.js"></script>

1. For next and previous arrow

You can't have multiple swiper-controls , one in each swiper-slide . You can have only one swiper-controls for each group of slides. As you can read on the official doc , prevEl and nextEl can accept only null | CSSSelector | HTMLElement null | CSSSelector | HTMLElement null | CSSSelector | HTMLElement .

The trick is use CSS to place that one swiper-controls in a way that look like it's in each one:

 document.querySelectorAll(".swiper-container").forEach(function (s) { let next = s.querySelector(".swiper-next"); let prev = s.querySelector(".swiper-prev"); new Swiper(s, { navigation: { nextEl: next, prevEl: prev } }); });
 * {margin: 0; padding: 0; box-sizing: border-box;} .swiper-container { margin-bottom: 2em; } .swiper-slide { background: rgba(0,0,0,.1); height: 10em; padding: 1em; border-right: 2px solid red; } .swiper-controls { display: flex; } .swiper-controls > div { background: rgba(0,0,0,.2); border: 1px solid white; cursor: pointer; }
 <!-- embed css --> <link href="https://unpkg.com/swiper@8/swiper-bundle.min.css" rel="stylesheet" /> <!-- swiper #01 --> <div class="swiper-container"> <div class="swiper-wrapper"> <!-- slide #01-01 --> <div class="swiper-slide"> <p>slide #01-01</p> </div> <!-- slide #01-02 --> <div class="swiper-slide"> <p>slide #01-02</p> </div> <!-- slide #01-03 --> <div class="swiper-slide"> <p>slide #01-03</p> </div> </div> <div class="swiper-controls"> <div class="swiper-prev">← previous</div> <div class="swiper-next">next →</div> </div> </div> <!-- swiper #02 --> <div class="swiper-container"> <div class="swiper-wrapper"> <!-- slide #02-01 --> <div class="swiper-slide"> <p>slide #02-01</p> </div> <!-- slide #02-02 --> <div class="swiper-slide"> <p>slide #02-02</p> </div> <!-- slide #02-03 --> <div class="swiper-slide"> <p>slide #02-03</p> </div> </div> <div class="swiper-controls"> <div class="swiper-prev">← previous</div> <div class="swiper-next">next →</div> </div> </div> <!-- embed js --> <script src="https://unpkg.com/swiper@8/swiper-bundle.min.js"></script>

2. For pagination bullets

However, you can have multiple paginations, those bullet points, even if it's weird because on the doc , el has the same type as nextEl and prevEl :

 document.querySelectorAll(".swiper-container").forEach(function (s) { let next = s.querySelector(".swiper-next"); let prev = s.querySelector(".swiper-prev"); new Swiper(s, { navigation: { nextEl: next, prevEl: prev }, pagination: { el: ".swiper-pagination", clickable: true } }); });
 * { margin: 0; padding: 0; box-sizing: border-box; } .swiper-container { margin-bottom: 2em; } .swiper-slide { background: rgba(0, 0, 0, 0.1); height: 10em; padding: 1em; border-right: 2px solid red; } .swiper-controls { display: flex; } .swiper-controls > div { background: rgba(0, 0, 0, 0.2); border: 1px solid white; cursor: pointer; }
 <!-- embed css --> <link href="https://unpkg.com/swiper@8/swiper-bundle.min.css" rel="stylesheet" /> <!-- swiper #01 --> <div class="swiper swiper-container"> <div class="swiper-wrapper"> <!-- slide #01-01 --> <div class="swiper-slide"> <p>slide #01-01</p> <div class="swiper-pagination"></div> </div> <!-- slide #01-02 --> <div class="swiper-slide"> <p>slide #01-02</p> <div class="swiper-pagination"></div> </div> <!-- slide #01-03 --> <div class="swiper-slide"> <p>slide #01-03</p> <div class="swiper-pagination"></div> </div> </div> <div class="swiper-controls"> <div class="swiper-prev">← previous</div> <div class="swiper-next">next →</div> </div> </div> <!-- swiper #02 --> <div class="swiper swiper-container"> <div class="swiper-wrapper"> <!-- slide #02-01 --> <div class="swiper-slide"> <p>slide #02-01</p> <div class="swiper-pagination"></div> </div> <!-- slide #02-02 --> <div class="swiper-slide"> <p>slide #02-02</p> <div class="swiper-pagination"></div> </div> <!-- slide #02-03 --> <div class="swiper-slide"> <p>slide #02-03</p> <div class="swiper-pagination"></div> </div> </div> <div class="swiper-controls"> <div class="swiper-prev">← previous</div> <div class="swiper-next">next →</div> </div> </div> <!-- embed js --> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://unpkg.com/swiper@8/swiper-bundle.min.js"></script>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM