Автоматическая высота родительского контейнера с абсолютными / фиксированными дочерними элементами - PullRequest
31 голосов
/ 30 января 2012

Я пытаюсь установить автоматическую высоту div, который содержит 2 дочерних элемента, расположенных фиксированным и абсолютно соответствующим образом.

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

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

Не уверен, что в этом есть смысл, у меня нет действительного кода, но я сделал скрипку, пытаясь объяснить ...

http://jsfiddle.net/dPCky/

Ответы [ 7 ]

35 голосов
/ 30 января 2012

Родительский div не может использовать height:auto, когда его дочерние элементы позиционированы как абсолютные / фиксированные.

Для этого вам потребуется JavaScript.

Пример в jQuery:

var biggestHeight = 0;
// Loop through elements children to find & set the biggest height
$(".container *").each(function(){
 // If this elements height is bigger than the biggestHeight
 if ($(this).height() > biggestHeight ) {
   // Set the biggestHeight to this Height
   biggestHeight = $(this).height();
 }
});

// Set the container height
$(".container").height(biggestHeight);

Рабочий пример http://jsfiddle.net/blowsie/dPCky/1/

7 голосов
/ 30 января 2012

http://jsfiddle.net/dPCky/32/ - аналогичный эффект при использовании float:left;

http://jsfiddle.net/dPCky/40/ - еще более близкий результат к желаемому эффекту.

Если вы хотите изменить свой HTML, то вы можете сделать то, что я сделал выше.

Я изучил позиционирование из следующих руководств, которые я настоятельно рекомендую всем, кто хочет стать профессионалом позиционирования в html / css:

http://www.barelyfitz.com/screencast/html-training/css/positioning/

Я бы вообще старался не использовать javascript там, где это возможно, при выполнении чего-то, что потенциально может иметь исправление уровня css или html, если вы хотите настроить html.

2 голосов
/ 26 июня 2017

Если вы не хотите использовать JavaScript, вы можете сослаться на этот ответ https://stackoverflow.com/a/33788333/1272106.

Краткое описание: дублировать один элемент и задать видимость, чтобы скрыть, чтобы расширить родительский элемент.

2 голосов
/ 04 декабря 2015

Немного опоздал на вечеринку, но это может кому-то помочь, поскольку именно так я недавно решил проблему без JS - ЕСЛИ дети сохраняют свои пропорции при уменьшении для мобильных устройств. Мой пример относится к созданию адаптивного слайд-шоу jQuery.cycle для контекста. Не уверен, что это то, чего вы пытаетесь достичь выше, но в нем задействованы абсолютно позиционированные дочерние элементы в контейнере, который имеет 100% ширины страницы на мобильных устройствах и явные размеры на больших экранах.

Вы можете установить высоту родительского элемента в единицах ширины области просмотра (vw), чтобы высота изменялась относительно ширины устройства. В наши дни поддержка достаточно широка, поэтому большинство мобильных устройств будут использовать эти устройства правильно, ошибки и частичная поддержка не относятся к vw (а скорее к vmin и vmax в IE). Только Opera Mini находится в темноте.

Не зная, что делают дочерние элементы между отзывчивыми точками в этом примере (jsfiddle имеет явный набор высот), давайте предположим, что высота дочерних элементов предсказуемо уменьшается относительно ширины устройства, что позволяет довольно точно предположить высоту в зависимости от соотношения сторон.

.container{ height: 75vw; }

http://caniuse.com/#feat=viewport-units

Обратите внимание на известную проблему # 7 на caniuse, если вы рассчитываете 100vw в качестве меры ширины, но здесь мы играем с высотой!

1 голос
/ 05 октября 2014

Наслаждайтесь этим Автоматическая высота для контейнера, который адаптируется к любому устройству и изменяет размер или вращает область просмотра.

Он был протестирован с float, inline-block, absolute, margin и padding , установленным на childs.

<div class="autoheight" style="background: blue">
    <div style="position: absolute; width: 33.3%; background: red">
    Only
        <div style="background: green">
        First level elements are measured as expected
        </div>
    </div>
    <div style="float:left; width: 33.3%; background: red">
    One Two Three Four Five Six Seven Eight Night Ten
    </div>
    <div style="float:left; width: 33.3%; background: red">
    One Two Three Four Five Six
    </div>
</div>

<script>
function processAutoheight()
{
    var maxHeight = 0;

    // This will check first level children ONLY as intended.
    $(".autoheight > *").each(function(){

        height = $(this).outerHeight(true); // outerHeight will add padding and margin to height total
        if (height > maxHeight ) {
            maxHeight = height;
        }
    });

    $(".autoheight").height(maxHeight);
}

// Recalculate under any condition that the viewport dimension has changed
$(document).ready(function() {

    $(window).resize(function() { processAutoheight(); });

    // BOTH were required to work on any device "document" and "window".
    // I don't know if newer jQuery versions fixed this issue for any device.
    $(document).resize(function() { processAutoheight(); });

    // First processing when document is ready
    processAutoheight();
});
</script>
0 голосов
/ 28 марта 2016

Относится к ответу @ Blowie:

/**
 * Sets the height of a container to its maximum height of its children. This
 * method is required in case
 * 
 * @param selector jQuery selector
 */
function setHeightByChildrenHeight(selector)
{
    $(selector).each(function()
    {
        var height = 0;

        $(this).children("*").each(function()
        {
            height = Math.max(height, $(this).height());
        });

        $(this).height(height);
    });
};
0 голосов
/ 26 ноября 2013

Более простой способ:

$(".container").height($(document).height());
...