Rendi il bambino visibile al di fuori di un overflow: genitore nascosto


100

In CSS overflow:hiddenè impostato sui contenitori padre per consentirne l'espansione con l'altezza dei loro figli fluttuanti.

Ma ha anche un'altra caratteristica interessante se combinato con margin: auto...

Se il fratello PRECEDENTE è un elemento fluttuante, apparirà effettivamente giustapposto ad esso. Cioè, se il fratello è, float:leftil contenitore con float:none overflow:hiddenapparirà a destra del fratello, senza una nuova riga, proprio come se fluttuasse nel flusso normale. Se il fratello precedente lo è, float:rightil contenitore apparirà a sinistra del fratello. Il ridimensionamento di questo contenitore lo mostrerà accuratamente centrato tra gli elementi mobili. Supponiamo che se hai due fratelli precedenti, uno float:leftsull'altro float:right, il contenitore apparirà centrato tra i due.

Quindi ecco il problema ...

Come mantengo quel tipo di layout SENZA mascherare i bambini?

Googling in tutto il Web mi dà modi su come clear:bothed espandere un contenitore ... ma non riesco a trovare alcuna soluzione alternativa per mantenere la centratura sinistra / destra del bambino precedente. Se crei il contenitore, overflow:visibleil contenitore ignora improvvisamente il flusso di layout degli elementi fluttuanti e appare stratificato sopra l'elemento fluttuante.

Quindi domanda :

Devo avere il contenitore overflow:hiddenper preservare il layout ...

come posso fare in modo che i bambini non siano mascherati? Ho bisogno che il bambino sia assolutamente posizionato rispetto al genitore fuori dal contenitore.

O

Come faccio in overflow:visiblemodo da poter assolutamente posizionare un figlio rispetto al genitore fuori dal contenitore ... ANCORA preservare il flusso di layout simile a un galleggiante fratello?

Risposte:


86

Puoi usare clearfixper fare "preservare il layout" allo stesso modo overflow: hidden.

.clearfix:before,
.clearfix:after {
    content: ".";    
    display: block;    
    height: 0;    
    overflow: hidden; 
}
.clearfix:after { clear: both; }
.clearfix { zoom: 1; } /* IE < 8 */

aggiungi class="clearfix"classe al genitore e rimuovioverflow: hidden;


Hmm! Intelligente, lo sto sperimentando solo ora. Quello che sto ottenendo attualmente è che il contenuto generato si comporta correttamente, essendo preservato nel flusso del layout, tuttavia il genitore lo ignorerà ancora e si sovrapporrà agli elementi mobili. Tuttavia, questa è un'ottima idea e ci giocherò di più per vedere se riesco a farlo comportare correttamente e tornare a votare. Grazie :).
marknadal

@ user1671639 il tuo esempio non si applica realmente per una clearfix. Hai bisogno di qualcos'altro, quindi ti suggerisco di pubblicare una domanda con il tuo problema.
Frexuz

Questo non funziona affatto allo stesso modo overflow:hidden. L'applicazione di un clearfix al div genitore non consente a tutti i componenti figlio di essere "contenuti all'interno" della stessa altezza del genitore.
Khom Nazid

11

Nessuna delle risposte pubblicate ha funzionato per me. position: absoluteTuttavia, l' impostazione per l'elemento figlio ha funzionato.


18
Ma il DIV genitore non lo maschererebbe se andasse oltre i confini del DIV genitore (che ha overflow: nascosto)?
marknadal

9
Afaik no, fintanto che il genitore non ha una posizione: relativa. Quindi il bambino viene posizionato rispetto al suo primo elemento antenato posizionato (non statico), estraendolo dal flusso dom regolare (genitore).
Pim Schaaf

Se il genitore ha position: relative e non lo richiede puoi renderlo position: unset.
yeahlad

Vero, se è position: fixedo è posizionato in modo assoluto rispetto a qualcosa al di fuori del genitore che ha visibility: hidden, sarà visibile. Tuttavia, spesso è necessario (si desidera) posizionarlo rispetto al genitore per essere più robusto alle modifiche al codice. Quindi queste soluzioni non sono un'alternativa.
ArneHugo,

10

Questa è una vecchia domanda, ma l'ho riscontrata io stesso.

Ho semi-soluzioni che funzionano in base alla situazione per la domanda precedente ("Bambini visibili in overflow: genitore nascosto")

Se il div genitore non ha bisogno di essere position: relative, imposta semplicemente gli stili figli su visibile: visibile.

Se il div genitore deve essere position: relative, l'unico modo che ho trovato per mostrare i figli era position: fixed. Questo ha funzionato per me nella mia situazione fortunatamente, ma immagino che non funzionerebbe negli altri.

Ecco un esempio schifoso da visualizzare in un file html.

<div style="background: #ff00ff; overflow: hidden; width: 500px; height: 500px; position: relative;">
    <div style="background: #ff0000;position: fixed; top: 10px; left: 10px;">asd
        <div style="background: #00ffff; width: 200px; overflow: visible; position: absolute; visibility: visible; clear:both; height: 1000px; top: 100px; left: 10px;"> a</div>
    </div>
</div>

Ecco un esempio schifoso da visualizzare in un file html. <code> <div style = "background: # ff00ff; overflow: hidden; width: 500px; height: 500px; position: relative;"> <div style = "background: # ff0000; position: fixed; top: 10px; left : 10px; "> asd <div style =" background: # 00ffff; larghezza: 200 px; overflow: visibile; posizione: assoluta; visibilità: visibile; chiaro: entrambi; altezza: 1000 px; in alto: 100 px; sinistra: 10 px; "> a </div> </div> </div> </code>
Thomas Davis

4
Grazie per aver provato a rispondere, ma questo non funziona perché la posizione fissa posiziona automaticamente l'elemento rispetto alla visualizzazione, il che significa che non si sposta con il genitore. In effetti, se hai una pagina a scorrimento, rimarrà a 10px, 10px mentre scorri.
marknadal

"Se il div genitore deve essere position: relative, l'unico modo che ho trovato per mostrare i figli era position: fixed." Grazie per quello. Ho avuto una bolla di aiuto popover che doveva traboccare anche se il genitore aveva overflow: scorrere. Ho finito per avere un div assoluto, con un'area interna relativa e quindi un'area di contenuto fissa.
JackMorrissey

Grazie, ha funzionato per me. Avevo un genitore con posizione relativa, ed era necessario perché la sua posizione era impostata utilizzando left. Usare margin-leftinvece avrebbe ottenuto lo stesso effetto, quindi non ho più bisogno di usare la posizione relativa.
Felipe Castro

1

Per altri, se clearfix non risolve questo problema, aggiungi margini al fratello non flottato che è / sono gli stessi della larghezza del fratello flottato.

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.