Come posso inviare un <div> interno alla fine del <div> principale?


184

Il div all'interno di un'altra immagine div e codice di seguito. Perché ci saranno testo e immagini del div genitore. E il div rosso sarà l'ultimo elemento del div parent.

testo alternativo

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

Quindi il codice del div del genitore si trova logicamente sopra il div del figlio? Le immagini e il testo vengono aggiunti in modo dinamico? Qual è la domanda specifica?
appena dal

Risposte:


218

Questo è un modo

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

Ma poiché il div interno è posizionato in modo assoluto, dovrai sempre preoccuparti di altri contenuti nel div esterno che si sovrappongono (e dovrai sempre impostare altezze fisse).

Se riesci a farlo, è meglio rendere quel div interno l'ultimo oggetto DOM nel div esterno e impostarlo su "clear: both".


1
Grazie per la tua spiegazione e IE Hack (se non sbaglio hai aggiunto ** larghezza: 100% per IE Hack).
uzay95,

1
No, la larghezza: il 100% era presente nel tuo originale - non l'ho aggiunto.
Jon Smock,

1
Ho provato a mettere in grassetto le sezioni che ho modificato, ma il Markdown non si applica all'interno dei blocchi di codice :-P
Jon Smock,

:) In realtà non sono riuscito a capire come stiamo hackerando IE con i simboli, ecco perché ho pensato che fosse IE Hacking :)
uzay95

Basta tenere presente che se il contenitore padre è mobile, questo approccio non funzionerà.
Klewis,

85

Un modo flessibile.

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

inserisci qui la descrizione dell'immagine

Modificare:

Fonte - Guida Flexbox

Supporto browser per flexbox - Caniuse


4
OMG, dove sei stata tutta la mia vita [programmativa]! ;) Adoro il fatto che sia così semplice e non si scherzi con il posizionamento, e sembra funzionare solo in tutti i browser: caniuse.com/#feat=flexbox . Questa dovrebbe essere la soluzione e la risposta accettata per la programmazione moderna.
Sablefoste,

1
Oggigiorno Flexbox è di solito il "modo semplice" e offre (quasi) un ottimo supporto e documentazione per i browser. Aggiunta del link caniuse alla risposta.
Franklin Tarter,

80

Crea il div esterno position="relative"e il div interno position="absolute"e impostalo bottom="0".


8
e width=100%anche.
Kevin,

6
Sì, funziona ma il posizionamento assoluto rompe il "layout naturale". L'altezza del div interno non verrà inclusa come altezza del genitore e man mano che il div esterno si restringe, potresti vedere una sovrapposizione con altre cose nel div esterno.
Ayush Gupta,

15

Ecco un altro trucco CSS puro, che non influenza un flusso di elementi.

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


Fantastico se non vuoi impostare un'altezza sul div genitore! Grazie!
Johan Nordli

1
questa è stata la migliore risposta per me
Russell Chisholm il

Grande! L'altra soluzione flessibile ha spostato tutti i miei contenuti fuori posto, questo isola l'oggetto che vuoi mettere in fondo al resto. Ottima soluzione!
Alejandro Aristizábal,

8

Potresti non voler un posizionamento assoluto perché interrompe il riflusso: in alcune circostanze, una soluzione migliore è quella di rendere l'elemento nonno display:table;e l'elemento genitore display:table-cell;vertical-align:bottom;. Dopo averlo fatto, dovresti essere in grado di fornire gli elementi figlio display:inline-block;e questi fluiranno automaticamente verso il fondo del genitore.


8

Nota: questo non è affatto il modo migliore per farlo!

Situazione : dovevo fare la stessa cosa solo che non ero in grado di aggiungere altri div extra, quindi ero bloccato con quello che avevo e piuttosto che rimuovere innerHTML e crearne un altro tramite javascript quasi come 2 rendering avevo bisogno di avere il contenuto al in basso (barra animata).

Soluzione: dato quanto ero stanco al momento sembra normale pensare a un metodo del genere, tuttavia sapevo di avere un elemento DOM padre da cui iniziava l'altezza della barra.

Invece di fare confusione con il javascript, ho usato una risposta CSS ( NON SEMPRE BUONA IDEA )! :)

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

Sì, è corretto, invece di posizionare il DOM, ho capovolto il suo genitore in CSS.

Per il mio scenario funzionerà! Forse anche per gli altri! No Flame! :)


1
Questo potrebbe non essere il modo migliore per farlo, ma questo è un approccio davvero fantastico, molto creativo. Io stesso ho affrontato questo problema per un po 'di oggi, i miei principali punti critici: nessuna altezza impostata, deve essere completamente fluido (non abbastanza caratteri per spiegare perché visualizzare: tabella non funzionava). Questo ha gestito tutto magnificamente; anche le immagini all'interno del div vengono capovolte quando ciò accade, quindi ho usato la classe su quegli elementi per capovolgerli. Sembra esattamente come dovrebbe, senza altezze fisse. Un po 'confuso ma ehi, a volte non c'è alternativa migliore. Molto bene!
tganyan,

4

Ecco un modo per evitare div e tabelle assolute se conosci l'altezza dei genitori:

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

Esempio


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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.