Как реализовать слайдер наподобие стимовского?
использую библиотеку swiper. у меня два связанных слайдера, один выводит большое фото, на втором маленькие превьюшки так сказать. Суть проблем. 1. не понимаю как добавить нужное поведение scrollbar`у, сейчас при перетаскивании полосы, переключается слайд, хотелось бы, просто пролистывать превьюшки не меняя слайд на основном слайдере, (то есть по факту эти самые превьюшки не должны выбираться при использовании скроллбара) а вот при нажатии на стрелку/превью перелистывать основной слайдер (должны выбираться. это я к тому, что просто отвязать слайдеры нельзя, так как у них всё же должна быть общая навигация) пример: https://imgur.com/a/UCKVeqk
link на библу: https://swiperjs.com
var swiper = new Swiper(".swiper-thumbs", {
loop: true,
spaceBetween: 10,
slidesPerView: 4,
freeMode: true,
watchSlidesProgress: true,
allowTouchMove: false,
});
var swiper2 = new Swiper(".swiper-top", {
loop: true,
spaceBetween: true,
allowTouchMove: false,
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
scrollbar: {
el: '.swiper-scrollbar',
draggable: true
},
thumbs: {
swiper: swiper,
},
});
body {
margin: 0;
padding: 0;
}
.swiper-top {
height: 80%;
width: 100%;
}
.swiper-thumbs {
height: 20%;
box-sizing: border-box;
padding: 10px 0;
}
.swiper-thumbs .swiper-slide {
width: 25%;
opacity: 0.4;
height: 100%;
}
.swiper-thumbs .swiper-slide-thumb-active {
opacity: 1;
}
.swiper-slide img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css" />
<title>новость 1</title>
</head>
<body>
<div class="swiper swiper-top">
<div class="swiper-wrapper">
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-1.jpg"/>
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-2.jpg"/>
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-3.jpg"/>
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-4.jpg"/>
</div>
</div>
</div>
<div class=" swiper swiper-thumbs">
<div class="swiper-wrapper">
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-1.jpg"/>
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-2.jpg"/>
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-3.jpg"/>
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-4.jpg"/>
</div>
</div>
<div class="swiper-scrollbar"></div>
<div class="swiper-button-next"></div>
<div class="swiper-button-prev"></div>
</div>
<script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>
</body>
</html>
var swiper = new Swiper(".swiper-top", {
spaceBetween: true,
allowTouchMove: false,
});
var swiper2 = new Swiper(".swiper-thumbs", {
spaceBetween: 10,
slidesPerView: 4,
freeMode: true,
watchSlidesProgress: true,
allowTouchMove: false,
scrollbar: {
el: ".swiper-scrollbar",
draggable: true
},
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
thumbs: {
swiper: swiper,
},
});
окей, нашел как связывать. На данный момент имеем вот это
var swiper = new Swiper('.swiper-thumbs', {
spaceBetween: 10,
centeredSlides: true,
slidesPerView: 4,
slideToClickedSlide: true,
scrollbar: {
el: '.swiper-scrollbar',
draggable: true,
},
});
var swiper2 = new Swiper('.swiper-top', {
spaceBetween: 10,
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
});
<!-- изначально связываем управления верхнему слайдеру, то есть стрелки переключают оба слайда т.к. стрелки, аргументы верхнего экземпляра, а скролл двигает только миниатюры, ура-->
swiper2.controller.control = swiper;
thumbs=document.querySelector('.swiper-thumbs')
slide_click =thumbs.querySelectorAll('.swiper-slide')
slide_click.forEach(element => {
element.addEventListener('click', function (event) {
<!-- при клике на миниатюры, взаимосвязываем управления, чтобы переключить оба слайда-->
swiper.controller.control = swiper2;
swiper2.controller.control = swiper;
})
});
body {
margin: 0;
padding: 0;
}
.swiper-top {
height: 80%;
width: 100%;
}
.swiper-thumbs {
height: 20%;
box-sizing: border-box;
padding: 10px 0;
}
.swiper-thumbs .swiper-slide {
width: 25%;
opacity: 0.4;
height: 100%;
}
.swiper-thumbs .swiper-slide-thumb-active {
opacity: 1;
}
.swiper-slide img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css" />
<title>новость 1</title>
</head>
<body>
<div class="swiper swiper-top">
<div class="swiper-wrapper">
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-1.jpg"/>
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-2.jpg"/>
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-3.jpg"/>
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-4.jpg"/>
</div>
</div>
</div>
<div class=" swiper swiper-thumbs">
<div class="swiper-wrapper">
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-1.jpg"/>
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-2.jpg"/>
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-3.jpg"/>
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-4.jpg"/>
</div>
</div>
<div class="swiper-scrollbar"></div>
<div class="swiper-button-next"></div>
<div class="swiper-button-prev"></div>
</div>
<script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>
</body>
</html>
осталась маленькая проблема. При клике на миниатюру обоюдная связь остаётся навсегда!
Ответы (1 шт):
У тебя скролл привязан не к нижним превьюшкам, а к верхним. Поэтому происходит перелистывание.
Также у тебя стоит опция loop: true,, но с 4 слайдами она работает.
Вот код из примера и он прекрасно работает так как тебе надо:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Swiper demo</title>
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1" />
<!-- Link Swiper's CSS -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css" />
<!-- Demo styles -->
<style>
html,
body {
position: relative;
height: 100%;
}
body {
background: #eee;
font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
font-size: 14px;
color: #000;
margin: 0;
padding: 0;
}
.swiper {
width: 100%;
height: 100%;
}
.swiper-slide {
text-align: center;
font-size: 18px;
background: #fff;
display: flex;
justify-content: center;
align-items: center;
}
.swiper-slide img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}
body {
background: #000;
color: #000;
}
.swiper {
width: 100%;
height: 300px;
margin-left: auto;
margin-right: auto;
}
.swiper-slide {
background-size: cover;
background-position: center;
}
.mySwiper2 {
height: 80%;
width: 100%;
}
.mySwiper {
height: 20%;
box-sizing: border-box;
padding: 10px 0;
}
.mySwiper .swiper-slide {
width: 25%;
height: 100%;
opacity: 0.4;
}
.mySwiper .swiper-slide-thumb-active {
opacity: 1;
}
.swiper-slide img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}
</style>
</head>
<body>
<!-- Swiper -->
<div style="--swiper-navigation-color: #fff; --swiper-pagination-color: #fff" class="swiper mySwiper2">
<div class="swiper-wrapper">
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-1.jpg" />
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-2.jpg" />
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-3.jpg" />
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-4.jpg" />
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-5.jpg" />
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-6.jpg" />
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-7.jpg" />
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-8.jpg" />
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-9.jpg" />
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-10.jpg" />
</div>
</div>
<div class="swiper-button-next"></div>
<div class="swiper-button-prev"></div>
</div>
<div thumbsSlider="" class="swiper mySwiper">
<div class="swiper-wrapper">
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-1.jpg" />
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-2.jpg" />
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-3.jpg" />
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-4.jpg" />
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-5.jpg" />
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-6.jpg" />
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-7.jpg" />
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-8.jpg" />
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-9.jpg" />
</div>
<div class="swiper-slide">
<img src="https://swiperjs.com/demos/images/nature-10.jpg" />
</div>
</div>
</div>
<!-- Swiper JS -->
<script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>
<!-- Initialize Swiper -->
<script>
var swiper = new Swiper(".mySwiper", {
spaceBetween: 10,
slidesPerView: 4,
freeMode: true,
watchSlidesProgress: true,
});
var swiper2 = new Swiper(".mySwiper2", {
spaceBetween: 10,
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
thumbs: {
swiper: swiper,
},
});
</script>
</body>
</html>