I'm building a comparison chart and I need to fix the first column to the left-hand side and the last row to the bottom of the view, whilst respecting the col width and row heights of neighbouring cells.
The height of each row should grow based on the max-data in any given cell. I put together this basic version which shows what I have so far (apologies for the repetition of the <div class="items"> I needed enough to show the sticky footer):
* {
box-sizing: border-box;
}
body {
overflow: hidden;
}
.container {
overflow: auto;
height: calc(100vh - 80px);
margin-top: 80px;
padding-left: 15px;
}
.heading {
display: flex;
justify-content: space-between;
align-items: center;
position: absolute;
top: 0;
left: 0;
height: 80px;
z-index: 1;
background: white;
right: 0;
padding: 15px;
}
.compare {
width: max-content;
}
.grid {
display: grid;
position: relative;
grid-template-columns: repeat(6, 300px);
align-items: stretch;
}
.item {
padding: 10px;
}
.title {
position: sticky;
left: 0;
background-color: red;
}
.section span {
position: sticky;
left: 0;
background-color: green;
}
.footer {
position: sticky;
bottom: 0;
background: yellow;
}
// To highlight the problem I'm trying to solve
.item:nth-child(3),
.item:nth-child(9),
.item:nth-child(15),
.item:nth-child(21) {
border: 1px dashed blue;
border-top: none;
border-bottom: none;
}
.item:nth-child(3) {
border-top: 1px dashed blue;
}
.item:nth-child(21) {
border-bottom: 1px dashed blue;
}
<div class="container">
<div class="heading">
<h1>Compare</h1>
<button>Back</button>
</div>
<div class="compare">
<div class="section">
<span>Section title</span>
</div>
<div class="grid">
<div class="item title">Key</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item title">Key</div>
<div class="item">Value</div>
<div class="item">Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value </div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item title">Key</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item title">Key</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
</div>
<div class="section">
<span>Section title</span>
</div>
<div class="grid">
<div class="item title">Key</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item title">Key</div>
<div class="item">Value</div>
<div class="item">Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value </div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item title">Key</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item title">Key</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
</div>
<div class="section">
<span>Section title</span>
</div>
<div class="grid">
<div class="item title">Key</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item title">Key</div>
<div class="item">Value</div>
<div class="item">Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value </div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item title">Key</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item title">Key</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
</div>
<div class="section">
<span>Section title</span>
</div>
<div class="grid">
<div class="item title">Key</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item title">Key</div>
<div class="item">Value</div>
<div class="item">Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value Value </div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item title">Key</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item title">Key</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
<div class="item">Value</div>
</div>
<div class="grid footer">
<div class="item title">Key</div>
<div class="item">CTA</div>
<div class="item">CTA</div>
<div class="item">CTA</div>
<div class="item">CTA</div>
<div class="item">CTA</div>
</div>
</div>
</div>
I would like to enable drag/drop sorting for each column and would like to contain each column within a single element (so I can target e.g. <div class="col-2">...all <div class="items"> within this col...</div>). Is it possible to achieve this with grid markup? Or is the best way to target every individual <div class="items"></div> which make up a column with Javascript.