As sites adapt more responsive and customizable designs, resizeable page elements enable greater user flexibility. One method for building adjustable sizing relies on the native resize property to make <div> elements resizable via drag handles.

In this comprehensive guide, we’ll explore various techniques for implementing user-resizeable divs through JavaScript examples.

Div Element Overview

Before diving into the resize functionality, let’s briefly recap key <div> behaviors.

Divs group content in rectangular containers to apply targeted styling and positioning:

<div class="photo-gallery">
  <!-- Child elements -->
</div>

As block elements, divs stack vertically by default based on the available width. Their height instead adapts to fit child content.

We can control size and alignment with CSS properties:

.photo-gallery {
  width: 800px;
  height: 600px;
  margin: 0 auto;
}

These core properties establish consistent div sizing across all users initially.

However, resizeable divs allow for adjustable widths and heights personalized by each user.

Making Divs Resizeable

The resize property enables manual drag-to-resize behavior on divs:

div.style.resize = "both"; // Enable resize

This adds a small handle to the bottom-right corner for adjusting width and height:

Resizable div screenshot

Note: Overflow must be anything other than "visible". Visible overflow automatically sizes to content, preventing resize.

Let‘s look closer at sizing directions and use cases next.

Resize Directions

We can limit resizing flexibility along one axis with horizontal or vertical values:

Horizontal Only

div.style.resize = "horizontal";

Horizontally Resizable Div

Vertical Only

div.style.resize = "vertical"; 

Vertically Resizable Div

Or enable bidirectional freedom as needed:

Horizontal + Vertical

div.style.resize = "both";

This flexibility helps adapt components based on usage, such as focusing a news ticker on width changes rather than height adjustments.

Common Use Cases

Understanding a few key use cases helps cement where resizable divs provide value:

Resizable Image Galleries

Building an adjustable photo feed lets users widen to fit more images per row:

Expanding Image Gallery

The <img> tags remain flow to fill available container width.

Adaptable Dashboard Columns

Resizeable columns enable customizable dashboard layouts. Just be sure to sync widths programmatically if linking element sizes.

Toggling Tree Menu Widths

For tree menus, a resizeable container adapts the indentation:

Adjustable Tree Menu

This keeps long nested items readable without horizontal scrolling.

These examples demonstrate the flexible UX possible when making divs user-adjustable.

Setting Minimum + Maximum Sizes

We can limit how small or large a div is allowed to resize both visually and programmatically:

CSS Min/Max Dimensions

#content {
  min-width: 500px;
  max-width: 1000px;

  min-height: 400px;
}

This clips resize handles from going beyond configured values.

For fluid limits based on page size:

min-width: 30%;
max-width: 80%; 

JavaScript Constraints

To prevent overflow past a container:

function constrainResize(div) {

  let maxHeight = div.parentElement.clientHeight;  
  let maxWidth = div.parentElement.clientWidth;

  div.style.maxHeight = `${maxHeight}px`;
  div.style.maxWidth = `${maxWidth}px`;

}

Here limiting to parent size keeps things neatly wrapped.

Positioning Nuances

When making a div vertically resizable with "vertical" for height, note that it may overlap other elements. Unlike width, its static positioning doesn‘t shift flow.

For horizontal resize behavior, surrounding content auto-flows to match changing width. But with vertical, we need adjustments:

let originalY = div.style.top; 

div.onresize = () => {

  // Reposition vertically on resize
  div.style.top = originalY;

}

This resets top offset when resized taller to avoid overlap.

Comparison with CSS Responsive Sizing

You may wonder how CSS methods like percents or viewport units compare:

CSS Responsive Width

div {
  width: 80vw; // 80% viewport width
}

Pros

  • Fluidly scales across device sizes
  • Less JavaScript overhead

Cons

  • Not personalized per user
  • Resizes based on global window not element fit

JavaScript Resize

div.style.resize = "horizontal"; 

Pros

  • Granular manual control
  • Dynamic min/max limits
  • User-specific customizations

Cons

  • Not automated responsively
  • Browser support varies

In practice, combining both approaches provides optimal flexibility:

  • CSS for general responsiveness
  • JavaScript for interactivity

How Resize Calculations Work

Interestingly, the resize logic adapts sizing based on handle movement deltas:

Horizontal

newWidth = previousWidth + dx

Vertical

newHeight = previousHeight + dy

The handle sets dx and dy offsets to stretch accurately, translating drag direction into dimension changes.

Understanding this helps explain flexible freedom regardless of original size.

Cross-Browser Compatibility

Being an newer property, resize support does vary across browsers:

Browser Compatible Versions
Chrome Yes
Firefox 50+
Safari 10.1+
Edge 16+
IE No

For full details refer to caniuse.com.

Gracefully handle inconsistent support based on your site visitor metrics if needed.

Reset Div to Initial Size

As users resize freely, provide them an escape hatch to revert to original dimensions:

<div id="panel">
  <!-- Content -->
</div>

<button onclick="resetPanel()">Reset Panel</button>

Then the reset logic:

let originalHeight;
let originalWidth;

function resetPanel() {

  div.style.height = originalHeight;
  div.style.width = originalWidth;

}

Save those initial values once on page load for easy restoration later!

Styling the Resize Handle

By default, resize handles match general OS sizing cursors and color schemes:

Default resize handle

Customize with further CSS:

div[resize] {
  resize: inherit; /* Required */

  cursor: nwse-resize;  
  background: transparent;

  width: 20px;
  height: 20px;  
}

div[resize]::after {
  content: "\2630"; /* Gear icon */  

  display: block;
  color: #888;

  text-align: center;
  font-size: 16px; 
}

This lets us tweak the appearance while maintaining core auto-positioning.

Fine-Tuning Resize Behavior

Several advanced properties help refine dragging interactions:

resize – overflow Behavior

The box-child value only shows the handle when overflow is non-visible:

resize: box-child;

Useful to indicate resizeability at appropriate times.

user-select – Disable Selection

Prevent accidentally highlighting text while dragging:

user-select: none;

CSS Cursors

Beyond global directional cursors, options like grabbing afford better feedback:

cursor: -webkit-grabbing;
cursor: grabbing; 

Try combining with transitions for smoother ephemeral visual changes on drag initiate/end.

Key Benefits Summary

After covering numerous customizable aspects of resizable divs, let‘s recap some core benefits:

💻 User-adjustable widths and heights
📏 Specify horizontal, vertical, or both axis
🖌 Style handles for custom appearances
🔢 Constrain within min/max dimensions
💾 Save and restore original sizes
⚙️ Enhance dragging ergonomics

Balancing native browser capabilities with custom JavaScript hooks unlocks a wide range of responsive UX.

Next Steps and Resources

For readers interested in diving deeper:

I may also explore draggable and resizable elements more in future posts. Let me know in the comments what else you would like to see covered!

Similar Posts