14.12.2019, 17:34
|
|
Профессор
|
|
Регистрация: 15.10.2014
Сообщений: 255
|
|
Посоветуйте простой touch слайдер картинок без внешних библиотек и фреймворков.
Никак не могу найти нормальный простой слайдер картинок для телефона. В основном есть какие-то супер огромные полуплатные библиотеки как Swiper.js и другие.
Мне бы подошло что-то такое https://www.cssscript.com/draggable-...ider-carousel/ , но с ним можно только один слайдер на страницу из-за того, что элементы привязываются по id. Возможно кто-то встречал что-то симпатичное, но с привязкой на class?
|
|
14.12.2019, 17:51
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
Сообщение от sovsem-nub
|
но с ним можно только один слайдер на страницу из-за того, что элементы привязываются по id
|
что мешает сделать цикл по всем слайдерам?
|
|
14.12.2019, 18:00
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
sovsem-nub,
было
var slider = document.getElementById('slider'),
sliderItems = document.getElementById('items'),
prev = document.getElementById('prev'),
next = document.getElementById('next');
slide(slider, sliderItems, prev, next);
стало
document.querySelectorAll('.slider').forEach(function(slider) {
var sliderItems = slider.querySelector('.items'),
prev = slider.querySelector('.prev'),
next = slider.querySelector('.next');
slide(slider, sliderItems, prev, next);
})
в css заменить все # на точку и
всё!!!
|
|
14.12.2019, 18:11
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
Draggable & Touch-friendly Slider Carousel In Pure JS
sovsem-nub,
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
@import url("https://fonts.googleapis.com/css?family=Montserrat");
* {
box-sizing: border-box;
}
body {
height: 100%;
background: #efefef;
color: #333;
font-family: 'Montserrat', sans-serif;
font-weight: 600;
text-align: center;
letter-spacing: 0.15em;
font-size: 18px;
}
.slider {
position: relative;
margin: 20px auto;
width: 400px;
height: 300px;
box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.2);
}
.wrapper {
overflow: hidden;
position: relative;
background: #222;
z-index: 1;
}
.items {
width: 10000px;
position: relative;
top: 0;
left: -400px;
}
.items.shifting {
transition: left .2s ease-out;
}
.slide {
width: 400px;
height: 300px;
cursor: pointer;
float: left;
display: flex;
flex-direction: column;
justify-content: center;
transition: all 1s;
position: relative;
background: #FFCF47;
}
.slider.loaded .slide:nth-child(2),
.slider.loaded .slide:nth-child(7) {
background: #FFCF47;
}
.slider.loaded .slide:nth-child(1),
.slider.loaded .slide:nth-child(6) {
background: #7ADCEF;
}
.slider.loaded .slide:nth-child(3) {
background: #F97C68;
}
.slider.loaded .slide:nth-child(4) {
background: #a78df5;
}
.slider.loaded .slide:nth-child(5) {
background: #ff8686;
}
.control {
position: absolute;
top: 50%;
width: 40px;
height: 40px;
background: #fff;
border-radius: 20px;
margin-top: -20px;
box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.3);
z-index: 2;
}
.prev,
.next {
background-size: 22px;
background-position: center;
background-repeat: no-repeat;
cursor: pointer;
}
.prev {
background-image: url(https://cdn0.iconfinder.com/data/icons/navigation-set-arrows-part-one/32/ChevronLeft-512.png);
left: -20px;
}
.next {
background-image: url(https://cdn0.iconfinder.com/data/icons/navigation-set-arrows-part-one/32/ChevronRight-512.png);
right: -20px;
}
.prev:active,
.next:active {
transform: scale(0.8);
}
</style>
</head>
<body>
<div class="slider">
<div class="wrapper">
<div id="items" class="items">
<span class="slide">Slide 1</span>
<span class="slide">Slide 2</span>
<span class="slide">Slide 3</span>
<span class="slide">Slide 4</span>
<span class="slide">Slide 5</span>
</div>
</div>
<a class="control prev"></a>
<a class="control next"></a>
</div>
<div class="slider">
<div class="wrapper">
<div class="items">
<span class="slide">Slide 1</span>
<span class="slide">Slide 2</span>
<span class="slide">Slide 3</span>
<span class="slide">Slide 4</span>
<span class="slide">Slide 5</span>
</div>
</div>
<a class="control prev"></a>
<a class="control next"></a>
</div>
<div class="slider">
<div class="wrapper">
<div class="items">
<span class="slide">Slide 1</span>
<span class="slide">Slide 2</span>
<span class="slide">Slide 3</span>
<span class="slide">Slide 4</span>
<span class="slide">Slide 5</span>
</div>
</div>
<a class="control prev"></a>
<a class="control next"></a>
</div>
<script>
document.querySelectorAll('.slider').forEach(function(slider) {
var sliderItems = slider.querySelector('.items'),
prev = slider.querySelector('.prev'),
next = slider.querySelector('.next');
slide(slider, sliderItems, prev, next);
})
function slide(wrapper, items, prev, next) {
var posX1 = 0,
posX2 = 0,
posInitial,
posFinal,
threshold = 100,
slides = items.getElementsByClassName('slide'),
slidesLength = slides.length,
slideSize = items.getElementsByClassName('slide')[0].offsetWidth,
firstSlide = slides[0],
lastSlide = slides[slidesLength - 1],
cloneFirst = firstSlide.cloneNode(true),
cloneLast = lastSlide.cloneNode(true),
index = 0,
allowShift = true;
// Clone first and last slide
items.appendChild(cloneFirst);
items.insertBefore(cloneLast, firstSlide);
wrapper.classList.add('loaded');
// Mouse and Touch events
items.onmousedown = dragStart;
// Touch events
items.addEventListener('touchstart', dragStart);
items.addEventListener('touchend', dragEnd);
items.addEventListener('touchmove', dragAction);
// Click events
prev.addEventListener('click', function () { shiftSlide(-1) });
next.addEventListener('click', function () { shiftSlide(1) });
// Transition events
items.addEventListener('transitionend', checkIndex);
function dragStart (e) {
e = e || window.event;
e.preventDefault();
posInitial = items.offsetLeft;
if (e.type == 'touchstart') {
posX1 = e.touches[0].clientX;
} else {
posX1 = e.clientX;
document.onmouseup = dragEnd;
document.onmousemove = dragAction;
}
}
function dragAction (e) {
e = e || window.event;
if (e.type == 'touchmove') {
posX2 = posX1 - e.touches[0].clientX;
posX1 = e.touches[0].clientX;
} else {
posX2 = posX1 - e.clientX;
posX1 = e.clientX;
}
items.style.left = (items.offsetLeft - posX2) + "px";
}
function dragEnd (e) {
posFinal = items.offsetLeft;
if (posFinal - posInitial < -threshold) {
shiftSlide(1, 'drag');
} else if (posFinal - posInitial > threshold) {
shiftSlide(-1, 'drag');
} else {
items.style.left = (posInitial) + "px";
}
document.onmouseup = null;
document.onmousemove = null;
}
function shiftSlide(dir, action) {
items.classList.add('shifting');
if (allowShift) {
if (!action) { posInitial = items.offsetLeft; }
if (dir == 1) {
items.style.left = (posInitial - slideSize) + "px";
index++;
} else if (dir == -1) {
items.style.left = (posInitial + slideSize) + "px";
index--;
}
};
allowShift = false;
}
function checkIndex (){
items.classList.remove('shifting');
if (index == -1) {
items.style.left = -(slidesLength * slideSize) + "px";
index = slidesLength - 1;
}
if (index == slidesLength) {
items.style.left = -(1 * slideSize) + "px";
index = 0;
}
allowShift = true;
}
}
</script>
</body>
</html>
|
|
14.12.2019, 21:26
|
|
Профессор
|
|
Регистрация: 15.10.2014
Сообщений: 255
|
|
Рони, большое спасибо. Всё работает и даже можно разобраться.
если запускать код несколько раз на странице, можно пропускать loaded
document.querySelectorAll('.slider:not(.loaded)'). forEach(function(slider) {....
|
|
15.12.2019, 01:23
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
Сообщение от sovsem-nub
|
если запускать код несколько раз на странице
|
зачем?
|
|
15.12.2019, 09:53
|
|
Профессор
|
|
Регистрация: 15.10.2014
Сообщений: 255
|
|
Сообщение от рони
|
зачем?
|
Сообщение от рони
|
зачем?
|
потому что при загрузке страницы этого слайдера нет . js вырисовывает html код этого слайдера, а потом запускает этот код на поиск слайдеров на странице. В общем это не важно.
У этого слайдера есть недостаток. Он плохо тянется.
Вставил его на страничку и попробовал все размеры сделать В% через css стили тут
хотел чтобы картинка была максимум по высоте окна, а ширина подгонялась, но не была шире экрана. Это работает, если ширину экрана не менять. Но если перевернуть телефон на бок, то весь слайдер сдвигается.
это связано с тем, что все размеры (таскания и ширины экрана) в пикселях а не в %.
как вот тут
items.style.left = (posInitial - slideSize) + "px";
как posInitial сделать в %? если slideSize всегда равен 100% ? а не slideSize = items.getElementsByClassName('slide')[0].offsetWidth,
|
|
15.12.2019, 10:23
|
|
Профессор
|
|
Регистрация: 15.10.2014
Сообщений: 255
|
|
И второй недостаток, что палец на картинке работает только вправо и влево. А нужно чтобы, если пальцем вверх или вниз, был скрол страницы. так себе слайдер....
|
|
15.12.2019, 19:54
|
|
Профессор
|
|
Регистрация: 15.10.2014
Сообщений: 255
|
|
забил на этот слайдер взял другой
вроде нормальный, единственный минус - на нем не срабатывает тач двумя пальцами. То есть в любом другом месте можно увеличение сделать пальцами, а на самой картинке нет. буду думать
|
|
|
|