Bernd Wechner
Bernd Wechner

Reputation: 2133

CSS Grid, Horizontal Spacing of Columns: min-content does not seem to do what I expect

I've been reading and reading and I'm still stuck understanding how and why min-content seems to fail me in this example.

I have the following HTML (snipped from one project and simplified to the point of a good example):

<div class="lo_buttons">
        <div class="lo_reload_icon">
            <img src="https://cdn4.iconfinder.com/data/icons/24x24-free-application-icons/24/Apply.png" style="vertical-align: middle;">
        </div>

        <div class="lo_reload">
            <button type="button" class="button_left" id="btnReload">
                <img src="https://cdn2.iconfinder.com/data/icons/c9d/go.png" class="img_button">
            </button>
        </div>

        <div class="lo_shortcuts">
          <button type="button" class="button_left" id="btn1">1</button>
      <button type="button" class="button_left" id="btn2">2</button>
      <button type="button" class="button_left" id="btn3">3</button>
      <button type="button" class="button_left" id="btn4">4</button>
    </div>

        <div class="lo_space">
        </div>

        <div class="lo_utils">
          <button type="button" class="button_right" id="btn1">1</button>
      <button type="button" class="button_right" id="btn2">2</button>
      <button type="button" class="button_right" id="btn3">3</button>
        </div>  
</div>

and the following CSS:

.lo_buttons {
    grid-area: lo_buttons; 
    display: grid;
    grid-template-columns: min-content;
    grid-auto-rows: min-content min-content min-content 1fr min-content;
    grid-column-gap: 5px;
    grid-template-areas: "lo_reload lo_reload_icon lo_shortcuts lo_space lo_utils";
    white-space: nowrap !important;
}

.lo_reload      { grid-area: lo_reload; }
.lo_reload_icon { grid-area: lo_reload_icon;  }
.lo_shortcuts   { grid-area: lo_shortcuts; }
.lo_utils       { grid-area: lo_utils;  }
.lo_space       { grid-area: lo_space; }

.button_left { 
    float: left; 
    margin-right: 0.5em;
    margin-bottom: 5px;
}

.button_right { 
    float: right; 
    margin-left: 0.5em;
    margin-bottom: 5px;
}

which is all on codepen at:

https://codepen.io/bernd-wechner/pen/NWPwOXP

(where I can play with it)

The puzzle I have is that I'd like group of buttons number 1 2 3 4 snug against the tick icon to its left. The div the icon is in, is min-content yet consumes far more space than the icon in it. What am I missing here? And why does min-content not keep that grid cell as wide asd the icon in it?

Upvotes: 2

Views: 200

Answers (1)

Temani Afif
Temani Afif

Reputation: 272772

You are using grid-auto-rows where it should be grid-template-columns and it should be max-content not min-content since min-content will get the minimum width considering line-break and I suppose you want the button to remain on the same row.

.lo_buttons {
	grid-area: lo_buttons; 
	display: grid;
	grid-auto-columns: min-content; /* maybe auto-columns here ?*/
	grid-template-columns: max-content max-content max-content 1fr max-content;
	grid-column-gap: 5px;
	grid-template-areas: "lo_reload lo_reload_icon lo_shortcuts lo_space lo_utils";
	/*white-space: nowrap !important; useless*/
}

.lo_reload      { grid-area: lo_reload; }
.lo_reload_icon { grid-area: lo_reload_icon;  }
.lo_shortcuts   { grid-area: lo_shortcuts; }
.lo_utils       { grid-area: lo_utils;  }
.lo_space       { grid-area: lo_space; }

.button_left { 
	float: left; 
	margin-right: 0.5em;
	margin-bottom: 5px;
}

.button_right { 
	float: right; 
	margin-left: 0.5em;
	margin-bottom: 5px;
}
<div class="lo_buttons">
		<div class="lo_reload_icon">
			<img src="https://cdn4.iconfinder.com/data/icons/24x24-free-application-icons/24/Apply.png" style="vertical-align: middle;">
		</div>
		
		<div class="lo_reload">
			<button type="button" class="button_left" id="btnReload">
				<img src="https://cdn2.iconfinder.com/data/icons/c9d/go.png" class="img_button">
			</button>
		</div>
			
		<div class="lo_shortcuts">
		  <button type="button" class="button_left" id="btn1">1</button>
      <button type="button" class="button_left" id="btn2">2</button>
      <button type="button" class="button_left" id="btn3">3</button>
      <button type="button" class="button_left" id="btn4">4</button>
    </div>
			
		<div class="lo_space">
		</div>

		<div class="lo_utils">
		  <button type="button" class="button_right" id="btn1">1</button>
      <button type="button" class="button_right" id="btn2">2</button>
      <button type="button" class="button_right" id="btn3">3</button>
		</div>	
	</div>

I see you were also trying to use white-space:nowrap but it will only work if you remove float and in this case you can keep min-content because it will give you the same result as max-content since we disabled the line break

.lo_buttons {
	grid-area: lo_buttons; 
	display: grid;
	grid-auto-columns: min-content; /* maybe auto-columns here ?*/
	grid-template-columns: min-content min-content min-content 1fr min-content;
	grid-column-gap: 5px;
	grid-template-areas: "lo_reload lo_reload_icon lo_shortcuts lo_space lo_utils";
	white-space: nowrap ;
}

.lo_reload      { grid-area: lo_reload; }
.lo_reload_icon { grid-area: lo_reload_icon;  }
.lo_shortcuts   { grid-area: lo_shortcuts; }
.lo_utils       { grid-area: lo_utils;  }
.lo_space       { grid-area: lo_space; }

.button_left { 
	margin-bottom: 5px;
}

.button_right { 
	margin-bottom: 5px;
}
<div class="lo_buttons">
		<div class="lo_reload_icon">
			<img src="https://cdn4.iconfinder.com/data/icons/24x24-free-application-icons/24/Apply.png" style="vertical-align: middle;">
		</div>
		
		<div class="lo_reload">
			<button type="button" class="button_left" id="btnReload">
				<img src="https://cdn2.iconfinder.com/data/icons/c9d/go.png" class="img_button">
			</button>
		</div>
			
		<div class="lo_shortcuts">
		  <button type="button" class="button_left" id="btn1">1</button>
      <button type="button" class="button_left" id="btn2">2</button>
      <button type="button" class="button_left" id="btn3">3</button>
      <button type="button" class="button_left" id="btn4">4</button>
    </div>
			
		<div class="lo_space">
		</div>

		<div class="lo_utils">
		  <button type="button" class="button_right" id="btn1">1</button>
      <button type="button" class="button_right" id="btn2">2</button>
      <button type="button" class="button_right" id="btn3">3</button>
		</div>	
	</div>

Upvotes: 1

Related Questions