The min-width and max-width declaration for Flexbox doesn\'t work on Safari? Why?

Safari has historically had issues with min-width and max-width declarations on flex items. The main problem occurs because Safari's older WebKit engine doesn't properly calculate these constraints when combined with flexbox properties, causing layout inconsistencies across browsers.

The solution is to use the flex shorthand property instead of separate min-width and max-width declarations. This approach ensures consistent behavior across all browsers, including Safari.

Why Safari Has Issues

Safari's WebKit engine treats min-width and max-width differently than other browsers when applied to flex items. The browser may ignore these constraints or calculate them incorrectly, leading to unexpected layout behavior. This is particularly problematic in older Safari versions and can affect responsive designs.

The root cause is Safari's implementation of the flexbox specification, where width constraints on flex items aren't always respected during the flex calculation process.

Syntax

Instead of using separate width constraints

.item {
  min-width: 40%;
  max-width: 40%;
}

Use the flex shorthand property

.item {
  flex: flex-grow flex-shrink flex-basis;
}

Where

  • flex-grow Defines how much the item should grow relative to other items
  • flex-shrink Defines how much the item should shrink relative to other items
  • flex-basis Sets the initial main size before free space is distributed

Converting Width Constraints to Flex

To achieve fixed width behavior (equivalent to min-width: 40%; max-width: 40%), use

flex: 0 0 40%;

This means

  • flex-grow: 0 Item won't grow
  • flex-shrink: 0 Item won't shrink
  • flex-basis: 40% Item takes exactly 40% width
Safari-Compatible Flex Approach Problematic (Safari) min-width: 40%; max-width: 40%; Compatible (All Browsers) flex: 0 0 40%; (grow shrink basis)

Cross-Browser Flexbox Example

Following example demonstrates a flexbox layout that works consistently across all browsers, including Safari

<!DOCTYPE html>
<html>
<head>
   <title>Cross-Browser Flexbox</title>
   <style> 
      .parentBox {
         display: flex;
         flex: 1 0 100%;
         background-color: yellow;
         border: 3px solid skyblue;
         padding: 10px;
      }
      .childBox {
         display: flex;
         flex: 1 1 50%;
         background-color: green;
         color: white;
         border: 1px solid blue;
         margin: 5px;
         padding: 10px;
      }
      .babyChildBox {
         flex: 1 1 50%;
         background-color: orange;
         color: black;
         margin: 2px;
         padding: 8px;
         text-align: center;
      }
   </style>
</head>
<body style="font-family: Arial, sans-serif;">
   <h1>Safari-Compatible Flexbox Layout</h1>
   <div class='parentBox'>
      <div class='childBox'>
         <div class='babyChildBox'>Child A1</div>
         <div class='babyChildBox'>Child A2</div>
      </div>
      <div class='childBox'>
         <div class='babyChildBox'>Child B1</div>
         <div class='babyChildBox'>Child B2</div>
      </div>
   </div>
</body>
</html>

The output shows a nested flexbox layout that renders consistently across all browsers

Safari-Compatible Flexbox Layout

[Yellow container with blue border containing:]
[Green box 1: Child A1 | Child A2] [Green box 2: Child B1 | Child B2]
(Each green box contains two orange child elements side by side)

Fixed Width Flex Items

For elements that need fixed widths (Safari-compatible alternative to min/max-width)

<!DOCTYPE html>
<html>
<head>
   <title>Fixed Width Flex Items</title>
   <style> 
      .container {
         display: flex;
         background-color: #f0f0f0;
         padding: 10px;
         gap: 10px;
      }
      .sidebar {
         flex: 0 0 200px; /* Fixed 200px width */
         background-color: #3498db;
         color: white;
         padding: 15px;
      }
      .content {
         flex: 1 1 auto; /* Takes remaining space */
         background-color: #2ecc71;
         color: white;
         padding: 15px;
      }
      .fixed-item {
         flex: 0 0 150px; /* Fixed 150px width */
         background-color: #e74c3c;
         color: white;
         padding: 15px;
      }
   </style>
</head>
<body style="font-family: Arial, sans-serif;">
   <h2>Fixed Width Layout (Safari Compatible)</h2>
   <div class='container'>
      <div class='sidebar'>Sidebar (200px fixed)</div>
      <div class='content'>Main Content (flexible)</div>
      <div class='fixed-item'>Fixed Panel (150px)</div>
   </div>
</body>
</html>

This creates a three-column layout where the sidebar and panel have fixed widths while the content area adapts

Fixed Width Layout (Safari Compatible)

[Sidebar (200px fixed)] [Main Content (flexible)] [Fixed Panel (150px)]
     (blue)                    (green)                  (red)

Common Flex Patterns for Safari Compatibility

Following table shows common width scenarios and their Safari-compatible flex equivalents

Desired Behavior Problematic (Safari Issues) Safari-Compatible Solution
Fixed width element min-width: 300px; max-width: 300px; flex: 0 0 300px;
Minimum width, can grow min-width: 200px; flex: 1 0 200px;
Equal width items width: 50%; flex: 1 1 50%;
Flexible with basis flex-basis: 250px; flex: 1 1 250px;
Percentage width min-width: 30%; max-width: 30%; flex: 0 0 30%;

Best Practices

Follow these guidelines for Safari-compatible flexbox layouts

  • Always use flex shorthand instead of separate min/max-width properties
  • Set flex-shrink to 0 for fixed-width elements to prevent unexpected shrinking
  • Use flex-basis instead of width for initial sizing
  • Test across browsers including Safari to ensure consistent behavior
  • Avoid mixing traditional width properties with flexbox on the same element

Conclusion

Safari's WebKit engine has compatibility issues with min-width and max-width on flex items. The solution is to use the flex shorthand property instead, which provides consistent cross-browser behavior. Use flex: 0 0 [size] for fixed widths and flex: 1 1 [basis] for flexible elements with a starting size.

Updated on: 2026-03-16T21:38:54+05:30

2K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements