131 votes

Rendre l'enfant visible en dehors d'un parent overflow:hidden

En CSS, le overflow:hidden est définie sur les conteneurs parents afin de leur permettre de s'étendre avec la hauteur de leurs enfants flottants.

Mais il présente également une autre caractéristique intéressante lorsqu'il est associé à margin: auto ...

Si le frère ou la sœur PRÉCÉDENT(E) est un élément flottant, il ou elle lui sera juxtaposé(e). C'est-à-dire que si le frère ou la sœur est float:left puis le conteneur avec float:none overflow:hidden apparaîtra à droite de son frère, sans nouvelle ligne - comme s'il flottait dans le flux normal. Si le frère ou la sœur précédent(e) est float:right alors le conteneur apparaîtra à la gauche du frère ou de la sœur. Le redimensionnement de ce conteneur le fera apparaître centré entre les éléments flottants. Disons que si vous avez deux éléments frères et sœurs précédents, un float:left l'autre float:right le conteneur apparaîtra centré entre les deux.

Voici donc le problème ...

Comment maintenir ce type de disposition SANS masquer les enfants ?

En cherchant sur le web, je trouve des moyens de clear:both et développer un conteneur... mais je ne trouve pas de solution alternative pour maintenir le centrage gauche/droite des enfants précédents. Si vous faites en sorte que le conteneur overflow:visible le conteneur ignore soudainement le flux de mise en page des éléments flottants et apparaît en couches au-dessus de l'élément flottant.

Alors question :

Je dois avoir le conteneur overflow:hidden pour préserver la mise en page...

comment faire pour que les enfants ne soient pas masqués ? J'ai besoin que l'enfant soit absolument positionné par rapport au parent à l'extérieur du conteneur.

O

Comment puis-je overflow:visible afin que je puisse absolument positionner un enfant par rapport au parent à l'extérieur du conteneur... MAIS préserver le flux d'affichage flottant de l'enfant ?

94voto

Frexuz Points 1693

Vous pouvez utiliser le clearfix pour faire la "préservation de la mise en page" de la même manière overflow: hidden fait.

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

ajouter class="clearfix" au parent, et supprimer la classe overflow: hidden;

0 votes

Hmm ! Intelligent, je suis en train de l'expérimenter. Ce que j'obtiens actuellement, c'est que le contenu généré se comporte correctement, étant préservé dans le flux de la mise en page, mais le parent l'ignore toujours et se superpose aux éléments flottants. Cependant, c'est une très bonne idée et je vais jouer avec plus pour voir si je peux obtenir un comportement correct, et revenir pour voter. Merci :).

0 votes

@user1671639 votre exemple ne s'applique pas vraiment pour un clearfix. Vous avez besoin d'autre chose, je vous suggère donc de poster une question avec votre problème.

2 votes

Cela ne fonctionne pas de la même manière que overflow:hidden du tout. L'application d'un clearfix à la division parent ne permet pas à tous les composants enfants d'être "contenus" à la même hauteur que le parent.

15voto

Thomas Davis Points 1633

C'est une vieille question, mais je l'ai rencontrée moi-même.

J'ai des semi-solutions qui fonctionnent de manière situationnelle pour la première question("Enfants visibles dans le parent overflow:hidden")

Si la division parent n'a pas besoin d'être position:relative, il suffit de définir les styles des enfants sur visibility:visible.

Si le div parent doit être position:relative, la seule façon possible que j'ai trouvée pour montrer les enfants était position:fixed. Cela a fonctionné pour moi dans ma situation, heureusement, mais j'imagine que cela ne fonctionnerait pas pour d'autres.

Voici un exemple minable qu'il suffit de poster dans un fichier html pour le visualiser.

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

0 votes

Voici un exemple minable qu'il suffit de poster dans un fichier html pour le visualiser. <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; width: 200px; overflow: visible; position: absolute; visibility: visible; clear:both; height: 1000px; top: 100px; left: 10px;"> a</div></div> </div> </code>

5 votes

Merci d'avoir essayé de répondre, mais cela ne fonctionne pas parce que la position fixe positionne automatiquement l'élément par rapport à la fenêtre d'affichage, ce qui signifie qu'elle fait no déménager avec le parent. En fait, si vous avez une page défilante, elle restera à 10px,10px lorsque vous la ferez défiler.

0 votes

"Si la div parent doit effectivement être position:relative, la seule façon possible que j'ai trouvée pour montrer les enfants était position:fixed." Merci pour cela. J'avais une bulle d'aide popover qui devait déborder même si le parent avait overflow : scroll. J'ai fini par avoir un div absolu, avec un inner relatif, puis une zone de contenu fixe.

15voto

reflexiv Points 804

Aucune des réponses affichées n'a fonctionné pour moi. Réglage de position: absolute pour l'élément enfant a toutefois fonctionné.

36 votes

Mais le DIV parent ne le masquerait-il pas s'il dépassait les limites du DIV parent (qui a un overflow:hidden) ?

10 votes

A priori, ce n'est pas le cas, tant que le parent n'a pas position:relative. Dans ce cas, l'enfant est positionné par rapport à son premier élément ancêtre positionné (non statique), ce qui le sort du flux normal du dom (du parent).

0 votes

Si le parent a position:relative et ne l'exige pas, vous pouvez le rendre position:unset.

2voto

Walf Points 885

Pour les autres, si clearfix ne résout pas le problème pour vous, ajoutez des marges à la fratrie non flottante qui sont les mêmes que la ou les largeurs de la ou des fratries flottantes.

0voto

Erisan Olasheni Points 585

La réponse de Kunal était correcte mais comporte une erreur de syntaxe et l'éditer ne semble pas fonctionner.

Pour les autres, si cela ne fonctionne pas, essayez de donner de la hauteur en vh dans le composant où vous avez besoin de la barre de défilement.

Note : Cette fonctionnalité CSS est expérimentale, non normalisée et peut ne fonctionner que sur les navigateurs Webkit. Voir https://caniuse.com/css-overflow-overlay

.parent {
     overflow: hidden;
}

.child {
     overflow: overlay;
     height: 100vh;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X