Я пытаюсь создать слайдер эффектов стека -
https://codepen.io/arjunmenon/pen/QVOMoO
У меня два вопроса
- при переключении слайдера на следующее изображение анимация отсутствует
- Я не уверен, как переключаюсь в списке массивов.
В выпуске 1
Я установил переход на изображениях
.stack-queue img {
backface-visibility: hidden;
transform-origin: 50% -50%;
/*transition: 0.4s cubic-bezier(0.28, 0.55, 0.385, 1.65);*/
transition: all 0.5s;
}
Это не работает. Поскольку я appendChild
к контейнеру, я добавляю тайм-аут. Это все еще не работает. Как заставить это работать?
Я хочу, чтобы он оживил свою позицию.
При выпуске 2
Массив заполняется некоторым содержимым, в данном случае URL-адресами изображений.
Создается подмассив, который добавляет первые 4 элемента из массива.
Поскольку переключение активируется каждый раз, подмассив разбивает 4 последовательных элемента, начиная с указанного индекса
if array is = [1,2,3,4,5], then sub-array
// [1,2,3,4]
// [2,3,4,5]
// [3,4,5,1]
// ..
Затем я обновляю DOM. Поскольку есть только 4 элемента, чтобы иметь дело с. Будет ли это ухудшать производительность?
Полный код JS
// INIT IMAGES
var imgs = ['https://imgur.com/4yzauu5.png', 'https://imgur.com/SI5eiJR.png', 'https://imgur.com/iIXAMhn.png', 'https://imgur.com/eT5wkES.png', 'https://imgur.com/xHmFfzq.png', 'https://imgur.com/rjssmI6.png'];
var figure = document.getElementById('figure');
for (var i = 0; i < 4; i++) {
var html = '<img src="' + imgs[i] + '" alt="img01"/>';
figure.insertAdjacentHTML('beforeend', html);
}
// TOGGLE FUNCTION
function myFunction() {
// rotate(rawcards,1);
var rawcards = Array.from(figure.children);
var newist = next(imgs);
for (var i = 0; i < newist.length; i++) {
figure.removeChild(rawcards[i]);
var img = document.createElement('img');
img.src = newist[i];
figure.appendChild(img);
setTimeout(()=> img.classList.add("animate"), i*500);
}
}
// RETURNS NEXT 4 ELEMENTS WITHIN ARRAY,
// STARTING FROM A SPECIFIED INDEX
// [1,2,3,4]
// [2,3,4,5]
// [3,4,5,6]
// ..
var i = 0;
function next(array) {
i++;
if (i >= array.length) {i = 0;}
return slice3(array, 4, i)
}
// RETURNS NEW ARRAY WITH 4 ELEMENTS
function slice3(array, chunk, offset) {
var subarray = [];
for (var i = 0; i<chunk; i++) {
var ind = (offset + i) % array.length;
subarray.push(array[ind]);
}
return subarray;
}
/* LINE 6 - GENERAL STYLING */
/* LINE 41 - STACK EFFECT */
/* GENERAL STYLING FOR DEMO */
*, *:after, *:before { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }
.clearfix:before, .clearfix:after { content: ''; display: table; }
.clearfix:after { clear: both; }
body {
background: #fff;
color: #4b5f5a;
font-size: 100%;
line-height: 1.25;
font-family: 'Lato', Arial, sans-serif;
}
.stack {
margin: 20px auto;
width: 400px;
padding: 0;
position: relative;
max-width: 100%;
}
.stack img {
max-width: 100%;
position: absolute;
top: 0;
left: 0;
-webkit-transition: all 0.3s;
transition: all 0.3s;
outline: 1px solid transparent;
}
.stack img:last-child {
position: relative;
}
/* Queue */
.stack-queue {
-webkit-transition: all 0.3s;
transition: all 0.3s;
}
.stack-queue.active {
-webkit-transform: scale(0.9);
transform: scale(0.9);
}
.stack-queue img {
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
-webkit-transform-origin: 50% -50%;
transform-origin: 50% -50%;
/*transition: 0.4s cubic-bezier(0.28, 0.55, 0.385, 1.65);*/
transition: all 3s;
}
.stack-queue.active img:first-child {
-webkit-transform: scale(.7);
transform: scale(.7);
}
.stack-queue.active img:nth-child(2) {
-webkit-transform: scale(.8);
transform: scale(.8);
}
.stack-queue.active img:nth-child(3) {
-webkit-transform: scale(.9);
transform: scale(.9);
}
img.animate{
transform: scale(1);
}
<section>
<h2>Queue</h2>
<button onclick="myFunction()">Toggle effect</button>
<figure class="stack stack-queue active" id="figure">
</figure>
</section>