2012-03-16 4 views
6

Mi piacerebbe avere la larghezza di un div con posizione assoluta a seconda del suo contenuto piuttosto che del suo genitore. Ad esempio,La larghezza di div con posizione assoluta dipende dalla larghezza del suo genitore?

<div style="position:absolute"> 
<div style="position:absolute"> 
    <div style="position:absolute">Div in Div</div> 
</div> 
</div> 

causerà il ritorno a capo, come mostrato nella http://jsfiddle.net/ymgfN/2/

Sembra che la larghezza del div interno dipenderà dalla larghezza del suo genitore, anche se la sua posizione è assoluta. Ad esempio, se specificiamo la larghezza al suo genitore, funzionerà come previsto (nessuna parola a capo): http://jsfiddle.net/ymgfN/3/

Sfortunatamente, non posso specificare la larghezza del genitore in anticipo - alla fine avrò la sua larghezza a dipendere da i suoi figli. E, devo usare la posizione assoluta. È possibile in puro CSS?


Alcuni retroscena: Io non sto cercando di fare una pagina per compiere qualche disegno - So che è folle da avere tre posizione assoluta impilati per qualsiasi richiesta ragionevole. Piuttosto, sto facendo qualche esperimento per vedere se il posizionamento assoluto può essere un approccio generale per risolvere una serie di problemi di layout (layout complicato versatile che di solito richiede l'uso intelligente di static/absolute/float). Sfortunatamente, mi sono imbattuto in questo problema che renderà l'idea di usare la posizione assoluta ovunque stupida.

+0

Se si specifica la larghezza è elemento figlio allora genitore regolerà alla larghezza elemento figlio. Non sono sicuro che questo sia quello che stai cercando! .... – iDroid

risposta

15

L'elemento ottiene la sua larghezza e altezza prima dello viene rimosso dal flusso del documento. Quando si posiziona l'elemento esterno in modo assoluto, esso viene rimosso dal flusso e poiché non ha contenuto immediato, ha una larghezza di 0 e altezza di 0. Pertanto, un altro elemento di divisione al suo interno che tenta di aggiungere del testo eredita la larghezza del genitore di 0 Quindi espanderà solo la larghezza della parola più lunga per consentire il contenuto, quindi interromperà tutto su nuove linee. Dopo il, l'elemento viene rimosso dal flusso del documento da solo.

Quindi, per rispondere alla prima domanda, , un elemento posizionato in modo assoluto presta attenzione alle dimensioni dell'elemento principale se non si specifica una larghezza e/o altezza sull'elemento stesso. Sai quale dovrebbe essere la larghezza dei tuoi figli?

Per quanto riguarda la seconda domanda ... è possibile utilizzare white-space: nowrap. Non proprio un'ottima soluzione. Più preferibilmente, trova un modo migliore per organizzare il tuo contenuto in modo da non aver bisogno di tre elementi posizionati in modo assoluto annidati l'uno dentro l'altro. Dici che hai avere per usarli ... Davvero? È più probabile che tu non abbia trovato un modo migliore per farlo, ma questo è per un'altra domanda se scegli di intraprendere questa strada.

+0

Sì, lo spazio bianco impedisce il ritorno a capo di parole, ma è possibile avvolgere solo se lo schermo (cioè il corpo) non può tenerlo? Cioè, per avere l'effetto come se la larghezza del genitore fosse impostata al 100% (anche se non lo impostiamo veramente, piuttosto, imposta una proprietà CSS al figlio)? –

+0

@tomyeh: L'unico modo in cui riesco a pensare al momento è l'impostazione 'left: 0; right: 0' sugli elementi e quindi rimuovendo la proprietà 'right' ogni volta che si imposta la larghezza su di esso. – animuson

+0

+1. Stavo cercando spiegazioni (relative a [questo thread] (http://stackoverflow.com/questions/24713900/the-a-tag-content-goes-to-a-new-line/24714269#24714269)) sulla larghezza di bambini di elementi assolutamente posizionati e non trovato nessuno. Ci è voluto molto tempo prima di incappare in questo. Mi chiedo perché non arriva più in alto nella ricerca. La risposta deve essere accettata per quello? – Harry

5

Un elemento a livello di blocco con position: absolute o fixed viene automaticamente associato alla larghezza del relativo genitore se non è impostato un valore fisso width. Se non vuoi una larghezza fissa per l'elemento figlio, puoi efficacemente aggirarlo dandogli un valore molto elevato margin-right, ad es.

.inner-div { 
    position: absolute; 
    margin-right: -10000px; 
} 

Poi sua larghezza sarà vincolata alla larghezza del genitore meno il margine negativo, quindi in pratica dipende solo dal suo contenuto.

violino aggiornamento: http://jsfiddle.net/ymgfN/53/