Programmatic API.
setSizes / getSizes.
Interactive demos of hcg-split-pane, a lightweight zero-dependency JavaScript
library for resizable split layouts. Every option is shown below:
direction, panes, sizes, sizeUnit,
minSize, maxSize, gutterSize,
disabled, data-hcg-* attributes, option() / setOption(),
lifecycle callbacks, and instance methods.
Version .
Full documentation - hcg-split-pane
Default 50/50 layout. Drag the vertical gutter or toggle direction at runtime.
Scrollable content area. Drag the gutter to resize.
Both panes share the container width minus the gutter.
split.setOption('direction', 'vertical');
<!-- HTML -->
<div style="height: 280px">
<div id="split-h">
<div>Left panel</div>
<div>Right panel</div>
</div>
</div>
<!-- JavaScript -->
<script>
const split = new HcgSplitPane('#split-h', {
direction: 'horizontal',
sizes: [50, 50],
minSize: 0
});
split.setOption('direction', 'vertical');
</script>
direction: 'vertical' with sizes: [40, 60].
Editor or toolbar area.
Terminal, preview, or output area.
<!-- HTML -->
<div style="height: 360px">
<div id="split-v">
<div>Top panel</div>
<div>Bottom panel</div>
</div>
</div>
<!-- JavaScript -->
<script>
new HcgSplitPane('#split-v', {
direction: 'vertical',
sizes: [40, 60],
minSize: 0
});
</script>
IDE-style layout: sidebar on the left, editor and preview stacked on the right. Two instances, two axes.
File tree or navigation.
Top half of the right area.
Bottom half - live output.
<!-- HTML -->
<div style="height: 280px">
<div id="split-nested-outer">
<div>Sidebar</div>
<div style="height: 100%; min-height: 0">
<div id="split-nested-inner" style="height: 100%">
<div>Editor</div>
<div>Preview</div>
</div>
</div>
</div>
</div>
<!-- JavaScript -->
<script>
const outer = new HcgSplitPane('#split-nested-outer', {
direction: 'horizontal',
sizes: [30, 70],
minSize: [150, 200]
});
const inner = new HcgSplitPane('#split-nested-inner', {
direction: 'vertical',
sizes: [55, 45],
minSize: [60, 60]
});
</script>
One instance, three panes - sizes: [20, 55, 25], minSize: [120, 200, 150].
Navigation.
Main content.
Inspector.
<!-- HTML -->
<div style="height: 280px">
<div id="split-3col">
<div>Sidebar</div>
<div>Editor</div>
<div>Panel</div>
</div>
</div>
<!-- JavaScript -->
<script>
new HcgSplitPane('#split-3col', {
direction: 'horizontal',
sizes: [20, 55, 25],
minSize: [120, 200, 150]
});
</script>
Same API with direction: 'vertical' - toolbar, editor, terminal.
Menus and tabs.
Primary editing area.
Console output.
<!-- HTML -->
<div style="height: 360px">
<div id="split-3row">
<div>Toolbar</div>
<div>Editor</div>
<div>Terminal</div>
</div>
</div>
<!-- JavaScript -->
<script>
new HcgSplitPane('#split-3row', {
direction: 'vertical',
sizes: [15, 60, 25],
minSize: [48, 120, 80]
});
</script>
Per-pane limits in pixels. Sidebar needs at least 200px; main at least 100px.
Cannot shrink below 200px.
Starts at 70% but respects minimum.
<!-- HTML -->
<div style="height: 280px">
<div id="split-asym">
<div>Sidebar</div>
<div>Main</div>
</div>
</div>
<!-- JavaScript -->
<script>
new HcgSplitPane('#split-asym', {
direction: 'horizontal',
sizes: [30, 70],
minSize: [200, 100]
});
</script>
sizeUnit: 'pixel', sidebar capped at 240px. getSizes() returns pixels.
Sizes: -
Fixed-style sidebar.
Fills remaining space.
<!-- HTML -->
<div style="height: 280px">
<div id="split-px">
<div>Sidebar</div>
<div>Main</div>
</div>
</div>
<!-- JavaScript -->
<script>
const split = new HcgSplitPane('#split-px', {
direction: 'horizontal',
sizeUnit: 'pixel',
sizes: [180, 360],
minSize: [120, 160],
maxSize: [240, Infinity]
});
split.getSizes(); // => [180, 412] (px, rounded)
</script>
Add data-hcg-split-pane and option attributes in HTML, then call HcgSplitPane.init() when the DOM is ready.
data-hcg-*
Initialized via init()
<!-- HTML -->
<div style="height: 280px">
<div
data-hcg-split-pane
data-hcg-direction="horizontal"
data-hcg-sizes="35,65"
data-hcg-min-size="120,160">
<div>Left</div>
<div>Right</div>
</div>
</div>
<!-- JavaScript -->
<script>
HcgSplitPane.init();
</script>
Set or read pane sizes programmatically. Drag end writes data-hcg-sizes on the container.
Sizes: 35 / 65
Programmatic API.
setSizes / getSizes.
<!-- HTML -->
<div style="height: 280px">
<div id="main-box">
<div>Left</div>
<div>Right</div>
</div>
</div>
<!-- JavaScript -->
<script>
const split = new HcgSplitPane('#main-box', {
sizes: [35, 65],
minSize: [120, 200]
});
split.setSizes([50, 50]);
const sizes = split.getSizes();
</script>
Turn gutter dragging off without destroying the instance.
Dragging: enabled
Toggle me
disable / enable
<!-- HTML -->
<div style="height: 280px">
<div id="split-toggle">
<div>Left</div>
<div>Right</div>
</div>
</div>
<!-- JavaScript -->
<script>
const split = new HcgSplitPane('#split-toggle');
split.disable();
split.enable();
split.destroy();
</script>
Create and destroy a nested split with the panes option and destroy().
Outer split.
<!-- HTML -->
<div style="height: 280px">
<div id="inner-outer">
<div>Left</div>
<div style="height: 100%; min-height: 0">
<div id="preview-box">
<div id="preview">preview</div>
<div id="console" hidden>console</div>
</div>
</div>
</div>
</div>
<!-- JavaScript -->
<script>
new HcgSplitPane('#inner-outer', { sizes: [50, 50] });
let inner = null;
document.getElementById('toggle').addEventListener('click', () => {
if (inner) {
inner.destroy();
inner = null;
return;
}
inner = new HcgSplitPane('#preview-box', {
direction: 'vertical',
panes: ['#preview', '#console'],
sizes: [55, 45]
});
});
</script>
Append DOM nodes, then destroy() and create a new instance with an updated panes list.
Panes: 2
Always present.
Always present.
Added at runtime.
<!-- HTML -->
<div style="height: 280px">
<div id="split-dynamic">
<div id="dyn-a">Pane A</div>
<div id="dyn-b">Pane B</div>
<div id="dyn-c" hidden>Pane C</div>
</div>
</div>
<!-- JavaScript -->
<script>
let split = new HcgSplitPane('#split-dynamic', {
panes: ['#dyn-a', '#dyn-b'],
sizes: [50, 50]
});
// After showing #dyn-c:
split.destroy();
split = new HcgSplitPane('#split-dynamic', {
panes: ['#dyn-a', '#dyn-b', '#dyn-c'],
sizes: [25, 50, 25]
});
</script>
Lifecycle callbacks from every demo above are logged here in real time.