09.08.2019, 13:31
|
Новичок на форуме
|
|
Регистрация: 09.08.2019
Сообщений: 5
|
|
Доработка логики в готовом коде "Галереи"
Привет всем!
Я только начинаю работать с JS, хотел попросить совета по доработке логики и улучшению кода в целом.
Коротко:
Есть скрытый div с областями кнопок (закрытие, след. и пред. изображение), пустыми картинкой и описанием.
При нажатии на любую картинку галереи - div отображается и туда вставляются: url изображения, текстовое описание.
При нажатие на кнопки след. и пред. изображения - меняется url картинки и описание.
Собственно, всё. Несколько вопросов:
1. Правильно ли я объявил переменные в начале и нужно ли их вообще объявлять? Если нет, то почему и как сделать лучше?
2. В методах nextImg и previousImg код практически одинаковый, но не знаю, как его грамотно объединить, чтобы всё работало. Можно ли это сделать и как? Или в какую сторону двигаться, чтобы решить эту задачу?
3. Можно ли как-то упростить или улучшить код? Скорее всего, я не знаю каких-то вещей, которые надо изучить, чтобы сделать код проще и компактнее. Какие именно материалы изучить?
Спасибо за внимание,
Вадим
(function() {
////// Переменные для работы //////
var HIDDEN_CLASS = "hidden";
var OVERFLOW_BLOCK = "overflow-block";
var MODAL = document.body.querySelector(".modal");
var MODAL_IMAGE = MODAL.querySelector("img");
var MODAL_CAPTION = MODAL.querySelector("p");
var MODAL_BUTTON_CLOSE = MODAL.querySelector(".modal-close");
var MODAL_BUTTON_BACK = MODAL.querySelector(".modal-previous");
var GALLERY = document.body.querySelector(".photos")
.getElementsByTagName("img");
////// Объект для работы с функциями //////
var actionImgModal = {
////// Открытие окна
openImg(modalWindow, modalImg, modalCaption, imagesArray) {
for (var i = 0;i<imagesArray.length; i++) {
imagesArray[i].onclick = function () {
document.body.classList.add(OVERFLOW_BLOCK);
modalWindow.classList.remove(HIDDEN_CLASS);
modalImg.src = this.src;
modalCaption.innerHTML = this.alt;
};
}
},
////// Закрытие окна
closeImg(modalWindow) {
document.body.classList.remove(OVERFLOW_BLOCK);
modalWindow.classList.add(HIDDEN_CLASS);
},
////// Следующее изображение
nextImg(modalImg, modalCaption, imagesArray) {
for (var i = 0;i<imagesArray.length; i++) {
if (modalImg.src === imagesArray[imagesArray.length-1].src) {
modalImg.src = imagesArray[0].src;
modalImg.alt = imagesArray[0].alt;
modalCaption.innerHTML = modalImg.alt;
break;
} else if (modalImg.src === imagesArray[i].src) {
i++;
modalImg.src = imagesArray[i].src;
modalImg.alt = imagesArray[i].alt;
modalCaption.innerHTML = modalImg.alt;
break;
}
}
},
////// Предыдущее изображение
previousImg(modalImg, modalCaption, imagesArray) {
for (var i = 0;i<imagesArray.length; i++) {
if (modalImg.src === imagesArray[0].src) {
modalImg.src = imagesArray[imagesArray.length-1].src;
modalImg.alt = imagesArray[imagesArray.length-1].alt;
modalCaption.innerHTML = modalImg.alt;
break;
} else if (modalImg.src === imagesArray[i].src) {
i--;
modalImg.src = imagesArray[i].src;
modalImg.alt = imagesArray[i].alt;
modalCaption.innerHTML = modalImg.alt;
break;
}
}
}
};
////// Запуск функций на странице //////
////// Открытие окна
actionImgModal.openImg(MODAL, MODAL_IMAGE, MODAL_CAPTION, GALLERY);
////// Закрытие окна
MODAL_BUTTON_CLOSE.onclick = function () {
actionImgModal.closeImg(MODAL);
};
////// Следующее изображение
MODAL_IMAGE.onclick = function () {
actionImgModal.nextImg(MODAL_IMAGE, MODAL_CAPTION, GALLERY);
};
////// Предыдущее изображение
MODAL_BUTTON_BACK.onclick = function () {
actionImgModal.previousImg(MODAL_IMAGE, MODAL_CAPTION, GALLERY);
};
////// Работа с изображениями клавиатурой
document.onkeydown = function (evt) {
if (evt.key == "Escape") {
actionImgModal.closeImg(MODAL);
} else if (evt.key == "ArrowRight") {
actionImgModal.nextImg(MODAL_IMAGE, MODAL_CAPTION, GALLERY);
} else if (evt.key == "ArrowLeft") {
actionImgModal.previousImg(MODAL_IMAGE, MODAL_CAPTION, GALLERY);
}
};
})();
|
|
09.08.2019, 13:47
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
persi005,
var GALLERY = document.querySelector(".photos img");
добавьте переменную для индекса, и в методах nextImg и previousImg меняйте только индекс, напишите функцию для показа картинки относительно индекса.
|
|
09.08.2019, 15:34
|
Новичок на форуме
|
|
Регистрация: 09.08.2019
Сообщений: 5
|
|
Спасибо за помощь.
Сообщение от рони
|
var GALLERY = document.querySelector(".photos img");
|
Это переделал, только мне нужен массив из картинок и я исправил так:
.querySelector(".photos img");
// На этот
.querySelectorAll(".photos img");
Добавил новый метод, который в зависимости от счётчика меняет картинку "вперёд" или "назад":
changeImg(modalImg, modalCaption, imagesArray, count) {
for (var i = 0;i<imagesArray.length; i++) {
if (modalImg.src === imagesArray[imagesArray.length-1].src && count === 1) {
modalImg.src = imagesArray[0].src;
modalImg.alt = imagesArray[0].alt;
modalCaption.innerHTML = modalImg.alt;
break;
} else if (modalImg.src === imagesArray[0].src && count === -1) {
modalImg.src = imagesArray[imagesArray.length-1].src;
modalImg.alt = imagesArray[imagesArray.length-1].alt;
modalCaption.innerHTML = modalImg.alt;
break;
} else if (modalImg.src === imagesArray[i].src) {
i += count;
modalImg.src = imagesArray[i].src;
modalImg.alt = imagesArray[i].alt;
modalCaption.innerHTML = modalImg.alt;
break; }
};
},
nextImg(modalImg, modalCaption, imagesArray) {
this.changeImg(modalImg, modalCaption, imagesArray, 1);
},
previousImg(modalImg, modalCaption, imagesArray) {
this.changeImg(modalImg, modalCaption, imagesArray, -1);
}
|
|
09.08.2019, 15:51
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
persi005,
for убрать бы
|
|
09.08.2019, 23:20
|
Новичок на форуме
|
|
Регистрация: 09.08.2019
Сообщений: 5
|
|
Сообщение от рони
|
for убрать бы
|
Пробовал убрать for для changeImg(), но что-то знаний не хватает. Есть варианты, как можно сделать?
|
|
09.08.2019, 23:46
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
|
|
09.08.2019, 23:53
|
Новичок на форуме
|
|
Регистрация: 09.08.2019
Сообщений: 5
|
|
Благодарю, буду пробовать
|
|
10.08.2019, 13:07
|
Новичок на форуме
|
|
Регистрация: 09.08.2019
Сообщений: 5
|
|
Если кому интересно, то подсократил код:
(function() {
var HIDDEN_CLASS = "hidden";
var OVERFLOW_BLOCK = "overflow-block";
var MODAL = document.body.querySelector(".modal");
var MODAL_IMAGE = MODAL.querySelector("img");
var MODAL_CAPTION = MODAL.querySelector("p");
var MODAL_BUTTON_CLOSE = MODAL.querySelector(".modal-close");
var MODAL_BUTTON_BACK = MODAL.querySelector(".modal-previous");
var GALLERY_ARRAY = document.body.querySelectorAll(".photos img");
var CURRENT_IMG_ID;
var actionImgModal = {
openImg(modalWindow, modalImg, modalCaption, imagesArray) {
for (var i = 0; i < imagesArray.length; i++) {
imagesArray[i].id = i;
imagesArray[i].onclick = function () {
CURRENT_IMG_ID = this.id;
modalImg.src = this.src;
modalCaption.innerHTML = this.alt;
modalWindow.classList.remove(HIDDEN_CLASS);
document.body.classList.add(OVERFLOW_BLOCK);
};
}
},
closeImg(modalWindow) {
document.body.classList.remove(OVERFLOW_BLOCK);
modalWindow.classList.add(HIDDEN_CLASS);
},
changeImg(modalImg, modalCaption, imagesArray) {
if (CURRENT_IMG_ID == imagesArray.length) { CURRENT_IMG_ID = 0;
} else if (CURRENT_IMG_ID == -1) { CURRENT_IMG_ID = imagesArray.length - 1
}
modalImg.src = imagesArray[CURRENT_IMG_ID].src;
modalImg.alt = imagesArray[CURRENT_IMG_ID].alt;
modalCaption.innerHTML = modalImg.alt;
},
nextImg(modalImg, modalCaption, imagesArray) {
CURRENT_IMG_ID++;
this.changeImg(modalImg, modalCaption, imagesArray);
},
previousImg(modalImg, modalCaption, imagesArray) {
CURRENT_IMG_ID--;
this.changeImg(modalImg, modalCaption, imagesArray);
}
};
actionImgModal.openImg(MODAL, MODAL_IMAGE, MODAL_CAPTION, GALLERY_ARRAY);
MODAL_BUTTON_CLOSE.onclick = function () {
actionImgModal.closeImg(MODAL);
};
MODAL_IMAGE.onclick = function () {
actionImgModal.nextImg(MODAL_IMAGE, MODAL_CAPTION, GALLERY_ARRAY);
};
MODAL_BUTTON_BACK.onclick = function () {
actionImgModal.previousImg(MODAL_IMAGE, MODAL_CAPTION, GALLERY_ARRAY);
};
document.onkeydown = function (evt) {
if (evt.key == "Escape") {
actionImgModal.closeImg(MODAL);
} else if (evt.key == "ArrowRight") {
actionImgModal.nextImg(MODAL_IMAGE, MODAL_CAPTION, GALLERY_ARRAY);
} else if (evt.key == "ArrowLeft") {
actionImgModal.previousImg(MODAL_IMAGE, MODAL_CAPTION, GALLERY_ARRAY);
}
};
})();
|
|
10.08.2019, 16:05
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
простейшая галерея
persi005,
для примера ...
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8" />
<style type="text/css">
.photos {
width: 600px;
padding: 25px 0 0;
margin: 0 auto;
}
.modal {
background-color: rgba(0, 0, 0, 0.8);
position: fixed;
z-index: 99999;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.big-image {
background: #fff;
width: 300px;
height: 150px;
margin: 10% auto;
border: 10px solid #ddd;
position: relative;
box-shadow: 0px 0px 20px #000;
border-radius: 15px;
}
.big-image img {
margin: 0 auto;
display: block;
width: 300px;
height: 150px;
}
.modal-previous,
.modal-nextious {
border: none;
position: absolute;
width: 40px;
height: 40px;
outline: none;
}
.modal-previous {
bottom: 20px;
left: 20px;
background: url(http://coderpro.ru/images/images/controls.png) no-repeat
0 0;
}
.modal-nextious {
bottom: 20px;
left: 250px;
background: url(http://coderpro.ru/images/images/controls.png) no-repeat -48px
0;
}
.thumbnails {
width: 605px;
display: flex;
justify-content: center;
}
.thumbnails img {
margin: 0 5px 0 0;
width: 70px;
height: 39px;
border: 2px solid transparent;
display: block;
}
.hidden {
transform: scale(0);
}
.modal-close {
background-color: rgba(0, 0, 0, 0.8);
border: 2px solid #ccc;
height: 24px;
line-height: 24px;
position: absolute;
right: -24px;
cursor: pointer;
font-weight: bold;
text-align: center;
text-decoration: none;
color: rgba(255, 255, 255, 0.9);
font-size: 14px;
text-shadow: 0 -1px rgba(0, 0, 0, 0.9);
top: -24px;
width: 24px;
border-radius: 15px;
box-shadow: 1px 1px 3px #000;
}
</style>
</head>
<body>
<div class="photos">
<div class="modal hidden">
<div class="big-image">
<button class="modal-close">X</button>
<img src="http://coderpro.ru/images/images/img11.jpg" alt="image11" />
<button class="modal-previous"></button>
<button class="modal-nextious"></button>
</div>
</div>
<div class="thumbnails">
<img src="http://coderpro.ru/images/images/img11.jpg" alt="image11" />
<img src="http://coderpro.ru/images/images/img12.jpg" alt="image12" />
<img src="http://coderpro.ru/images/images/img13.jpg" alt="image13" />
<img src="http://coderpro.ru/images/images/img14.jpg" alt="image14" />
</div>
</div>
<script>
(function() {
var HIDDEN_CLASS = 'hidden';
var OVERFLOW_BLOCK = 'overflow-block';
var MODAL = document.body.querySelector('.modal');
var MODAL_IMAGE = MODAL.querySelector('img');
var MODAL_CAPTION = MODAL.querySelector('p');
var MODAL_BUTTON_CLOSE = MODAL.querySelector('.modal-close');
var MODAL_BUTTON_BACK = MODAL.querySelector('.modal-previous');
var MODAL_BUTTON_NEXT = MODAL.querySelector('.modal-nextious');
var GALLERY_ARRAY = document.querySelectorAll('.photos .thumbnails img');
var CURRENT_IMG_INDEX = 0;
var IMG_LENGTH = GALLERY_ARRAY.length;
GALLERY_ARRAY.forEach(function(img, i) {
img.onclick = function() {
CURRENT_IMG_INDEX = i;
changeImg();
};
});
function changeImg() {
MODAL.classList.remove(HIDDEN_CLASS);
MODAL_IMAGE.src = GALLERY_ARRAY[CURRENT_IMG_INDEX].src;
}
function closeImg() {
MODAL.classList.add(HIDDEN_CLASS);
}
MODAL_BUTTON_CLOSE.onclick = closeImg;
function limitIndex(i) {
return (CURRENT_IMG_INDEX + IMG_LENGTH + i) % IMG_LENGTH;
}
MODAL_BUTTON_BACK.onclick = function() {
CURRENT_IMG_INDEX = limitIndex(-1);
changeImg();
};
MODAL_BUTTON_NEXT.onclick = function() {
CURRENT_IMG_INDEX = limitIndex(1);
changeImg();
};
})();
</script>
</body>
</html>
|
|
|
|