如何检查密集自动流中网格项的实际网格区域

How can I examine the actual grid area of my grid items in dense auto-flow

假设我有一个 CSS 网格,其中包含未知数量的项目以及未知的行和列跨度,自动密集地流入网格,如下所示:

.grid {
  display: grid;
  grid-template-columns: repeat(4, 30px);
  grid-template-rows: repeat(10, 30px);
  grid-auto-flow: row dense;
}
.item {
  color: white;
  text-align: center;
}
.a {
  background-color: red;
}
.b {
  background-color: blue;
  grid-column-end: span 2;
}
.c {
  background-color: green;
  grid-row-end: span 2;
}
.d {
  background-color: brown;
}
<div class="grid">
  <div class="item a">1</div>
  <div class="item b">2</div>
  <div class="item d">3</div>
  <div class="item c">4</div>
  <div class="item a">5</div>
  <div class="item a">6</div>
  <div class="item a">7</div>
  <div class="item a">8</div>
  <div class="item c">9</div>
  <div class="item b">10</div>
  <div class="item a">11</div>
  <div class="item a">12</div>
  <div class="item a">13</div>
  <div class="item a">14</div>
  <div class="item a">15</div>
</div>

我怎样才能找到,例如在 Javascript 中,各个项目实际放置在哪些网格区域?

我会尝试使用每个单独项目的偏移值来解决这个问题。由于它们的大小都相同,我们可以计算出它们各自的实际位置。

思路演示请看我的例子(添加JS代码并设置body margin为0)。单击您喜欢的任何项目并检查控制台的结果。

let items = document.getElementsByClassName("item");
for(let i = 0; i < items.length; i++) {
  items[i].addEventListener("click", function() {
    getGridPos(items[i]);
  });
}

function getGridPos(elem) {
  let offsetTop    = elem.offsetTop;
  let offsetLeft   = elem.offsetLeft;
  let offsetWidth  = elem.offsetWidth;
  let offsetHeight = elem.offsetHeight;
  let column_start = (offsetLeft / 30) + 1;
  let column_end   = column_start + offsetWidth / 30;
  let row_start    = (offsetTop / 30) + 1;
  let row_end      = row_start + offsetHeight / 30;
  
  console.log("grid-row: " + row_start + "/" + row_end + ", " +
              "grid-column: " + column_start + "/" + column_end);
}
body {
  margin: 0;
}
.grid {
  display: grid;
  grid-template-columns: repeat(4, 30px);
  grid-template-rows: repeat(10, 30px);
  grid-auto-flow: row dense;
}
.item {
  color: white;
  text-align: center;
}
.a {
  background-color: red;
}
.b {
  background-color: blue;
  grid-column-end: span 2;
}
.c {
  background-color: green;
  grid-row-end: span 2;
}
.d {
  background-color: brown;
}
<div class="grid">
  <div class="item a">1</div>
  <div class="item b">2</div>
  <div class="item d">3</div>
  <div class="item c">4</div>
  <div class="item a">5</div>
  <div class="item a">6</div>
  <div class="item a">7</div>
  <div class="item a">8</div>
  <div class="item c">9</div>
  <div class="item b">10</div>
  <div class="item a">11</div>
  <div class="item a">12</div>
  <div class="item a">13</div>
  <div class="item a">14</div>
  <div class="item a">15</div>
</div>