首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何突出CSS网格单元格?

如何突出CSS网格单元格?
EN

Stack Overflow用户
提问于 2019-12-06 02:09:17
回答 2查看 3K关注 0票数 7

考虑一个CSS网格,其中行可以有可变高度:

代码语言:javascript
复制
.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;
}
代码语言:javascript
复制
<div class="grid">
  <div class="first">First</div>
  <div class="second">Second</div>
</div>

当在DevTools中的网格元素上悬停时,Chrome将网格可视化如下:

如何使用CSS (如果需要)实现类似的网格覆盖效果(或者JavaScript )?

备注:

应该突出显示

  1. 所有网格单元格,即使网格项没有占据它们。
  2. 网格单元格可以具有可变的高度(在示例中,第一行的高度比其余的行小)。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-06 09:33:12

使用JS的一个想法是读取grid-template-columnsgrid-template-rows的计算值,以便在填充占位符元素的网格之上创建另一个网格。

下面是一个基本的例子。您应该更新悬停时的值,因为getComputedStyle将返回像素值:

代码语言:javascript
复制
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");
})
代码语言:javascript
复制
.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;
}
代码语言:javascript
复制
<div class="grid">
  <div class="first">First</div>
  <div class="second">Second</div>
</div>

票数 8
EN

Stack Overflow用户

发布于 2019-12-06 10:04:46

为每个网格单元创建元素:

代码语言:javascript
复制
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);
    }
}

(这也可以在服务器端完成)

并为其造型:

代码语言:javascript
复制
.highlight {
  z-index: 1;
  border: 1px dashed blue;
  background: #0000FF44;
}

仅在悬停使用时显示:

代码语言:javascript
复制
.highlight {
    display: none;
}

.grid:hover > .highlight {
    display: block;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59205867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档