¿Cómo puedo enviar un <div> interno al fondo de su padre <div>?

184

El div dentro de otra imagen div y el código a continuación. Porque habrá texto e imágenes del div padre. Y el div rojo será el último elemento del div padre.

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
fuente
Entonces, ¿el código del div primario se coloca lógicamente sobre el div secundario? ¿Se agregan dinámicamente las imágenes y el texto? ¿Cuál es la pregunta específica?
justkt

Respuestas:

218

Esta es una forma

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

Pero debido a que el div interno está posicionado absolutamente, siempre tendrá que preocuparse por otro contenido en el div externo que se superponga (y siempre tendrá que establecer alturas fijas).

Si puede hacerlo, es mejor hacer que ese div interno sea el último objeto DOM en su div externo y configurarlo en "clear: both".

Jon Smock
fuente
1
Gracias por su explicación y IE Hack (si no me equivoco, agregó ** ancho: 100% para IE Hack).
uzay95
1
No, el ancho: el 100% estaba allí en tu original, no lo agregué.
Jon Smock el
1
Traté de poner en negrita las secciones que cambié, pero el Markdown no se aplica dentro de los bloques de código :-P
Jon Smock
:) En realidad, no pude entender cómo estamos hackeando IE con símbolos, por eso pensé que era IE Hacking :)
uzay95
Solo tenga en cuenta que si el contenedor principal está flotando, este enfoque no funcionará.
klewis
85

Una forma 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;
}

ingrese la descripción de la imagen aquí

Editar:

Fuente - Guía de Flexbox

Soporte de navegador para flexbox - Caniuse

Franklin Tarter
fuente
44
Dios mío, ¿dónde has estado toda mi vida [de programación]! ;) Me encanta que esto sea tan simple y no interfiera con el posicionamiento, y parece funcionar en todos los navegadores: caniuse.com/#feat=flexbox . Esta debería ser la solución y la respuesta aceptada para la programación moderna.
Sablefoste
1
Flexbox es generalmente la "forma fácil" en estos días y tiene (casi) excelente soporte y documentación del navegador. Agregar el enlace caniuse a la respuesta.
Franklin Tarter
80

Haga el div externo position="relative"y el div interno position="absolute"y configúrelo bottom="0".

Fermín
fuente
8
y width=100%tambien
Kevin
66
Sí, esto funciona, pero el posicionamiento absoluto rompe el "diseño natural". La altura del div interno no se incluirá como la altura del padre y a medida que el div externo se estrecha, es posible que se superponga con otras cosas en el div externo.
Ayush Gupta
15

Aquí hay otro truco de CSS puro, que no afecta el flujo 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
fuente
¡Impresionante si no quieres establecer una altura en el div padre! ¡Gracias!
Johan Nordli
1
esta fue la mejor respuesta para mí
Russell Chisholm
¡Excelente! La otra solución flexible movió todo mi contenido fuera de lugar, esta aísla el objeto que desea colocar en la parte inferior del resto. Gran solución!
Alejandro Aristizábal
8

Es posible que no desee un posicionamiento absoluto porque rompe el reflujo: en algunas circunstancias, una mejor solución es hacer que el elemento abuelo display:table;y el elemento padre display:table-cell;vertical-align:bottom;. Después de hacer esto, deberías poder darle elementos secundarios display:inline-block;y estos fluirán automáticamente hacia la parte inferior del elemento primario.

Ansikt
fuente
8

Nota: ¡Esta no es la mejor manera de hacerlo!

Situación : tuve que hacer lo mismo, solo que no pude agregar ningún div extra, por lo tanto, me quedé con lo que tenía y en lugar de eliminar innerHTML y crear otro a través de javascript casi como 2 renders, necesitaba tener el contenido en el abajo (barra animada).

Solución: Dado lo cansado que estaba en ese momento, parece normal incluso pensar en un método de este tipo, sin embargo, sabía que tenía un elemento DOM principal desde el que comenzaba la altura de la barra.

En lugar de jugar con el javascript, ¡utilicé una respuesta CSS ( NO SIEMPRE BUENA IDEA )! :)

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

Sí, eso es correcto, en lugar de colocar el DOM, volví a su padre al revés en css.

¡Para mi escenario funcionará! ¡Posiblemente para otros también! No Flame! :)

Pogrindis
fuente
1
Puede que esta no sea la mejor manera de hacerlo, pero este es un enfoque bastante increíble y muy creativo. Yo mismo he estado luchando este problema durante un tiempo hoy, mis principales puntos de conflicto: sin alturas establecidas, deben ser completamente fluidas (no hay suficientes caracteres para explicar por qué la pantalla: la tabla no funcionaba). Esto manejó todo maravillosamente; las imágenes dentro del div también se voltean cuando esto sucede, así que solo usé la clase en esos elementos para voltearlas. Se ve exactamente como debería, sin alturas establecidas. Un poco hacky pero bueno, a veces no hay mejor alternativa. ¡Bien hecho!
tganyan
4

Aquí hay una manera de evitar divisiones y tablas absolutas si conoce la altura de los padres:

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

Ejemplo

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