Як я можу надіслати внутрішній <div> на дно його батьківського <div>?


184

Діл всередині іншого зображення дива та коду нижче. Тому що там будуть текст та зображення батьківського діва. І червоний div буде останнім елементом батьківського діла.

alt текст

<div style="width: 200px; height: 150px; border: 1px solid black;">
    <div style="width: 100%; height: 50px; border: 1px solid red;">
    </div>
</div>

Тож чи логічно розміщений код з батьківського діва над дочірнім дівом? Чи динамічно додаються зображення та текст? Яке конкретне питання?
justkt

Відповіді:


218

Це один із способів

<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, що перекриває його (і вам завжди доведеться встановлювати фіксовану висоту).

Якщо ви можете це зробити, краще зробити цей внутрішній поділ останнім об’єктом DOM у вашому зовнішньому div і встановити його на "ясно: обидва".


1
Дякуємо за ваше пояснення та IE Hack (якщо я не помиляюся, ви додали ** ширина: 100% для IE Hack).
uzay95

1
Ні, ширина: 100% була там у вашому оригіналі - я її не додав.
Джон Смок

1
Я спробував жирно змінити розділи, які я змінив, але Markdown не застосовується до кодових блоків :-P
Джон Смок

:) Насправді я не міг зрозуміти, як ми зломляємо IE із символами, ось чому я подумав, що це IE Hacking :)
uzay95

Тільки майте на увазі, що якщо батьківський контейнер плаває, такий підхід не буде працювати.
klewis

84

Flexbox спосіб.

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 . Це має бути рішенням і прийнятою відповіддю для сучасного програмування.
Sablefoste

1
Сьогодні Flexbox - це "простий спосіб", який має (майже) чудову підтримку браузера та документацію. Додавання посилання на канюзу до відповіді.
Франклін Тартер

80

Зробіть зовнішній дів position="relative"та внутрішній дів position="absolute"та встановіть його bottom="0".


8
і width=100%теж.
Кевін

6
Так, це працює, але абсолютне позиціонування порушує "природне розташування". Висота внутрішньої діви не буде включатися як батьківська висота, і оскільки зовнішній дів стає більш вузьким, ви можете побачити накладення з іншими речами у зовнішньому розділі.
Айуш Гупта

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>


Дивовижний, якщо ви не хочете встановити висоту на батьківському діві! Дякую!
Йохан Нордлі

1
це була найкраща відповідь для мене
Рассел Чизгольм

Чудово! Інше флекс-рішення перемістило весь мій вміст з місця, цей ізолює предмет, який ви хочете поставити внизу, від решти. Чудове рішення!
Алехандро Арістібабаль

8

Можливо, ви не хочете абсолютного позиціонування, оскільки воно порушує поповнення: в деяких умовах краще рішення - зробити елемент бабусі display:table;та бабусі та батьківський елемент display:table-cell;vertical-align:bottom;. Зробивши це, ви повинні мати можливість дати дитині елементи, display:inline-block;і вони автоматично перетікають до нижньої частини батьків.


8

Примітка. Це далеко не найкращий спосіб зробити це!

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

Рішення: З огляду на те, наскільки я втомився в той час, здається, нормально навіть думати про такий метод, проте я знав, що у мене є батьківський елемент DOM, з якого починається висота планки.

Замість того, щоб більше возитися з javascript, я використав відповідь CSS ( НЕ ВСЕ ДОБРО ІДЕЯ )! :)

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

Так, це правильно, замість того, щоб розташувати DOM, я повернув його батьків догори дном в css.

За моїм сценарієм це буде працювати! Можливо і для інших! Без полум'я! :)


1
Це може бути не найкращим можливим способом, але це досить приголомшливий, дуже креативний підхід. Сьогодні я вже довгий час боровся з цим питанням, мої основні моменти: не встановлені висоти, повинні бути повністю текучими (недостатньо символів, щоб пояснити, чому дисплей: таблиця не працювала). Це впоралося з усім прекрасно; зображення всередині div також перегортаються, коли це відбувається, тому я просто використав клас на цих елементах, щоб повернути їх назад. Виглядає саме так, як слід, без встановленої висоти. Трохи гакітний, але ей, іноді немає кращої альтернативи. Молодці!
tganyan

4

Ось спосіб уникнути абсолютних знаків та таблиць, якщо ви знаєте зріст батьків:

<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:

Приклад


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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.