it-swarm.com.ru

Автоматическая высота родительского контейнера с Абсолютными/Фиксированными Детями

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

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

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

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

http://jsfiddle.net/dPCky/

31
Liam

Родительский 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/

33
Blowsie

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.

7
Anicho

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

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

2
Ricky Jiao

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

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

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

.container{ height: 75vw; }

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

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

2
Shale

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

Он был протестирован с float, inline-block, absolute, margins и 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>
1
Heroselohim

Относится к ответу @ 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
djmj