cssresizecss-grid

Grid item remains fixed in size when sibling item is resized


I have a 2 column grid that I have successfully attached a resize handle to. I need to divide the content evenly between the columns and then have the right side fill available space when the left size is shrunk. I have tried two approaches. The first is defining the grid with

grid-template-columns: [left] 1fr [right] 1fr;

which positions the content correctly but doesn't resize the right div past its starting point. It stays the original size and never follows the resize.

I have also tried

grid-template-columns: [left] min-content [right] 1fr;

which fails because it doesn't divide the columns equally and doesn't allow resizing smaller than the min-content.

Here is the code.

body {
  margin: 10px;
  height: 100%;
}

.outer {
  display: grid;
  border: 3px dotted red;
  padding: 3px;
  grid-gap: 3px;
  grid-template-columns: [left] 1fr [right] 1fr;
}

.left {
  grid-area: left;
  border: 3px dotted blue;
  overflow: auto;
  resize: horizontal;
  min-width: 100px;
  max-width: 75vw;
}


.right {
  grid-area: right;
  border: 3px dotted gray;
  overflow: auto;
}
 <div class="outer">
   <div class="left">
     <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
       dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
   </div>
   <div class="right">
     <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
       dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
   </div>
 </div>


Solution

  • Use auto instead of 1fr.

    Grid items exist inside grid tracks (columns and rows).

    When you set your container to:

    grid-template-columns: 1fr 1fr
    

    ... the columns tracks are frozen in place. The resize function works on the grid items, but it has no effect on the tracks.

    You'll see the same limitation with:

    grid-template-columns: 50% 50%
    

    However, you can get around the problem with:

    grid-template-columns: auto auto
    

    .outer {
      display: grid;
      grid-template-columns: auto auto;
      grid-gap: 3px;
      border: 3px dotted red;
      padding: 3px;
    }
    
    .left {
      resize: horizontal;
      overflow: auto;
      border: 3px dotted blue;
    }
    
    .right {
      overflow: auto;
      border: 3px dotted gray;
    }
    <div class="outer">
      <div class="left">
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
          dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
      </div>
      <div class="right">
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
          dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
      </div>
    </div>