Como posso enviar um <div> interno para a parte inferior do <div> pai?

184

A div dentro de outra imagem e código div abaixo. Porque haverá texto e imagens da div pai. E div vermelho será o último elemento da div pai.

texto alternativo

<div style="width: 200px; height: 150px; border: 1px solid black;">
    <div style="width: 100%; height: 50px; border: 1px solid red;">
    </div>
</div>
uzay95
fonte
Então, o código da div pai é logicamente colocado acima da div filho? As imagens e o texto são adicionados dinamicamente? Qual é a pergunta específica?
justkt

Respostas:

218

Esta é uma maneira

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

Mas como a div interna está posicionada absolutamente, você sempre terá que se preocupar com outro conteúdo na div externa sobrepondo-a (e sempre terá que definir alturas fixas).

Se você puder fazer isso, é melhor tornar essa div interna o último objeto DOM na sua div externa e configurá-la para "clear: both".

Jon Smock
fonte
1
Obrigado pela sua explicação e IE Hack (se não estiver errado, você adicionou ** width: 100% para IE Hack).
Ubay95
1
Não, a largura: 100% estava no seu original - não o adicionei.
Jon Smock
1
Eu tentei colocar em negrito as seções que mudei, mas o Markdown não se aplica a blocos de código :-P
Jon Smock
:) Na verdade eu não poderia começar como estamos cortando IE com símbolos, é por isso que eu pensei que é IE Hacking :)
uzay95
Lembre-se de que, se o contêiner pai estiver flutuando, essa abordagem não funcionará.
klewis
84

Uma maneira 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;
}

insira a descrição da imagem aqui

Editar:

Fonte - Guia Flexbox

Suporte do navegador para flexbox - Caniuse

Franklin Tarter
fonte
4
OMG, onde você esteve toda a minha vida [de programação]! ;) Eu amo que isso seja tão simples e não atrapalhe o posicionamento, e parece funcionar sobre todos os navegadores: caniuse.com/#feat=flexbox . Essa deve ser a solução e a resposta aceita para a programação moderna.
Sablefoste
1
Atualmente, o Flexbox é o "caminho mais fácil" e possui (quase) um ótimo suporte e documentação do navegador. Adicionando o link caniuse à resposta.
Franklin Tarter
80

Faça a div externa position="relative"e a div interna position="absolute"e defina-a bottom="0".

Fermin
fonte
8
e width=100%tambem
Kevin
6
Sim, isso funciona, mas o posicionamento absoluto quebra o "layout natural". A altura da div interna não será incluída como altura do pai e, à medida que a div externa se estreitar, você poderá ver sobreposição com outras coisas na div externa.
Ayush Gupta
15

Aqui está outro truque puro de CSS, que não afeta o fluxo de elementos.

#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
fonte
Impressionante, se não quiser definir uma altura na div principal! Obrigado!
quer
1
esta foi a melhor resposta para mim
Russell Chisholm
Ótimo! A outra solução flex moveu todo o meu conteúdo para fora do lugar, este isola o objeto que você deseja colocar na parte inferior do resto. Ótima solução!
Alejandro Aristizábal
8

Você pode não querer um posicionamento absoluto porque interrompe o reflow: em algumas circunstâncias, uma solução melhor é criar o elemento avô display:table;e o elemento pai display:table-cell;vertical-align:bottom;. Depois de fazer isso, você poderá fornecer os elementos filhos display:inline-block;e eles fluirão automaticamente para a parte inferior do pai.

Ansikt
fonte
8

Nota: Esta não é a melhor maneira possível de fazê-lo!

Situação : eu tinha que fazer o mesmo, só que não era possível adicionar divs extras; portanto, fiquei preso ao que tinha e, em vez de remover o innerHTML e criar outro via javascript quase como 2 renderizações, precisava ter o conteúdo no diretório inferior (barra animada).

Solução: Dado o quão cansado eu estava no momento, parece normal pensar em um método desse tipo, no entanto, eu sabia que tinha um elemento DOM pai do qual a altura da barra estava começando.

Em vez de mexer com o javascript, usei uma resposta CSS ( NÃO SEMPRE BOA IDÉIA )! :)

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

Sim, está correto. Em vez de posicionar o DOM, virei o pai de cabeça para baixo em css.

Para o meu cenário, vai funcionar! Possivelmente para outros também! Nenhuma chama! :)

Pogrindis
fonte
1
Esta pode não ser a melhor maneira possível de fazê-lo, mas é uma abordagem bastante impressionante e muito criativa. Hoje eu mesmo estou lutando com esse problema, meus principais pontos de discórdia: sem alturas definidas, deve ser completamente fluido (não há caracteres suficientes para explicar por que a exibição: a tabela não estava funcionando). Isso lidou com tudo lindamente; as imagens dentro da div também são invertidas quando isso acontece, então apenas usei a classe nesses elementos para invertê-las. Parece exatamente como deveria, sem alturas definidas. Um pouco hacky, mas ei, às vezes não há alternativa melhor. Bem feito!
tganyan
4

Aqui está uma maneira de evitar divs e tabelas absolutas se você souber a altura dos pais:

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

Exemplo

formatc
fonte
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
fonte