77

I have a container with two items. One of those items is a select element, so I need to set the size attribute via HTML. I want the other item in the container to stretch its height to fit the container. I can't figure it out. I don't want to explicitly set the height of the container because I don't know the size of that select box.

.container {
  padding: 5px;
  border: 1px solid black;
}

.container .column {
  display: inline-block;
  width: 40%;
  background-color: #AAA;
  padding: 5px;
  margin: 5px;
  vertical-align: top;
  height: 100%;
}

select {
  width: 100%;
}
<div class="container">
  <div class="column">Stretch to fill?</div>
  <div class="column">
    <select size="15">
            <option>Option 1</option>
            <option>Option 2</option>
        </select>
  </div>
  <div>
Zze
  • 18,229
  • 13
  • 85
  • 118
Brian Genisio
  • 47,787
  • 16
  • 124
  • 167

4 Answers4

66

If table-cell is an option, here's a way to do it:

.container {
  display: table;
  width: 100%;
  padding: 5px;
  border: 1px solid black;
}

.container .column {
  display: table-cell;
  width: 40%;
  background-color: #AAA;
  padding: 5px;
  border: 5px solid white;
  vertical-align: top;
  height: 100%;
}

select {
  width: 100%;
}
<div class="container">
  <div class="column">Stretch to fill?</div>
  <div class="column">
    <select size="15">
            <option>Option 1</option>
            <option>Option 2</option>
        </select>
  </div>
  <div>
Zze
  • 18,229
  • 13
  • 85
  • 118
Antony
  • 14,900
  • 10
  • 46
  • 74
  • This doesn't play nice with responsive designs, though. For example, if I set `@media (min-width: 48em)` to have `display: table-cell;` it will behave differently upon resizing the page on-the-fly and upon loading the page. – Elad Avron Jul 21 '18 at 09:30
20

If I understand what you are saying, you are facing the 100% height columns problem. I'm sorry to tell you there is no actual solution but "hacks".

Here you can find several of those workarounds. I like to use the one true layout method.

By the way, this is thinking you don't want to use the experimental css3 columns properties.

Gaston Sanchez
  • 1,181
  • 6
  • 13
  • 2
    One True Layout method worked for me! `margin-bottom: -50em; padding-bottom: 50em;` where `50em` is any project-specific magic number indeed does the trick. – lkraav Jan 11 '16 at 21:57
7

No answers here gave me comfort so I went and search for the truth. I added a bit more css to make a point on the spacing between two boxes.

CSS:

 .wrapper {
  background-color:gray;
}

.container {
    margin: 25px auto;
    display: inline-flex;
}

.leftbox {
    height: inherit;
    display: inline-block;
    border: 1px solid #D7D2CB;
    background-color: #FFFFFF;
    border-radius: 5px;
    max-width: 550px;
    margin-right: 18px;
    align-items: stretch;
    padding: 15px;
    width: 100%;
}

.rightbox {
    height: 100%;
    display: inline-block;
    border: 1px solid #D7D2CB;
    background-color: #FFFFFF;
    border-radius: 5px;
    align-items: stretch;
    max-width: 300px;
    width: 100%;
    padding: 20px 15px;
}

HTML:

<div class="wrapper">
  <div class="container">
    <div class="leftbox">
      There is something here, I am not avoiding it.
    </div>
    <div class="rightbox">
      Probably something else here but much much much much much much much much much much much much much much much much much much much much much much much much much much much much much bigger.
    </div>
  </div>
</div>

Check the codepen: https://codepen.io/anon/pen/XRNMMp

Ederico Rocha
  • 250
  • 4
  • 10
-1

An example where I needed a pseudo element also:

.cf:before,
.cf:after {
 content: " "; /* 1 */
 display: table; /* 2 */
}

.cf:after {
 clear: both;
}


*, *:before, *:after {
 -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;
}

.faux-columns {
 width: 80%;
 margin:3em auto;
 background-image: -webkit-linear-gradient(left, #f2f7fa 25%, #fff 75%);
 background-image: -moz-linear-gradient(left, #f2f7fa 25%, #fff 75%);
 background-image: -o-linear-gradient(left, #f2f7fa 25%, #fff 75%);
 background-image: linear-gradient(left, #f2f7fa 25%, #fff 75%);
 background: -webkit-gradient(linear, left top, right top, color-stop(0%,#f2f7fa), color-stop(25%, #f2f7fa), color-stop(25%,#ffffff), color-stop(100%,#ffffff));
 background: -moz-linear-gradient(left, #f2f7fa 0%, #f2f7fa 25%, #ffffff 25%, #ffffff 100%);
 background: -webkit-gradient(linear, left top, right top, color-stop(0%,#f2f7fa), color-stop(25%,#f2f7fa), color-stop(25%,#ffffff), color-stop(100%,#ffffff));
 background: -o-linear-gradient(left, #f2f7fa 0%,#f2f7fa 25%,#ffffff 25%,#ffffff 100%);
 background: -ms-linear-gradient(left, #f2f7fa 0%,#f2f7fa 25%,#ffffff 25%,#ffffff 100%);
 background: linear-gradient(left, #f2f7fa 0%,#f2f7fa 25%,#ffffff 25%,#ffffff 100%);
 border:1px solid #c1c1c2; 
}

.col-1, .col-2 {
 float:left; 
 vertical-align:top; 
 padding:2em 3em;
}

.col-1 {
 position:relative;
 width:25%; 
 background:#F2F7FC;
 border-right:1px solid #c1c1c2;
}

.col-2 { 
 width:75%;
 border-left:1px solid #c1c1c2;
 margin-left: -1px;
}

.col-1:after,
.col-1:before {
   top:100%; 
   border:solid transparent;content:"";
   height:0;
   width:0;
   position:absolute;
   pointer-events:none; 
   display:block;
}
.col-1:after  {
  border-color: rgba(255, 255, 255, 0) rgba(255, 255, 255, 0) rgba(255, 255, 255, 0) #f2f7fa; 
  border-style: solid; 
  border-width: 21px 0 21px 22px; 
  left:100%; 
  top: 47px; 
}
.col-1:before {
  border-color: rgba(0, 0, 0, 0) rgba(0, 0, 0, 0) rgba(0, 0, 0, 0) #c1c1c2;
  border-style: solid; 
  border-width: 22px 0 22px 23px; 
  left: 100%; 
  top: 46px;
}
<div class="faux-columns cf">
    <div class="col-1">
        <h4>First column with bordered triangle pseudo element attached to it. The background needs to be the full height of .faux-columns</h4>
    </div>
    <div class="col-2">
        <h4> Second column which in some cases will be much taller than column</h4>
        There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable. If you are going to use a passage of Lorem Ipsum, you need to be sure there isn't anything embarrassing hidden in the middle of text. All the Lorem Ipsum generators on the Internet tend to repeat predefined chunks as necessary, making this the first true generator on the Internet. It uses a dictionary of over 200 Latin words, combined with a handful of model sentence structures, to generate Lorem Ipsum which looks reasonable. The generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc.
        
        There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable. If you are going to use a passage of Lorem Ipsum, you need to be sure there isn't anything embarrassing hidden in the middle of text. All the Lorem Ipsum generators on the Internet tend to repeat predefined chunks as necessary, making this the first true generator on the Internet. It uses a dictionary of over 200 Latin words, combined with a handful of model sentence structures, to generate Lorem Ipsum which looks reasonable. The generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc.
    </div>
</div>
YakovL
  • 7,557
  • 12
  • 62
  • 102
PK_info
  • 87
  • 1
  • 7