J'ai un conteneur div
avec deux enfants. Le premier enfant a une taille donnée. Comment faire en sorte que le deuxième enfant occupe «l'espace libre» du conteneur div
sans donner une hauteur précise?
Dans l'exemple, le rose div
doit également occuper l'espace blanc.
Similaire à cette question: Comment faire en sorte que div occupe la hauteur restante?
Mais je ne veux pas donner une position absolue .
Réponses:
L'extension de l'
#down
enfant pour remplir l'espace restant de#container
peut être réalisée de différentes manières en fonction du support du navigateur que vous souhaitez atteindre et de sa#up
hauteur définie ou non .Échantillons
Afficher l'extrait de code
la grille
La
grid
mise en page de CSS offre encore une autre option, bien qu'elle ne soit pas aussi simple que le modèle Flexbox. Cependant, il suffit de styliser l'élément conteneur:Le
grid-template-rows
définit la première ligne comme une hauteur fixe de 100 pixels, et les lignes restantes s'étirent automatiquement pour remplir l'espace restant.Je suis presque sûr que IE11 nécessite des
-ms-
préfixes, alors assurez-vous de valider la fonctionnalité dans les navigateurs que vous souhaitez prendre en charge.Flexbox
Le module de mise en page de boîte flexible
flexbox
de CSS3 ( ) est maintenant bien pris en charge et peut être très facile à implémenter. Parce qu'il est flexible, il fonctionne même lorsqu'il#up
n'a pas de hauteur définie.Il est important de noter que la prise en charge d'IE10 et d'IE11 pour certaines propriétés de la flexbox peut être boguée, et IE9 ou une version antérieure n'a aucune prise en charge.
Hauteur calculée
Une autre solution simple consiste à utiliser l' unité fonctionnelle CSS3
calc
, comme le souligne Alvaro dans sa réponse , mais cela nécessite que la hauteur du premier enfant soit une valeur connue:Il est assez largement pris en charge, les seules exceptions notables étant <= IE8 ou Safari 5 (pas de support) et IE9 (support partiel). Certains autres problèmes incluent l'utilisation de calc en conjonction avec transform ou box-shadow , alors assurez-vous de tester dans plusieurs navigateurs si cela vous concerne.
Autres alternatives
Si un support plus ancien est nécessaire, vous pouvez ajouter
height:100%;
pour#down
rendre le div rose pleine hauteur, avec une mise en garde. Cela provoquera un débordement du conteneur, car#up
il le pousse vers le bas.Par conséquent, vous pouvez ajouter
overflow: hidden;
au conteneur pour résoudre ce problème.Sinon, si la hauteur de
#up
est fixe, vous pouvez le positionner de manière absolue dans le conteneur et ajouter un haut de remplissage à#down
.Et, encore une autre option serait d'utiliser un affichage de table:
la source
position: relative;
positionne par rapport au conteneur, pas à la fenêtre. Donc, cela devrait être une option viable.Cela fait presque deux ans que j'ai posé cette question. Je viens de trouver css calc () qui résout ce problème que j'avais et j'ai pensé que ce serait bien de l'ajouter au cas où quelqu'un aurait le même problème. (Au fait, j'ai fini par utiliser la position absolue).
http://jsfiddle.net/S8g4E/955/
Voici le css
Et plus d'informations à ce sujet ici: http://css-tricks.com/a-couple-of-use-cases-for-calc/
Prise en charge du navigateur: http://caniuse.com/#feat=calc
la source
calc
où la prise en charge des navigateurs étendus n'est pas aussi importante (IE8 et les versions antérieures et Safari 5 ne la prennent pas en charge).#up
hauteur dynamique ?Ma réponse n'utilise que CSS, et elle n'utilise pas overflow: hidden ou display: table-row. Cela exige que le premier enfant ait vraiment une taille donnée, mais dans votre question, vous indiquez que seul le deuxième enfant doit avoir sa taille non spécifiée, donc je pense que vous devriez trouver cela acceptable.
html
css
http://jsfiddle.net/S8g4E/288/
la source
consultez la démo - http://jsfiddle.net/S8g4E/6/
utiliser css -
la source
height: 1px
à#up
pour vous assurer qu'il prend la quantité minimale de hauteur. Voici le support du navigateur pourdisplay: table
: caniuse.com/css-tableÀ moins que je comprends mal, vous pouvez simplement ajouter
height: 100%;
etoverflow:hidden;
à#down
.DÉMO en direct
Edit: Puisque vous ne souhaitez pas utiliser
overflow:hidden;
, vous pouvez utiliserdisplay: table;
pour ce scénario; cependant, il n'est pas pris en charge avant IE 8. (display: table;
prise en charge )DÉMO en direct
Remarque: vous avez dit que vous vouliez que la
#down
hauteur soit la#container
hauteur moins la#up
hauteur. Ladisplay:table;
solution fait exactement cela et ce jsfiddle le représentera assez clairement.la source
overflow:hidden
à pour masquer le contenu supplémentaire.Abstrait
Je n'ai pas trouvé de réponse pleinement satisfaisante, j'ai donc dû la découvrir moi-même.
Mes exigences:
calc()
ne doit pas être utilisé car l'élément restant ne doit rien savoir sur une autre taille d'élément;La solution
flex-grow: 1
à tous les parents directs avec la hauteur calculée (le cas échéant) et l'élément afin qu'ils occupent tout l'espace restant lorsque la taille du contenu de l'élément est plus petite;flex-shrink: 0
à tous les éléments flexibles avec une hauteur fixe afin qu'ils ne deviennent pas plus petits lorsque la taille du contenu de l'élément est plus grande que la taille de l'espace restant;overflow: hidden
à tous les parents directs avec la hauteur calculée (le cas échéant) pour désactiver le défilement et interdire l'affichage du contenu de débordement;overflow: auto
à l'élément pour permettre le défilement à l' intérieur.JSFiddle (l'élément a des parents directs avec une hauteur calculée)
JSFiddle (cas simple: pas de parents directs avec hauteur calculée)
la source
Vous pouvez utiliser des flotteurs pour pousser le contenu vers le bas:
http://jsfiddle.net/S8g4E/5/
Vous disposez d'un conteneur de taille fixe:
Le contenu est autorisé à circuler à côté d'un flotteur. Sauf si nous définissons le flotteur sur toute la largeur:
Alors que
#up
et#down
partagez la position supérieure,#down
le contenu de ne peut commencer qu'après le bas du flottant#up
:la source
#up
couvre en fait la partie supérieure de#down
: jsfiddle.net/thirtydot/S8g4E/9#up
, alors c'est probablement acceptable.Je ne suis pas sûr que cela puisse être fait uniquement avec CSS, à moins que vous ne soyez à l'aise pour le simuler avec des illusions. Peut-être utiliser la réponse de Josh Mein et régler
#container
suroverflow:hidden
.Pour ce que ça vaut, voici une solution jQuery:
la source