I'm working on a comparison chart and I need to ensure that the first column stays fixed to the left and the last row remains at the bottom of the view. This must be done while maintaining the width of columns and height of rows adjacent to them.
Each row should adjust its height based on the content in the cells with the maximum data. Below is a basic version illustrating what I have set up so far (please excuse the repetition of
<div class="items">
as it was necessary to demonstrate 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 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 want to implement drag-and-drop sorting for each column and keep each column within a single element (to target all
<div class="items">
within e.g. <div class="col-2">...
). Is it feasible to achieve this using grid markup? Or would it be better to target each individual <div class="items">
that makes up a column with JavaScript?