У меня есть код, который отображает две сетки изображений (изображения представляют собой небольшие части более крупного изображения). В настоящее время сетки отображаются вверху и внизу страницы — я хочу их наложить. Вторые изображения сетки («передний слой») частично прозрачны.
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, поэтому я прошу прощения за это, но он работает, просто не получается расположить две сетки друг над другом. Здесь есть множество примеров того, как это сделать с отдельными статическими изображениями, но ничего, что касается аспекта сетки, и я просто не могу понять, как изменить существующие примеры для работы с моей ситуацией.
ТИА, Пит



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Чтобы сетки накладывались друг на друга, вам просто нужен один элемент 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.
Вы можете складывать разные слои с сетками, используя Подсетку, чтобы дочерние слои могли наследовать сетки. Это означает: определите сетку один раз, поделитесь ею с несколькими дочерними элементами.
В вашем случае вы бы обернули 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>
оффтоп,
1v0minповсюду опечатки