Помогите модифицировать скрипт слайд-шоу
Доброго времени суток!
Есть скрипт слайд-шоу, который берет изображения из папки, в нем все работает отлично, помогите сделать так чтобы по умолчанию открывалось последнее изображение, а не первое. И если можно было бы сделать переключение слайдов в обратном порядке и нормальном было бы вообще здорово) Заранее всем благодарочка! сам скрипт: (css выкладывать не буду, если нет необходимости) index.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>History playback</title>
<link rel="stylesheet" href="base.css">
</head>
<body>
<?php
if(!isset($_GET['dir'])){
echo '<ul>';
$dir = './';
$files = array_filter(scandir($dir),"is_dir");
foreach($files as $f) {
if (!preg_match("/^\./",$f)) {
$childfiles = scandir($f);
$count = 0;
foreach($childfiles as $c) {
if (preg_match("/image|video/",mime_content_type($f.'/'.$c))){
$count++;
};
}
echo '<li><a href="index.php?dir='.$f.'">'.$f.' ['.$count.']</li>';
}
}
echo '</ul>';
} else {
if (preg_match('/^\.|\/+|~/',$_GET['dir'])){
die('only direct child folders');
}
$all = array();
$dir = './'.$_GET['dir'];
if (!is_dir($dir)) {
die('Cannot find the folder, sorry');
}
$files = scandir($dir);
foreach($files as $f) {
if (preg_match("/image|video/",mime_content_type($dir.'/'.$f))){
array_push($all,$f);
}
}
?>
<div id="slideshow-container"></div>
<script>
let slideshow = {
container: '#slideshow-container',
media: <?php echo json_encode($all);?>,
folder: '<?php echo urlencode(str_replace('index.php?','',$_GET['dir']))?>/',
autoplay: 'no',
endless: 'no',
last: 'yes'
}
</script>
<script src="slideshow.js"></script>
<?php } ?>
</body>
</html>
slideshow.js
if (typeof slideshow === 'object') {
let styles = document.createElement('link');
styles.rel="stylesheet";
styles.href="slideshow.css";
document.head.appendChild(styles);
document.querySelector(slideshow.container).innerHTML = `
<div class="slideshow-info"></div>
<div class="slideshow-docs">Arrow keys go back/forward.
<span>space to toggle autoplay</span></div>
<button id="slideshow-next">▶</button>
<button id="slideshow-prev">◀</button>
<button id="slideshow-autoplay"></button>
<div class="slideshow-wrapper">
</div>
`;
const out = document.querySelector('.slideshow-info');
const wrapper = document.querySelector('.slideshow-wrapper');
const next = document.querySelector('#slideshow-next');
const prev = document.querySelector('#slideshow-prev');
const autoplay = document.querySelector('#slideshow-autoplay');
let hash = 'counter' + slideshow.folder;
let counter = localStorage.getItem(hash)||0;
let autoincrease = slideshow.autoplay === 'no' ? false : true;
let restart = slideshow.endless === 'no' ? false : true;
let first = false;
let last = false;
let timeout = false;
let speed = slideshow.speed || 3000;
let all = slideshow.media.length
function validatecounter() {
autoplay.innerText = autoincrease ? "▶️" : '⏸';
if (restart) {
if (counter < 0) counter = all - 1;
counter = counter % all;
} else {
if (counter <= 0) {
counter = 0;
}
if (counter === all) counter = all - 1;
}
if (!restart) {
first = counter === 0;
last = counter === all - 1;
if (counter === 0) {
prev.classList.add('hidden');
} else {
prev.classList.remove('hidden');
}
if (counter === all - 1) {
next.classList.add('hidden');
autoplay.classList.add('hidden');
} else {
next.classList.remove('hidden');
autoplay.classList.remove('hidden');
}
}
localStorage.setItem(hash,counter);
show();
}
function show() {
clearTimeout(timeout);
out.innerText = `${slideshow.media[counter]} ${counter+1}/${all}`;
wrapper.innerText = '';
wrapper.dataset.loaded = 'false';
if(slideshow.media[counter].endsWith('.mp4')) {
wrapper.style.backgroundImage = ``;
let vid = document.createElement('video');
vid.setAttribute('loop','true');
vid.setAttribute('autoplay','true');
vid.setAttribute('src', slideshow.folder + slideshow.media[counter]);
if (wrapper.dataset.loaded === 'false') {
vid.addEventListener('canplaythrough', ev => {
wrapper.appendChild(vid);
loaded();
},{passive:true, once:true});
}
} else {
wrapper.innerText = ' ';
let url = slideshow.folder + slideshow.media[counter];
let i = new Image();
i.src = url;
i.onload = function() {
wrapper.style.backgroundImage = `url(${url})`;
loaded();
}
i.onerror = function() {
wrapper.innerText = 'Error loading image ' + url;
loaded();
}
}
}
function loaded() {
wrapper.dataset.loaded = 'true';
if (autoincrease && !last) {
timeout = window.setTimeout(function(){
counter++;
validatecounter();
},speed);
}
}
function nextslide() {
if(!last) {
counter++;
autoincrease = false;
validatecounter();
}
};
function prevslide() {
if(!first) {
counter--;
autoincrease = false;
validatecounter();
}
};
function toggleauto() {
autoincrease = !autoincrease;
validatecounter();
};
next.addEventListener('click', nextslide);
prev.addEventListener('click', prevslide);
autoplay.addEventListener('click',toggleauto);
document.addEventListener('keyup', ev => {
ev.preventDefault();
if (ev.key === "ArrowRight") { nextslide(); }
if (ev.key === "ArrowUp") { history.back(); }
if (ev.key === "ArrowLeft") { prevslide(); }
if (ev.key === " ") { toggleauto(); }
});
validatecounter();
} else {
console.error('Please define a slideshow object first');
document.body.innerText = "⚠️ Can't find slideshow object"
}
|
slideshow.media - это ведь массив?
У массивов есть метод reverse (arr.reverse()), который переставляет элементы массива в обратном порядке. Можно его использовать. |
Цитата:
массив, а где использовать метод реверс? в функции показа? function show() { clearTimeout(timeout); out.innerText = `${slideshow.media[counter]} ${counter+1}/${all}`; или делать отдельную функцию? |
Если нужно просто начинать с последнего и идти к первому, то в стр 22
let counter = localStorage.getItem(hash)||0; надо устанавливать на последний let counter = localStorage.getItem(hash)||slideshow.media.length-1; Ввести переменную direction = 1 если надо идти от начала к концу или -1 если от последнего к первому и в стр 99 counter += direction; Ну и менять direction, когда надо сменить направление при автоплее. Это идеи Писать за вас трудно, не имея возможности отлаживать. |
Цитата:
Сделал так, но все равно показывает с первого кадра, а не с последнего, хотя если промотать кадры вперед и включить автоплэй то листает назад, если бы получилось начинать с последнего мне бы этого хватило. В скрипте еще есть некая история, т.е. он запоминает тот кадр который смотрел последним, мне бы убрать эту функцию вообще, т.к. картинки меняются. Если что скрипт брал с гитхаба https://github.com/codepo8/slide-show |
Цитата:
let counter = slideshow.media.length-1; Убрать (закоментарить) строку 59 // localStorage.setItem(hash,counter); |
Цитата:
Все работает, но на первом кадре (теперь уже последнем) нету кнопки автоплэй, хотя по пробелу он запускается, а также на первом кадре нет самой кнопки вправо, хотя опять же по стрелке на клавиатуре работает, как я понимаю скрипт думает что это последние кадры и просто не выводит эти кнопки |
Цитата:
строки 45-56
/* if (counter === 0) {
prev.classList.add('hidden');
} else {
prev.classList.remove('hidden');
}
if (counter === all - 1) {
next.classList.add('hidden');
autoplay.classList.add('hidden');
} else {
next.classList.remove('hidden');
autoplay.classList.remove('hidden');
}*/
То все кнопки будут всегда |
Цитата:
|
Всем доброго времени суток!
А еще поможете? Нужно чтобы этот скрипт сканировал только определенную папку с изображениями и запускал слайд-шоу |
| Часовой пояс GMT +3, время: 05:43. |