CSS: как расположить два элемента друг над другом, не указывая высоту?
у меня есть два дива, которые мне нужно расположить точно друг на друга. Однако, когда я это делаю, форматирование становится все испорчено, потому что содержащий DIV действует так, как будто нет высоты. Я думаю, что это ожидаемое поведение с position:absolute но мне нужно найти способ расположить эти два элемента друг над другом и растянуть контейнер по мере растягивания содержимого:
верхний левый край .layer2 должны быть точно выровнены по верхнему левому краю layer1
<!-- HTML -->
<div class="container_row">
<div class="layer1">
Lorem ipsum...
</div>
<div class="layer2">
More lorem ipsum...
</div>
</div>
<div class="container_row">
...same HTML as above. This one should never overlap the .container_row above.
</div>
/* CSS */
.container_row {}
.layer1 {
position:absolute;
z-index: 1;
}
.layer2 {
position:absolute;
z-index: 2;
}
8 ответов:
прежде всего, вы действительно должны включать позицию на абсолютно позиционированных элементах, или вы столкнетесь с нечетным и запутанным поведением; вы, вероятно, хотите добавить
top: 0; left: 0в CSS для обоих ваших абсолютно позиционированных элементов. Вы также хотите иметьposition: relativeon.container_rowЕсли вы хотите, чтобы абсолютно позиционированные элементы были расположены в отношении их родителя, а не тела документа:если элемент имеет позицию: абсолютный', содержащий блок устанавливается ближайшим предком с "положением ""абсолютного", "относительного" или "фиксированного"...
ваша проблема в том, что
position: absoluteудаляет элементы из нормального потока:он полностью удаляется из нормального потока (он не влияет на более поздних братьев и сестер). Абсолютно позиционированная коробка устанавливает новый содержащий блок для нормальных детей потока и абсолютно (но не фиксированный) позиционируется потомки. Однако содержимое абсолютно позиционированного элемента не обтекает никакие другие коробки.
это означает, что абсолютно позиционированные элементы не имеют никакого влияния на размер их родительского элемента и ваш первый
<div class="container_row">будет иметь нулевую высоту.таким образом, вы не можете делать то, что вы пытаетесь сделать с абсолютно расположенными элементами, если вы не знаете, насколько они будут высокими (или, что эквивалентно, вы можете указать их высоту). Если вы можете укажите высоты, то вы можете поставить те же высоты на
.container_rowи все будет выстраиваться; вы также можете поставитьmargin-topна втором.container_rowоставить место для абсолютно позиционированных элементов. Например:
отличный ответ,"му слишком короткий". Я искал то же самое, и после прочтения Вашего сообщения я нашел решение, которое соответствовало моей проблеме.
У меня было два элемента одинакового размера и я хотел их сложить. Поскольку каждый из них имеет одинаковый размер, то что я мог сделать, это сделать
position: absolute; top: 0px; left: 0px;только на последнем элементе. Таким образом, первый элемент вставляется правильно, "толкая" высоту родителей, а второй элемент помещается сверху.
надеется, что это помогает другим людям, пытающимся укладывать элементы 2+ с одинаковой (неизвестной) высотой.
Я должен был поставить
Container_height = Element1_height = Element2_height
.Container { position: relative; } .ElementOne, .Container ,.ElementTwo{ width: 283px; height: 71px; } .ElementOne { position:absolute; } .ElementTwo{ position:absolute; }использовать можно использовать z-индекс, чтобы установить, какой из них должен быть сверху.
на самом деле это возможно без установки
absoluteи указание любой высоты. Все, что вам нужно сделать, это использоватьdisplay: gridна родительский элемент и поместить потомков в той же строке и столбце.пожалуйста, проверьте пример ниже, на основе вашего HTML. Я добавил только
<span>и некоторые цвета, так что вы можете видеть результат.вы также можете легко изменить
z-indexкаждый из потомков элементов, чтобы манипулировать его видимостью..container_row{ display: grid; } .layer1, .layer2{ grid-column: 1; grid-row: 1; } .layer1 span{ color: #fff; background: #000cf6; } .layer2{ background: rgba(255, 0, 0, 0.4); }<div class="container_row"> <div class="layer1"> <span>Lorem ipsum...</span> </div> <div class="layer2"> More lorem ipsum... </div> </div> <div class="container_row"> ...same HTML as above. This one should never overlap the .container_row above. </div>
из-за абсолютного позиционирования удаление элементов из положения потока документов: absolute не является правильным инструментом для работы. В зависимости от точного макета, который вы хотите создать, Вы будете успешны, используя отрицательные поля, положение:относительное или, возможно, даже преобразование: перевод. Покажите нам пример того, что вы хотите сделать, мы можем помочь вам лучше.
конечно, проблема заключается в том, чтобы вернуть свой рост. Но как вы можете это сделать, если вы не знаете высоту заранее? Ну, если вы знаете, какое соотношение сторон вы хотите дать контейнеру (и сохранить его отзывчивым), вы можете вернуть свою высоту, добавив дополнение к другому дочернему контейнеру, выраженное в процентах.
вы даже можете добавить фиктивную
divв контейнер и установить что-то вродеpadding-top: 56.25%чтобы дать фиктивному элементу высоту, которая является пропорцией ширины контейнера. Это будет толкать контейнер и дать ему соотношение сторон, в данном случае 16:9 (56.25%).заполнение и маржа используют процент ширины, это действительно трюк здесь.
после долгих испытаний я проверил, что исходный вопрос уже прав; отсутствует только несколько настроек:
- the
container_rowдолжно бытьposition: relative;- дети (...), Должно быть
position: absolute; left:0;- чтобы убедиться, что дети (...) выровняйте точно над Одином другого,
container_rowдолжен иметь дополнительный стиль:
height:x; line-height:x; vertical-align:middle;text-align:center;может, также, помочь.
вот еще одно решение с использованием display: flex вместо position: absolute или display: grid.
.container_row{ display: flex; } .layer1 { width: 100%; background-color: rgba(255,0,0,0.5); // red } .layer2{ width: 100%; margin-left: -100%; background-color: rgba(0,0,255,0.5); // blue }<div class="container_row"> <div class="layer1"> <span>Lorem ipsum...</span> </div> <div class="layer2"> More lorem ipsum... </div> </div> <div class="container_row"> ...same HTML as above. This one should never overlap the .container_row above. </div>
Comments