考虑一个CSS网格,其中行可以有可变高度:
.grid {
display: grid;
grid-template-columns: repeat(8, 1fr);
grid-column-gap: 16px;
grid-row-gap: 8px;
}
.first {
grid-column: 1 / 3;
background-color: #ccc;
}
.second {
grid-column: 5 / 6;
grid-row: 2 / 5;
background-color: #ccc;
height: 120px;
}<div class="grid">
<div class="first">First</div>
<div class="second">Second</div>
</div>
当在DevTools中的网格元素上悬停时,Chrome将网格可视化如下:

如何使用CSS (如果需要)实现类似的网格覆盖效果(或者JavaScript )?
备注:
应该突出显示
发布于 2019-12-06 09:33:12
使用JS的一个想法是读取grid-template-columns和grid-template-rows的计算值,以便在填充占位符元素的网格之上创建另一个网格。
下面是一个基本的例子。您应该更新悬停时的值,因为getComputedStyle将返回像素值:
var grid = document.querySelector('.grid');
var overlay = document.createElement("div");
overlay.className = 'overlay';
overlay.style.gridTemplateRows = window.getComputedStyle(grid, null).getPropertyValue("grid-template-rows");
overlay.style.gridTemplateColumns = window.getComputedStyle(grid, null).getPropertyValue("grid-template-columns");
grid.appendChild(overlay);
/* Get the number of items*/
var Nc = overlay.style.gridTemplateColumns.split(" ").length;
var Nr = overlay.style.gridTemplateRows.split(" ").length;
/* Create placeholder items*/
for (var i = 0; i < Nc * Nr; i++) {
var d = document.createElement("div");
overlay.appendChild(d);
}
/* Update the values on hover*/
grid.addEventListener('mouseover', function() {
overlay.style.gridTemplateRows = window.getComputedStyle(grid, null).getPropertyValue("grid-template-rows");
overlay.style.gridTemplateColumns = window.getComputedStyle(grid, null).getPropertyValue("grid-template-columns");
}).grid {
display: grid;
grid-template-columns: repeat(8, 1fr);
grid-column-gap: 16px;
grid-row-gap: 8px;
position: relative;
overflow:hidden;
}
.first {
grid-column: 1 / 3;
background-color: #ccc;
}
.second {
grid-column: 5 / 6;
grid-row: 2 / 5;
background-color: #ccc;
height: 120px;
}
.overlay {
position: absolute;
display: grid;
top: 0;
left: 0;
right: 0;
bottom: 0;
grid-gap: inherit;
opacity: 0;
pointer-events: none;
}
.overlay>* {
border: 1px dotted;
background: rgba(0, 125, 0, 0.4);
}
.grid:hover .overlay {
opacity: 1;
}<div class="grid">
<div class="first">First</div>
<div class="second">Second</div>
</div>
发布于 2019-12-06 10:04:46
为每个网格单元创建元素:
const grid = document.getElementsByClassName("grid")[0];
const rows = 4;
const cols = 8;
for (let r = 1; r <= rows; r++) {
for (let c = 1; c <= cols; c++) {
const h = document.createElement("div");
h.classList.add("highlight");
h.style.gridRow = r;
h.style.gridColumn = c;
grid.appendChild(h);
}
}(这也可以在服务器端完成)
并为其造型:
.highlight {
z-index: 1;
border: 1px dashed blue;
background: #0000FF44;
}仅在悬停使用时显示:
.highlight {
display: none;
}
.grid:hover > .highlight {
display: block;
}https://stackoverflow.com/questions/59205867
复制相似问题