[JavaScript, ООП] Создание квадратизированной галереи проектов на JS
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Под квадратизированной галереей подразумевается галерея такого типаЦели и задачи
- Создать js-класс Img, описывающий компонент картинки галереи и принимающий следующие аргументы: тип картинки (широкая, высокая, стандартная), ссылка на изображение, ссылка на проект.
- Генерировать галерею в html.
- Реализовать механизм показа/скрытия частей галереи.
- По class.elem должен быть доступен корневой DOM элемент картинки.
Для ее создания вам понадобится базовое знание ООП в JS.
Итак, начнем.1. Создадим HTML-контейнер для галереи:
<div class="gallery">
<!--Сюда будут интерпретироваться картинки-->
</div>
2. Пропишем CSS для галереи и картинок:Стили для высокой, широкой и стандартной картинки:
.short_box {
width: 383px;
height: 337px;
background: #ffffff;
}
.high_box {
width: 383px;
height: 692px;
background: #ffffff;
}
.long_box {
width: 795px;
height: 337px;
background: #ffffff;
}
Стили для всех картинок:
border: 4px solid #BB70B3;
z-index: 10;
margin-top: 18px;
position: relative;
overflow: hidden;
cursor: pointer;
}
.gallery > div img {
z-index: -5;
width: 100%;
height: auto;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%); /* Вертикальное и горизонтальное выравнивание */
}
Стили для контейнера галереи:
.gallery {
width: 795px;
display: table;
margin: 0 auto;
}
Стили для кнопки прокрутки:
.scroll_to {
margin: 0 auto;
padding-top: 30px;
width: 100%;
cursor: pointer;
}
Дополнительные стили для адаптивности галереи:
@media screen and (max-width: 795px) {
.gallery {
width: 595px;
}
.short_box {
width: 283px;
height: 237px;
background: #ffffff;
}
.high_box {
width: 283px;
height: 490px;
background: #ffffff;
}
.long_box {
width: 595px;
height: 237px;
background: #ffffff;
}
}
@media screen and (max-width: 595px) {
.gallery {
width: 100%;
}
.gallery > div {
display: block;
margin: 0 auto;
margin-top: 18px;
float: none!important;
}
.long_box {
width: 100%;
height: 237px;
}
}
3. Пишем JS-класс для создания компонентов:Создадим класс, в котором будем создавать DOM-элемент и повесим на него событие “onclick” для перехода по нужной ссылке.
Для будущего механизма показа/скрытия частей галереи передадим аргумент groupImg, в который впоследствии будет передаваться группа с принадлежащим ей изображением. Благодаря этому мы сможем скрывать и показывать нужные нам группы изображений.
class ImgComponent {
constructor(groupImg, srcImg, srcToProject, size = 'short', float = 'left') { // передаем аргументы: группа изображений, ссылка на изображение, ссылка на проект, размер картинки по заранее созданным типам(short, long, high), значение свойства float;
this.render() //создаем корневой DOM элемент
this.elem.className = `img_gallery ${size}_box`; // присваиваем классы для картинок, и также класс описывающий его тип
this.elem.dataset.group = `${groupImg}` // Присваиваем data-атрибут
this.elem.href = `./articles/${srcToProject}` // Присваиваем ссылку на проект, на который ведет картинка
this.elem.style.float = float; // Присваиваем свойство float
this.elem.innerHTML = `
<img src="img/${srcImg}" alt="gallery_img">
` // Вкладываем внутрь элемента картинку
this.appendElem() // Добавляем элемент на страницу
this.onClick(); // Добавляем на элемент событие onclick
}
render = () => {
this.elem = document.createElement('div') //создаем метод, создающий корневой DOM элемент нашей картинки.
}
appendElem = () => { // Создаем метод, для добавления элемента на страницу
document.querySelector('.gallery').append(this.elem);
}
onClick = () => { // Создаем метод для прослушки события onclick элемента, для перехода по ссылке.
this.elem.addEventListener('click', () => {
window.open(this.elem.href);
})
Класс для генерации галереи готов, теперь можем создавать на основе него нужные нам компоненты (картинки).
Пример:
new ImgComponent(1, 'img_1.jpg', 'article1.html')
new ImgComponent(1, 'img_1.jpg', 'article1.html', 'short', 'right')
new ImgComponent(1, 'img_3.jpg', 'article1.html', 'long', 'right')
new ImgComponent(1, 'img_2.jpg', 'article1.html', 'high', 'left')
new ImgComponent(1, 'img_2.jpg', 'article1.html', 'high', 'right')
new ImgComponent(2, 'img_3.jpg', 'article1.html', 'long')
new ImgComponent(2, 'img_3.jpg', 'article1.html', 'long')
new ImgComponent(3, 'img_3.jpg', 'article1.html', 'long')
new ImgComponent(3, 'img_3.jpg', 'article1.html', 'long')
4. Создаем механизм показа/скрытия частей галереиДля начала создадим глобальную переменную, в которой будет храниться прогресс показа галереи:
let groupNum = 1;
Далее создадим объект, на основе которого будет создаваться элемент нашей кнопки, и все необходимые методы.
let scroll_svg = {
elem: document.createElement('img'), // Создаем корневой DOM элемент кнопки
hiddenImg() { // Создаем метод скрытия для первоначального всех изображений
let array = document.querySelectorAll('.img_gallery'); // Выделяем все изображения внутри галлереи
let arrayShow = document.querySelectorAll(`.img_gallery[data-group="${groupNum}"]`); // выделяем первую группу изображений по атрибута data-group для показа
for(let i = 0; i < array.length; i++) { // Скрываем все изображения
array[i].style.display = 'none'
}
for(let i = 0; i < arrayShow.length; i++) { // Показ первой группы изображений
arrayShow[i].style.display = '';
if(i === arrayShow.length - 1) { // Вставка элементов после первой группе изображений
arrayShow[i].insertAdjacentElement('afterEnd', this.elem);
}
}
},
showImg() { // Создаем метод показа следующей группы изображений
let array = document.querySelectorAll('.img_gallery'); // Выделяем все изображения внутри галлереи
let arrayShow = document.querySelectorAll(`.img_gallery[data-group="${groupNum}"]`); // выделяем следующую группу изображений по атрибута data-group для показа
for(let i = 0; i < arrayShow.length; i++) { // Перебор массива изображений которые нужно показать
arrayShow[i].style.display = ''; // показываем все изображения из нашего массива
if(arrayShow[i] !== array[array.length - 1]) { // Проверка - на то является ли группа картинок последней
arrayShow[i].insertAdjacentElement('afterEnd', this.elem); // Если нет, то вставляем кнопку после следующей группы картинок
} else {
this.elem.style.display = 'none'; // Если условие не проходит, скрываем кнопку со страницы
}
}
},
render() {
this.elem.src = './img/scroll.svg'; // Прописываем путь до кнопки показа
this.elem.className = 'scroll_to'; // Присваивает класс, для последующего приминения CSS стилей
this.hiddenImg(); // Скрытие всех изображений на странице, кроме первой группы
this.elem.addEventListener('click', () => { // Вешаем событие на кнопку - показ группы изображений и увелечение переменной хранящей в себе прогресс показа изображений
groupNum++;
this.showImg();
})
}
}
И завершающий штрих! Вызовем метод render() для активации механизма.
scroll_svg.render()
Уверен, что я не первопроходец в создании галерей на JS, но, надеюсь, что мое решение задачи окажется для кого-то полезным.Полный JS код
let groupNum = 1;
class ImgComponent {
constructor(groupImg, srcImg, srcToProject, size = 'short', float = 'left') {
this.render();
this.elem.className = `img_gallery ${size}_box`;
this.elem.dataset.group = `${groupImg}`
this.elem.href = `./articles/${srcToProject}`
this.elem.style.float = float;
this.elem.innerHTML = `
<img src="img/${srcImg}" alt="gallery_img">
`
this.appendElem();
this.onClick();
}
render = () => {
this.elem = document.createElement('div');
}
appendElem = () => {
document.querySelector('.gallery').append(this.elem);
}
onClick = () => {
this.elem.addEventListener('click', () => {
window.open(this.elem.href);
})
}
}
new ImgComponent(1, 'img_1.jpg', 'article1.html')
new ImgComponent(1, 'img_1.jpg', 'article1.html', 'short', 'right')
new ImgComponent(1, 'img_3.jpg', 'article1.html', 'long', 'right')
new ImgComponent(1, 'img_2.jpg', 'article1.html', 'high', 'left')
new ImgComponent(1, 'img_2.jpg', 'article1.html', 'high', 'right')
new ImgComponent(2, 'img_3.jpg', 'article1.html', 'long')
new ImgComponent(2, 'img_3.jpg', 'article1.html', 'long')
new ImgComponent(3, 'img_3.jpg', 'article1.html', 'long')
new ImgComponent(3, 'img_3.jpg', 'article1.html', 'long')
let scroll_svg = {
elem: document.createElement('img'),
hiddenImg() {
let array = document.querySelectorAll('.img_gallery');
let arrayShow = document.querySelectorAll(`.img_gallery[data-group="${groupNum}"]`);
for(let i = 0; i < array.length; i++) {
array[i].style.display = 'none'
}
for(let i = 0; i < arrayShow.length; i++) {
arrayShow[i].style.display = '';
if(i === arrayShow.length - 1) {
arrayShow[i].insertAdjacentElement('afterEnd', this.elem);
}
}
},
showImg() {
let array = document.querySelectorAll('.img_gallery');
let arrayShow = document.querySelectorAll(`.img_gallery[data-group="${groupNum}"]`);
for(let i = 0; i < arrayShow.length; i++) {
arrayShow[i].style.display = '';
if(arrayShow[i] !== array[array.length - 1]) {
arrayShow[i].insertAdjacentElement('afterEnd', this.elem);
} else {
this.elem.style.display = 'none';
}
}
},
render() {
this.elem.src = './img/scroll.svg';
this.elem.className = 'scroll_to';
this.hiddenImg();
this.elem.addEventListener('click', () => {
groupNum++;
this.showImg();
})
}
}
scroll_svg.render()
===========
Источник:
habr.com
===========
Похожие новости:
- [Программирование, Разработка игр, Управление персоналом, Социальные сети и сообщества] LuxCity — стратегия для разработчиков, где код решает все
- [JavaScript, VueJS] Nuxt.js app от UI-кита до деплоя
- [VueJS] Типизация Vuex 4 на Typescript для Vue 3
- [Разработка веб-сайтов, JavaScript, Google Chrome, Тестирование веб-сервисов] Внедрение E2E-тестирования с Puppeteer и Jest
- [JavaScript, Системы сборки] Анонс Vite 2.0 (перевод)
- [Разработка веб-сайтов, JavaScript, Работа с 3D-графикой, Canvas, IT-компании] Шейдеры, Three.js и киберпанк. Как мы делали лендинг в неоново-античной стилистике
- [Интерфейсы, Конференции, IT-компании] Я ❤︎ Фронтенд 2021: доклады, воркшопы, CTF
- [JavaScript, Учебный процесс в IT, Управление персоналом, Карьера в IT-индустрии] Как проходит собеседование Junior фронтенд-разработчика
- [Разработка веб-сайтов, JavaScript, Программирование, ReactJS] 5 подходов к стилизации React-компонентов на примере одного приложения
- [JavaScript, Программирование, Учебный процесс в IT] Мои рассуждения на тему Как учиться программировать на JavaScript
Теги для поиска: #_javascript, #_oop (ООП), #_js, #_gallery, #_oop_js (ооп js), #_oop (ооп), #_javascript, #_oop (
ООП
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 10:16
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Под квадратизированной галереей подразумевается галерея такого типаЦели и задачи
Итак, начнем.1. Создадим HTML-контейнер для галереи: <div class="gallery">
<!--Сюда будут интерпретироваться картинки--> </div> .short_box {
width: 383px; height: 337px; background: #ffffff; } .high_box { width: 383px; height: 692px; background: #ffffff; } .long_box { width: 795px; height: 337px; background: #ffffff; } border: 4px solid #BB70B3;
z-index: 10; margin-top: 18px; position: relative; overflow: hidden; cursor: pointer; } .gallery > div img { z-index: -5; width: 100%; height: auto; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); /* Вертикальное и горизонтальное выравнивание */ } .gallery {
width: 795px; display: table; margin: 0 auto; } .scroll_to {
margin: 0 auto; padding-top: 30px; width: 100%; cursor: pointer; } @media screen and (max-width: 795px) {
.gallery { width: 595px; } .short_box { width: 283px; height: 237px; background: #ffffff; } .high_box { width: 283px; height: 490px; background: #ffffff; } .long_box { width: 595px; height: 237px; background: #ffffff; } } @media screen and (max-width: 595px) { .gallery { width: 100%; } .gallery > div { display: block; margin: 0 auto; margin-top: 18px; float: none!important; } .long_box { width: 100%; height: 237px; } } Для будущего механизма показа/скрытия частей галереи передадим аргумент groupImg, в который впоследствии будет передаваться группа с принадлежащим ей изображением. Благодаря этому мы сможем скрывать и показывать нужные нам группы изображений. class ImgComponent {
constructor(groupImg, srcImg, srcToProject, size = 'short', float = 'left') { // передаем аргументы: группа изображений, ссылка на изображение, ссылка на проект, размер картинки по заранее созданным типам(short, long, high), значение свойства float; this.render() //создаем корневой DOM элемент this.elem.className = `img_gallery ${size}_box`; // присваиваем классы для картинок, и также класс описывающий его тип this.elem.dataset.group = `${groupImg}` // Присваиваем data-атрибут this.elem.href = `./articles/${srcToProject}` // Присваиваем ссылку на проект, на который ведет картинка this.elem.style.float = float; // Присваиваем свойство float this.elem.innerHTML = ` <img src="img/${srcImg}" alt="gallery_img"> ` // Вкладываем внутрь элемента картинку this.appendElem() // Добавляем элемент на страницу this.onClick(); // Добавляем на элемент событие onclick } render = () => { this.elem = document.createElement('div') //создаем метод, создающий корневой DOM элемент нашей картинки. } appendElem = () => { // Создаем метод, для добавления элемента на страницу document.querySelector('.gallery').append(this.elem); } onClick = () => { // Создаем метод для прослушки события onclick элемента, для перехода по ссылке. this.elem.addEventListener('click', () => { window.open(this.elem.href); }) Пример: new ImgComponent(1, 'img_1.jpg', 'article1.html')
new ImgComponent(1, 'img_1.jpg', 'article1.html', 'short', 'right') new ImgComponent(1, 'img_3.jpg', 'article1.html', 'long', 'right') new ImgComponent(1, 'img_2.jpg', 'article1.html', 'high', 'left') new ImgComponent(1, 'img_2.jpg', 'article1.html', 'high', 'right') new ImgComponent(2, 'img_3.jpg', 'article1.html', 'long') new ImgComponent(2, 'img_3.jpg', 'article1.html', 'long') new ImgComponent(3, 'img_3.jpg', 'article1.html', 'long') new ImgComponent(3, 'img_3.jpg', 'article1.html', 'long') let groupNum = 1;
let scroll_svg = {
elem: document.createElement('img'), // Создаем корневой DOM элемент кнопки hiddenImg() { // Создаем метод скрытия для первоначального всех изображений let array = document.querySelectorAll('.img_gallery'); // Выделяем все изображения внутри галлереи let arrayShow = document.querySelectorAll(`.img_gallery[data-group="${groupNum}"]`); // выделяем первую группу изображений по атрибута data-group для показа for(let i = 0; i < array.length; i++) { // Скрываем все изображения array[i].style.display = 'none' } for(let i = 0; i < arrayShow.length; i++) { // Показ первой группы изображений arrayShow[i].style.display = ''; if(i === arrayShow.length - 1) { // Вставка элементов после первой группе изображений arrayShow[i].insertAdjacentElement('afterEnd', this.elem); } } }, showImg() { // Создаем метод показа следующей группы изображений let array = document.querySelectorAll('.img_gallery'); // Выделяем все изображения внутри галлереи let arrayShow = document.querySelectorAll(`.img_gallery[data-group="${groupNum}"]`); // выделяем следующую группу изображений по атрибута data-group для показа for(let i = 0; i < arrayShow.length; i++) { // Перебор массива изображений которые нужно показать arrayShow[i].style.display = ''; // показываем все изображения из нашего массива if(arrayShow[i] !== array[array.length - 1]) { // Проверка - на то является ли группа картинок последней arrayShow[i].insertAdjacentElement('afterEnd', this.elem); // Если нет, то вставляем кнопку после следующей группы картинок } else { this.elem.style.display = 'none'; // Если условие не проходит, скрываем кнопку со страницы } } }, render() { this.elem.src = './img/scroll.svg'; // Прописываем путь до кнопки показа this.elem.className = 'scroll_to'; // Присваивает класс, для последующего приминения CSS стилей this.hiddenImg(); // Скрытие всех изображений на странице, кроме первой группы this.elem.addEventListener('click', () => { // Вешаем событие на кнопку - показ группы изображений и увелечение переменной хранящей в себе прогресс показа изображений groupNum++; this.showImg(); }) } } scroll_svg.render()
let groupNum = 1;
class ImgComponent { constructor(groupImg, srcImg, srcToProject, size = 'short', float = 'left') { this.render(); this.elem.className = `img_gallery ${size}_box`; this.elem.dataset.group = `${groupImg}` this.elem.href = `./articles/${srcToProject}` this.elem.style.float = float; this.elem.innerHTML = ` <img src="img/${srcImg}" alt="gallery_img"> ` this.appendElem(); this.onClick(); } render = () => { this.elem = document.createElement('div'); } appendElem = () => { document.querySelector('.gallery').append(this.elem); } onClick = () => { this.elem.addEventListener('click', () => { window.open(this.elem.href); }) } } new ImgComponent(1, 'img_1.jpg', 'article1.html') new ImgComponent(1, 'img_1.jpg', 'article1.html', 'short', 'right') new ImgComponent(1, 'img_3.jpg', 'article1.html', 'long', 'right') new ImgComponent(1, 'img_2.jpg', 'article1.html', 'high', 'left') new ImgComponent(1, 'img_2.jpg', 'article1.html', 'high', 'right') new ImgComponent(2, 'img_3.jpg', 'article1.html', 'long') new ImgComponent(2, 'img_3.jpg', 'article1.html', 'long') new ImgComponent(3, 'img_3.jpg', 'article1.html', 'long') new ImgComponent(3, 'img_3.jpg', 'article1.html', 'long') let scroll_svg = { elem: document.createElement('img'), hiddenImg() { let array = document.querySelectorAll('.img_gallery'); let arrayShow = document.querySelectorAll(`.img_gallery[data-group="${groupNum}"]`); for(let i = 0; i < array.length; i++) { array[i].style.display = 'none' } for(let i = 0; i < arrayShow.length; i++) { arrayShow[i].style.display = ''; if(i === arrayShow.length - 1) { arrayShow[i].insertAdjacentElement('afterEnd', this.elem); } } }, showImg() { let array = document.querySelectorAll('.img_gallery'); let arrayShow = document.querySelectorAll(`.img_gallery[data-group="${groupNum}"]`); for(let i = 0; i < arrayShow.length; i++) { arrayShow[i].style.display = ''; if(arrayShow[i] !== array[array.length - 1]) { arrayShow[i].insertAdjacentElement('afterEnd', this.elem); } else { this.elem.style.display = 'none'; } } }, render() { this.elem.src = './img/scroll.svg'; this.elem.className = 'scroll_to'; this.hiddenImg(); this.elem.addEventListener('click', () => { groupNum++; this.showImg(); }) } } scroll_svg.render() =========== Источник: habr.com =========== Похожие новости:
ООП ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 10:16
Часовой пояс: UTC + 5