I'm working on solving a similar issue for a datagrid component. I used flexbox to layout the headers and cells (as rows) and then wrapped things in scrollable panes for the desired access.
Check out this codepen to see it working. fyi - the codepen is actually trying to solve a different problem but it might give you some ideas for using flexbox for the layout and panes for the scrollable content.
SCSS
body {
padding: 25px;
}
p {
margin: 12px 0;
}
.datagrid-host {
border: 1px solid;
.datagrid-action-overflow {
border-bottom: 1px solid;
}
.datagrid-viewport {
display: flex;
flex-direction: row;
.datagrid-pinned-data {
flex: 0 0 auto;
width: 250px;
border-right: 1px solid;
display: flex;
// display: none;
flex-direction: column;
height: 200px;
.pinned-header {
flex: 0 0 auto;
background-color: #dcdcdc;
}
.pinned-data {
flex: 1 1 auto;
&.y-scrollable-pane {
flex: 1 1 auto;
position: relative;/* need this to position inner content */
overflow-y: auto;
}
}
}
.x-scrollable-pane {
flex: 1 1 auto;
display: flex;
flex-direction: column;
height: 200px; // sets the height of the datagrid
overflow-x: auto;
.datagrid-column-header {
flex: 0 0 auto;
background-color: #dcdcdc;
width: 1900px; // must be same width as .page-content
}
.y-scrollable-pane {
flex: 1 1 auto;
position: relative;/* need this to position inner content */
overflow-y: auto;
width: 1900px; // must be same width as .page-header
}
}
}
.datagrid-footer {
border-top: 1px solid;
}
}
.datagrid-row {
display: flex;
.datagrid-cell {
width: 10%;
}
}
HTML
<div class="datagrid-host">
<div class="datagrid-action-overflow">
<button>Action 1</button>
<button>Action 2</button>
<button>Action 3</button>
<button>Action 4</button></div>
<div class="datagrid-viewport">
<div class="datagrid-pinned-data">
<div class="x-scrollable-pane"> <!-- if we do more than one column pinnible this width needs to be dynamic, and scrollable? -->
<div class="datagrid-column-header">
<div class="datagrid-row">
<div class="datagrid-cell">Column</div>
<div class="datagrid-cell">Column</div>
<div class="datagrid-cell">Column</div>
<div class="datagrid-cell">Column</div>
<div class="datagrid-cell">Column</div>
<div class="datagrid-cell">Column</div>
<div class="datagrid-cell">Column</div>
<div class="datagrid-cell">Column</div>
<div class="datagrid-cell">Column</div>
<div class="datagrid-cell">Column</div>
</div>
</div>
<div class="y-scrollable-pane">
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
</div>
</div>
</div>
<div class="x-scrollable-pane">
<div class="datagrid-column-header">
<div class="datagrid-row">
<div class="datagrid-cell">Column</div>
<div class="datagrid-cell">Column</div>
<div class="datagrid-cell">Column</div>
<div class="datagrid-cell">Column</div>
<div class="datagrid-cell">Column</div>
<div class="datagrid-cell">Column</div>
<div class="datagrid-cell">Column</div>
<div class="datagrid-cell">Column</div>
<div class="datagrid-cell">Column</div>
<div class="datagrid-cell">Column</div>
</div>
</div>
<div class="y-scrollable-pane">
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
<div class="datagrid-row">
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
<div class="datagrid-cell">Cell</div>
</div>
</div>
</div></div>
<div class="datagrid-footer">Footer</div>
</div>