Наложение сетки прозрачных изображений на сетку фоновых изображений

У меня есть код, который отображает две сетки изображений (изображения представляют собой небольшие части более крупного изображения). В настоящее время сетки отображаются вверху и внизу страницы — я хочу их наложить. Вторые изображения сетки («передний слой») частично прозрачны.

const backlayer = document.querySelector('.backlayer');
const numberOfItems = 16;
for (let row = 0; row < 4; row++) {
  for (let col = 0; col < 4; col++) {
    let cell = document.createElement('div');
    cell.classList.add('cell');
    backlayer.appendChild(cell);
  }
}

const cells = backlayer.querySelectorAll('.cell');
for (let i = 0; i < numberOfItems; i++) {
  var xpos = i % 4;
  var ypos = (i - xpos) / 4;
  var myurl = "url(https://picsum.photos/id/1015/200/200?" + ("X" + xpos) + "/" + ("Y" + ypos) + ")";
  cells[i].style.setProperty('--bg', myurl);
}

// below section for top transparent layer

const frontlayer = document.querySelector('.frontlayer');
const numberOfItems2 = 4;
for (let row = 0; row < 2; row++) {
  for (let col = 0; col < 2; col++) {
    let cell = document.createElement('div');
    cell.classList.add('cell');
    frontlayer.appendChild(cell);
  }
}

const cells2 = frontlayer.querySelectorAll('.cell');
for (let i = 0; i < numberOfItems2; i++) {
  xpos = i % 2;
  ypos = (i - xpos) / 2;
  var myurl2 = "url(https://picsum.photos/id/1016/200/200?" + ("X" + xpos) + "/" + ("Y" + ypos) + ")";
  cells2[i].style.setProperty('--bg', myurl2);
}
.backlayer {
  width: 100vmin;
  height: 100vmin;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: repeat(4, 1fr);
  gap: 1vmin;
}

.backlayer>* {
  border: 0 solid;
  background-image: var(--bg);
  background-size: cover;
  background-position center center;
}

.frontlayer {
  width: 100vmin;
  height: 100vmin;
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  grid-template-rows: repeat(2, 1fr);
  gap: 1vmin;
  position: absolute
}

.frontlayer>* {
  border: 1vmin solid;
  background-image: var(--bg);
  background-size: cover;
  background-position center center;
}
<div class = "backlayer"></div>
<div class = "frontlayer"></div>

Возможно, это не лучший HTML, поэтому я прошу прощения за это, но он работает, просто не получается расположить две сетки друг над другом. Здесь есть множество примеров того, как это сделать с отдельными статическими изображениями, но ничего, что касается аспекта сетки, и я просто не могу понять, как изменить существующие примеры для работы с моей ситуацией.

ТИА, Пит

оффтоп, 1v0min повсюду опечатки

Roko C. Buljan 15.06.2024 13:11
stackoverflow.com/questions/9724035/…
Paulie_D 15.06.2024 13:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Чтобы сетки накладывались друг на друга, вам просто нужен один элемент div, включающий обе сетки, вы делаете их как абсолютными, так и относительными для родительского элемента div, например:

.parentDiv{
  position:relative;
}
.backlayer {
  position: absolute;
  width: 100vmin;      
  height: 100vmin;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: repeat(4, 1fr);
  gap: 1vmin;
}    
.frontlayer {
  position: absolute;
  z-index: 1;
  width: 100vmin;
  height: 100vmin;
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  grid-template-rows: repeat(2, 1fr);
  gap: 1vmin; 
}

Сетка, которую вы хотите видеть впереди, получит z-index:1;

HTML должен выглядеть так:

<div class = "parentDiv">
  <div class = "backlayer"></div>
  <div class = "frontlayer"></div>
</div>

Решение CSS всегда превосходит решение JavaScript.

lharby 15.06.2024 17:59

Вы можете складывать разные слои с сетками, используя Подсетку, чтобы дочерние слои могли наследовать сетки. Это означает: определите сетку один раз, поделитесь ею с несколькими дочерними элементами.

В вашем случае вы бы обернули backlayer и frontlayer родителем, где определена сетка, и чтобы оба слоя наследовали сетку. Затем, в зависимости от того, на каком слое находятся ячейки, вы можете соответствующим образом распределить их.

const backlayer = document.querySelector('.backlayer');
const numberOfItems = 16;
for (let row = 0; row < 4; row++) {
  for (let col = 0; col < 4; col++) {
    let cell = document.createElement('div');
    cell.classList.add('cell');
    backlayer.appendChild(cell);
  }
}

const cells = backlayer.querySelectorAll('.cell');
for (let i = 0; i < numberOfItems; i++) {
  var xpos = i % 4;
  var ypos = (i - xpos) / 4;
  var myurl = "url(https://picsum.photos/id/1015/200/200?" + ("X" + xpos) + "/" + ("Y" + ypos) + ")";
  cells[i].style.setProperty('--bg', myurl);
}

// below section for top transparent layer

const frontlayer = document.querySelector('.frontlayer');
const numberOfItems2 = 4;
for (let row = 0; row < 2; row++) {
  for (let col = 0; col < 2; col++) {
    let cell = document.createElement('div');
    cell.classList.add('cell');
    frontlayer.appendChild(cell);
  }
}

const cells2 = frontlayer.querySelectorAll('.cell');
for (let i = 0; i < numberOfItems2; i++) {
  xpos = i % 2;
  ypos = (i - xpos) / 2;
  var myurl2 = "url(https://picsum.photos/id/1016/200/200?" + ("X" + xpos) + "/" + ("Y" + ypos) + ")";
  cells2[i].style.setProperty('--bg', myurl2);
}
.container {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: repeat(4, 1fr);
  gap: 2vmin;
  width: 100vmin;
  height: 100vmin;
}

.layer {
  display: grid;
  grid-template-rows: subgrid;
  grid-template-columns: subgrid;
  grid-area: 1 / 1 / 5 / 5;
}

.backlayer .cell {
  grid-area: span 1 / span 1;
}

.frontlayer .cell {
  grid-area: span 2 / span 2;
}

.cell {
  grid-area: span 1 / span 1;
  border: 0 solid;
  background-image: var(--bg);
  background-size: cover;
  background-position center center;
  opacity: 0.5;
}
<div class = "container">
  <div class = "layer backlayer"></div>
  <div class = "layer frontlayer"></div>
</div>

Другие вопросы по теме