I have the following layout (I'm using Meteor):
<template name="headerFooter">
<div class="container-fluid fill-height">
{{> header}}
{{> UI.contentBlock}}
{{> footer}}
</div>
</template>
<template name="home">
{{#headerFooter}}
<div class="row body-film">
<div id="newsfeed" class="col-sm-offset-7 col-sm-5 block-film">
{{#each stories}}
<div class="story">...</div>
{{/each}}
</div>
</div>
{{/headerFooter}}
</template>
and this (relevant) css
backing it up:
html {
height: 100%;
}
body {
min-height: 100%
}
.fill-height {
height: 100%;
}
The html
and body
elements are both behaving as expected. They fill their areas at any zoom level or size.
However, the container-fluid
with the fill-height
class added isn't doing the job. It's only wrapping it's content, and not filling to the bottom. This is a problem because it is responsible for adding body-film
and block-film
to the page, which are just semi-transparent backgrounds to give the whole thing some color unity.
Here are some screenshots, all with the page zoomed out so the content doesn't fill the height:
Now here it is with the body
element selected. As you can see it fills the parent just fine.
But the container-fluid
doesn't.
With fill-height
I've tried both height
and min-height
, and they look exactly the same.
Your help is appreciated!
Update
I've been trying every possible combination of min-height
and height
on these three elements, and nothing works properly.
height
on all three works when the content is too small for the viewport, but when the content is too large for the viewport, the content block overflows out of the body
entirely, which means the films are too short for it.
min-height
on all three seems to me to be the most logical way to go, but it breaks when the content is too small. In this case, the body
element doesn't stretch to fill its html
parent.
What's going on!!!!????? Is this a bug in the new Blaze templating engine Meteor uses?
Update
I've just tried height: inherit
in my fill-height
, and it didn't work either. I'm really at the end of my rope. This seems like it should be so simple.
Update
Alright, I've got a slight change to happen. With this less
:
.fill-height {
min-height: 100%;
height:auto !important;
height: 100%;
}
.body-film {
.fill-height();
}
.block-film {
.fill-height();
}
The container-fluid is now full height, but not the body-film
and block-film
which are using the exact same mixin!!
Here is a screenshot, showing the row.body-film
, which should be full height, since the container-fluid
above it is (take my word for it, the container-fluid
is now stretched to fill the body).
Note, manually adding the fill-height
to the html
declaration of the row didn't change anything, it behaves identically as if it were simply receiving that through the body-film
mixin.
Why is it that some elements don't respond at all to all of these min-height
demands?
P.S., I'm using Chrome, but it is on a ubuntu machine, so I can't be sure if there are any inconsistencies.
Answer
The following ended up working:
html, body {
height: 100%;
}
.container-fluid {
height: 100%;
overflow-y: hidden; /* don't show content that exceeds my height */
}
.body-film {
height: 100%;
overflow-y: auto; // a value of 'scroll' will force scrollbars, even if they aren't necessary. This is cleaner.
background-color: fadeout(@studio-bar-color, @studio-body-film-trans-delta);
}
.block-film {
min-height: 100%;
overflow-y: hidden; /* don't show content that exceeds my height */
background-color: fadeout(@studio-bar-color, @studio-block-film-trans-delta);
}
The overflow
attribute was extremely key, and it's something didn't previously know much about. Giving a scroll
value to the entire body (the thing that needed to be able to move up and down) was the answer, as well as giving the innermost element (block-film
) the min-height
to ensure it stretched itself and subsequently all of the parent elements.
See Question&Answers more detail:
os