Сделать абсолютно позиционированных div-элемент расширения Родительский див высота



как вы можете видеть в CSS ниже, я хочу, чтобы child2 позиционировал себя перед child1. Это связано с тем, что сайт, который я сейчас разрабатываю, также должен работать на мобильных устройствах, на которых child2 должен быть внизу, поскольку он содержит навигацию, которую я хочу ниже контента на мобильных устройствах. - Почему не 2 Сайт masterpages? Это только 2 divs, которые перемещаются во всем HTML, поэтому 2 мастер-страницы для этого незначительного изменения являются перебор.



HTML:



<div id="parent">
<div class="child1"></div>
<div class="child2"></div>
</div>


CSS:



parent { position: relative; width: 100%; }
child1 { width: auto; margin-left: 160px; }
child2 { width: 145px; position: absolute; top: 0px; bottom: 0px; }


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



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

Я попробовал установить overflow:hidden; на родительском div, но это не помогло, как и clearfix.



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

717   12  

12 ответов:

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

вы либо используете фиксированные высоты, либо вам нужно задействовать JS.

хотя растяжение до элементов с position: absolute невозможно, часто есть решения, где вы можете избежать абсолютного позиционирования при получении того же эффекта. Посмотрите на эту скрипку, которая решает проблему в вашем конкретном случае http://jsfiddle.net/gS9q7/

трюк заключается в обратном порядке элементов, плавая оба элемента, первый справа, второй слева, так что второй появляется первый.

.child1 {
    width: calc(100% - 160px);
    float: right;
}
.child2 {
    width: 145px;
    float: left;
}

наконец, добавьте clearfix к родителю, и все готово (см. скрипка для полного решения).

Feeela право но вы можете сделать родителей div сжатие / расширение до дочернего элемента, если вы отмените div позиционирование такой:

.parent{
    postion: absolute;
    /* position it in the browser using the `left`, `top` and `margin` 
       attributes */
}

.child{
    position: relative;
    height: 100%;
    width: 100%;

    overflow: hidden;
    /* to pad or move it around using `left` and `top` inside the parent */
}

Это должно работать для вас.

есть довольно простой способ решить эту.

вам просто нужно дублировать содержимое child1 и child2 в относительных divs с display:none в Родительском div. Скажем child1_1 и child2_2. Поместите child2_2 сверху и child1_1 снизу.

когда ваш jquery (или что-то еще) вызывает абсолютный div, просто установите соответствующий относительный div (child1_1 или child2_2) с display:block и visibility:hidden. Относительный ребенок по-прежнему будет невидимым, но сделает div родителя высший.

У меня была похожая проблема. Чтобы решить эту проблему (вместо вычисления высоты iframe с помощью тела, документа или окна), я создал div, который обертывает все содержимое страницы (например, div с идентификатором="страница"), а затем использовал его высоту.

есть лучший способ сделать это сейчас. Вы можете использовать нижнее свойство.

    .my-element {
      position: absolute;
      bottom: 30px;
    }

Я придумал другое решение, которое я не люблю, но получает работу.

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

<div id="parent">
    <div class="width-calc">
        <div class="child1"></div>
        <div class="child2"></div>
    </div>

    <div class="child1"></div>
    <div class="child2"></div>
</div>

CSS:

.width-calc {
    height: 0;
    overflow: hidden;
}

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

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

<div class="container">
  <div class="my-child"></div>
</div>

и ваш css вот так:

.container{
    background-color: red;
    position: relative;
    border: 1px solid black;
    width: 100%;
}

.my-child{
    position: relative;
    top: 0;
    left: 100%;
    height: 100px;
    width: 100px;
    margin-left: -100px;
    background-color: blue;
}

https://jsfiddle.net/royriojas/dndjwa6t/

" вы либо используете фиксированные высоты, либо вам нужно задействовать JS."

вот пример JS:

---------- jQuery JS пример--------------------

    function findEnvelopSizeOfAbsolutelyPositionedChildren(containerSelector){
        var maxX = $(containerSelector).width(), maxY = $(containerSelector).height();

        $(containerSelector).children().each(function (i){
            if (maxX < parseInt($(this).css('left')) + $(this).width()){
                maxX = parseInt($(this).css('left')) + $(this).width();
            }
            if (maxY < parseInt($(this).css('top')) + $(this).height()){
                maxY = parseInt($(this).css('top')) + $(this).height();
            }
        });
        return {
            'width': maxX,
            'height': maxY
        }
    }

    var specBodySize = findEnvelopSizeOfAbsolutelyPositionedSubDivs("#SpecBody");
    $("#SpecBody").width(specBodySize.width);
    $("#SpecBody").height(specBodySize.height);

также рассмотрим следующий подход:

CSS:

.parent {
  height: 100%;
}
.parent:after {
  content: '';
  display: block;
}

также, поскольку вы пытаетесь изменить положение дивов, рассмотрим CSS grid

абсолютные представления позиционируют себя против ближайшего предка, который не находится в статическом положении (position: static), поэтому если вы хотите, чтобы абсолютный вид располагался против данного родителя, установите родитель position to relative и ребенка position to absolute

попробуйте это, он работал для меня

.child {
    width: 100%;
    position: absolute;
    top: 0px;
    bottom: 0px;
    z-index: 1;
}

он установит дочернюю высоту на родительскую высоту

Comments

    Ничего не найдено.