Consider a CSS grid where rows can have variable heights:
.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>
When hovering on the grid element in DevTools, Chrome visualizes the grid like this:
How could I achieve a similar grid overlay effect using CSS (or JavaScript, if needed)?
Notes:
To do so go to the Style tab and scroll to the bottom of the survey preview to access the link to the HTML/CSS Editor. CSS code should be placed on the Custom CSS tab. Then, simply replace the #CCCCCC portion of the code with the hex code for the color you wish to use.
You'll have to target the grid items directly. You wrote: For example, say I have a 3 row by 2 column CSS Grid Layout: grid-template-rows: 1fr 1fr 1fr; grid-template-columns: 1fr 1fr; .
With CSS Grid Layout, we get a new flexible unit: the Fr unit. Fr is a fractional unit and 1fr is for 1 part of the available space. The following are a few examples of the fr unit at work. The grid items in these examples are placed onto the grid with grid areas.
One idea using JS is to read the computed value of grid-template-columns
and grid-template-rows
in order to create another grid above the one you have filled with placeholder elements.
Here is a basic example. You should update the values on hover since getComputedStyle
will return pixel values:
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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With