如何检查密集自动流中网格项的实际网格区域
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>
假设我有一个 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>