Resizable Panels / Split View

Preview

This panel can be resized.

Lorem ipsum dolor sit amet consectetur adipisicing elit. Neque tempore quibusdam eos quae rerum ipsam? Tempora voluptatum odio architecto. Autem, animi! Placeat voluptas saepe cum aliquid doloremque modi dignissimos in.

Settings

This panel adjusts as the left panel changes.

Lorem ipsum dolor, sit amet consectetur adipisicing elit. A ducimus, recusandae minima vel velit tempore reiciendis numquam repudiandae optio sunt non assumenda hic fugit explicabo ex obcaecati animi, consequatur iusto.

The HTML

							
								<div class="split_view">
								    <div class="split_panel split_panel-left">
								        <h2>Preview</h2>
								        <p><strong>This panel can be resized.</strong></p>
								        <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Neque tempore quibusdam eos quae rerum ipsam? Tempora voluptatum odio architecto. Autem, animi! Placeat voluptas saepe cum aliquid doloremque modi dignissimos in.</p>
								    </div>

								    <div class="split_handle" role="separator" aria-orientation="vertical"></div>

								    <div class="split_panel split_panel-right">
								        <h2>Settings</h2>
								        <p><strong>This panel adjusts as the left panel changes.</strong></p>
								        <p>Lorem ipsum dolor, sit amet consectetur adipisicing elit. A ducimus, recusandae minima vel velit tempore reiciendis numquam repudiandae optio sunt non assumenda hic fugit explicabo ex obcaecati animi, consequatur iusto.</p>
								    </div>
								</div>
							
						

The JavaScript

							
								function initSplitViewPanels() {
								    const root = document.querySelector(".split_view");
								    if (!root) return;

								    const left = root.querySelector(".split_panel-left");
								    const seperator = root.querySelector(".split_handle");

								    console.log(root.getBoundingClientRect());
								    let isResizing = false;

								    seperator.addEventListener("mousedown", (e) => {
								        isResizing = true;
								    });

								    document.addEventListener("mousemove", (e) => {
								        if (!isResizing) return;

								        const rootRect = root.getBoundingClientRect();
								        const newLeftWidth = e.clientX - rootRect.left;
								        const minWidth = 240;
								        const maxWidth = rootRect.width - minWidth;

								        if (newLeftWidth < minWidth || newLeftWidth > maxWidth) return;

								        left.style.width = `${newLeftWidth}px`;

								        document.addEventListener("mouseup", () => {
								            if (!isResizing) return;
								            isResizing = false;
								        });
								    });
								}
								initSplitViewPanels();