Как я могу отправить внутренний <div> в конец его родительского <div>?

184

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

альтернативный текст

<div style="width: 200px; height: 150px; border: 1px solid black;">
    <div style="width: 100%; height: 50px; border: 1px solid red;">
    </div>
</div>
uzay95
источник
Так логически ли размещен код из родительского div над дочерним div? Изображения и текст добавляются динамически? Какой конкретный вопрос?
justkt

Ответы:

219

Это один из способов

<div style="position: relative; 
            width: 200px; 
            height: 150px; 
            border: 1px solid black;">

    <div style="position: absolute; 
                bottom: 0; 
                width: 100%; 
                height: 50px; 
                border: 1px solid red;">
    </div>
</div>

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

Если вы можете сделать это, лучше сделать этот внутренний div последним объектом DOM во внешнем div и установить для него значение «clear: both».

Джон Смок
источник
1
Спасибо за ваше объяснение и IE Hack (если я не ошибаюсь, вы добавили ** width: 100% для IE Hack).
uzay95
1
Нет, ширина: 100% было в вашем оригинале - я не добавил его.
Джон Смок
1
Я пытался выделить жирным шрифтом разделы, которые я изменил, но Markdown не применяется внутри блоков кода :-P
Jon Smock
:) На самом деле я не мог понять, как мы взламываем IE с помощью символов, поэтому я подумал, что это взлом IE :)
uzay95
Просто имейте в виду, что если родительский контейнер является плавающим, этот подход не будет работать.
Klewis
85

Флексбокс способ.

HTML:

<div class="parent">
  <div>Images, text, buttons oh my!</div>
  <div>Bottom</div>
</div>

CSS:

.parent {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

/*  not necessary, just to visualize it */

.parent {
  height: 500px;
  border: 1px solid black;
}


.parent div {
  border: 1px solid red;
}

введите описание изображения здесь

Редактировать:

Источник - Руководство Flexbox

Поддержка браузера для flexbox - Caniuse

Франклин Тартер
источник
4
OMG, где ты был всю мою [программирование] жизнь! ;) Мне нравится, что это так просто и не мешает позиционированию, и кажется, что оно работает почти во всех браузерах: caniuse.com/#feat=flexbox . Это должно быть решением и принятым ответом для современного программирования.
Саблефост
1
Flexbox обычно является «простым способом» в наши дни и имеет (почти) отличную поддержку браузера и документацию. Добавление ссылки caniuse к ответу.
Франклин Тартер
80

Сделайте внешний div position="relative"и внутренний div position="absolute"и установите его bottom="0".

Фермин
источник
8
и width=100%тоже.
Кевин
6
Да, это работает, но абсолютное позиционирование нарушает «естественную планировку». Высота внутреннего div не будет включена как высота родительского элемента, и когда внешний div сужается, вы можете увидеть совпадение с другими элементами внешнего div.
Аюш Гупта
15

Вот еще один чистый трюк CSS, который не влияет на поток элементов.

#parent {
  min-height: 100vh; /* set height as you need */
  display: flex;
  flex-direction: column;
  background: grey;
}
.child {
  margin-top: auto;
  background: green;
}
<div id="parent">
  <h1>Positioning with margin</h1>
  <div class="child">
    Content to the bottom
  </div>
</div>

R3gi
источник
Отлично, если вы не хотите устанавливать высоту родительского элемента div! Спасибо!
Йохан Нордли
1
это был лучший ответ для меня
Рассел Чишолм
Большой! Другое гибкое решение переместило весь мой контент с места, это изолирует объект, который вы хотите поместить внизу, от остальных. Отличное решение!
Алехандро Аристисабал
8

Возможно, вам не нужно абсолютное позиционирование, потому что оно нарушает перекомпоновку: в некоторых случаях лучшим решением является создание элемента grandparent display:table;и родительского элемента display:table-cell;vertical-align:bottom;. После этого вы сможете передать дочерние элементы, display:inline-block;и они будут автоматически перетекать к нижней части родительского элемента.

Ansikt
источник
8

Примечание: это ни в коем случае не лучший способ сделать это!

Ситуация : мне нужно было сделать то же самое, только я не смог добавить никаких дополнительных div, поэтому я застрял с тем, что у меня было, и вместо того, чтобы удалить innerHTML и создать другой с помощью javascript, почти как 2 рендера, мне нужно было иметь контент на дно (анимированная полоса).

Решение: Учитывая то, как я устал в то время, кажется нормальным даже думать о таком методе, однако я знал, что у меня есть родительский элемент DOM, с которого начинается высота бара.

Вместо того, чтобы возиться с javascript, я использовал CSS-ответ ( НЕ ВСЕГДА ХОРОШАЯ ИДЕЯ )! :)

-moz-transform:rotate(180deg);
-webkit-transform:rotate(180deg);
-ms-transform:rotate(180deg);

Да, это правильно, вместо того, чтобы позиционировать DOM, я перевернул его родителя в css.

По моему сценарию это сработает! Возможно, и для других! Нет пламени! :)

Pogrindis
источник
1
Возможно, это не самый лучший способ сделать это, но это довольно удивительный, очень креативный подход. Я сам уже некоторое время боролся с этой проблемой, мои главные претензии: отсутствие заданных высот, должно быть абсолютно плавно (недостаточно символов, чтобы объяснить, почему отображение: таблица не работала). Это обрабатывало все красиво; изображения внутри div также переворачиваются, когда это происходит, поэтому я просто использовал класс этих элементов, чтобы перевернуть их обратно. Выглядит точно так, как должно, без заданных высот. Немного глупо, но эй, иногда нет лучшей альтернативы. Отлично сработано!
tganyan
4

Вот способ избежать абсолютных элементов div и таблиц, если вы знаете рост родителей:

<div class="parent">
    <div class="child"> <a href="#">Home</a>
    </div>
</div>

CSS:

.parent {
    line-height:80px;
    border: 1px solid black;
}
.child {
    line-height:normal;
    display: inline-block;
    vertical-align:bottom;
    border: 1px solid red;
}

JsFiddle:

пример

formatc
источник
0
<div style="width: 200px; height: 150px; border: 1px solid black;position:relative">
    <div style="width: 100%; height: 50px; border: 1px solid red;position:absolute;bottom:0">
    </div>
</div>
ЯegDwight
источник