Сделать абсолютно позиционированных 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.
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; }
" вы либо используете фиксированные высоты, либо вам нужно задействовать 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), поэтому если вы хотите, чтобы абсолютный вид располагался против данного родителя, установите родительpositiontorelativeи ребенкаpositiontoabsolute
попробуйте это, он работал для меня
.child { width: 100%; position: absolute; top: 0px; bottom: 0px; z-index: 1; }он установит дочернюю высоту на родительскую высоту
Comments