Высота не 100% на жидком контейнере, даже если html и body

У меня есть следующий макет (я использую 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>

и это (релевантно) css поддерживает его:

html {
    height: 100%;
}
body {
    min-height: 100%
} 
.fill-height {
    height: 100%;
}

Элементы html и body ведут себя как ожидалось. Они заполняют свои области любым уровнем масштабирования или размером.

Однако container-fluid с добавленным классом fill-height не выполняет работу. Это только обертывание содержимого, а не заполнение донизу. Это проблема, потому что она несет ответственность за добавление body-film и block-film к странице, которые являются только полупрозрачными фонами, чтобы придать целому целу некоторое единство цвета.

Вот несколько скриншотов, все с увеличенной страницей, поэтому содержимое не заполняет высоту:

My page with nothing selected

Теперь он выбран с помощью элемента body. Как вы можете видеть, он прекрасно заполняет родителя.

My page with body selected

Но container-fluid не работает.

My page with container selected

С fill-height я пробовал как height, так и min-height, и они выглядят точно так же.

Ваша помощь приветствуется!

Update

Я пытаюсь использовать все возможные комбинации min-height и height для этих трех элементов, и ничего не работает должным образом.

height во всех трех случаях, когда содержимое слишком мало для области просмотра, но когда содержимое слишком велико для области просмотра, блок содержимого полностью переполняется из body, что означает, что фильмы слишком короткие для него.

min-height на всех трех кажется мне самым логичным способом, но он ломается, когда контент слишком мал. В этом случае элемент body не растягивается, чтобы заполнить его родительский html.

Что происходит!!!!????? Это ошибка в новом Blaze templating engine Meteor использует?

Update

Я только что пробовал height: inherit в моем fill-height, и он тоже не работал. Я действительно в конце своей веревки. Кажется, это должно быть так просто.

Update

Хорошо, у меня есть небольшое изменение. С помощью этого less:

.fill-height {
    min-height: 100%;
    height:auto !important; 
    height: 100%; 
}
.body-film {
    .fill-height();
}
.block-film {
    .fill-height();
}

контейнер-жидкость теперь имеет полную высоту, но не body-film и block-film, которые используют тот же самый mixin!!

Вот скриншот, показывающий row.body-film, который должен быть полным, так как container-fluid над ним (возьмите мое слово за это, container-fluid теперь растягивается до заполните тело).

The row is broken.

Заметьте, что добавление объявления fill-height в html в строке html не изменило ничего, он ведет себя одинаково, как если бы он просто получал это через body-film mixin.

Почему некоторые элементы не отвечают на все эти требования min-height?

P.S., я использую Chrome, но он находится на машине ubuntu, поэтому я не могу быть уверен, есть ли какие-либо несоответствия.

Ответ

В результате работа:

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);   
}

Атрибут overflow был чрезвычайно ключевым, и о нем раньше ничего не было известно. Предоставление значения scroll всему телу (вещь, которая должна была быть способна перемещаться вверх и вниз), была ответом, а также дала самый внутренний элемент (block-film) min-height, чтобы обеспечить его растяжение и затем все родительские элементы.

Ответы

Ответ 1

Я знаю, что ты сказал, что пробовал каждую комбинацию, но как насчет:

html, body {
    height: 100%;
}
.fill-height {
    min-height: 100%;
    height:auto !important; /* cross-browser */
    height: 100%; /* cross-browser */
}

Проблема с установкой min-height: 100% в теле состоит в том, что height: 100% на дочернем div фактически не имеет правильной высоты родителя для ссылки и не будет работать.

EDIT:

Эта логика применяется ко всем дочерним div. Таким образом, в вашем случае, тело-фильм div является ребенком контейнерной жидкости. Поскольку контейнерная жидкость теперь имеет значение min-height 100%, а не определенный height (он установлен на авто), когда вы даете процент высоты к телесъемке, у него нет высоты для ссылки. Это стоит прочитать MDN - высота CSS и MDN - CSS min- высота.

Другими словами, если вы хотите иметь div с высотой или минимальной высотой 100%, тогда все его родительские элементы должны иметь определенную высоту 100%, вплоть до тега html.

Что вам может понадобиться, это примерно так:

html, body {
    height: 100%;
}
.container-fluid {
    height: 100%;
    overflow-y: hidden; /* don't show content that exceeds my height */
}
.body-film {
    min-height: 100%;
    overflow-y: scroll;
}

Это может быть не окончательный ответ, поскольку он зависит от того, что вы хотите точно, но, надеюсь, это наводит вас на правильный путь.

Ответ 2

Хотя это напрямую не связано с проблемами определения размера html, я недавно обнаружил гораздо более простой способ достичь такого рода "прозрачной пленки", используя box-shadow.

Эта статья очень хорошо разбирается. Он также предлагает другие методы, но, откровенно говоря, это кажется самым простым.

<div class="example"></div>

.example {
    position:relative;
    width: 300px;
    height: 313px;
    box-shadow: 0px 313px rgba(255, 0, 92, 0.6) inset;
    background: url(/img.png);
}