Avec HTML / CSS, comment puis-je créer un élément dont la largeur et / ou la hauteur correspond à 100% de son élément parent et qui a toujours un remplissage ou des marges appropriés?
Par «bon», je veux dire que si mon élément parent est 200px
grand et que je précise height = 100%
avec, padding = 5px
je m'attendrais à ce que j'obtienne un 190px
élément haut avec border = 5px
de tous les côtés, bien centré dans l'élément parent.
Maintenant, je sais que ce n'est pas ainsi que le modèle de boîte standard spécifie que cela devrait fonctionner (bien que j'aimerais savoir pourquoi, exactement ...), donc la réponse évidente ne fonctionne pas:
#myDiv {
width: 100%
height: 100%;
padding: 5px;
}
Mais il me semble qu'il doit y avoir QUELQUE manière de produire de manière fiable cet effet pour un parent de taille arbitraire. Quelqu'un connaît-il un moyen d'accomplir cette tâche (apparemment simple)?
Oh, et pour mémoire, je ne suis pas très intéressé par la compatibilité IE, ce qui devrait (espérons-le) faciliter les choses un peu.
EDIT: Puisqu'un exemple a été demandé, voici le plus simple auquel je puisse penser:
<html style="height: 100%">
<body style="height: 100%">
<div style="background-color: black; height: 100%; padding: 25px"></div>
</body>
</html>
Le défi consiste alors à faire apparaître la boîte noire avec un remplissage de 25 pixels sur tous les bords sans que la page ne devienne suffisamment grande pour nécessiter des barres de défilement.
Réponses:
J'ai appris à faire ce genre de choses en lisant « Modèles de conception PRO HTML et CSS ». C'est
display:block
la valeur d'affichage par défaut pour lediv
, mais j'aime le rendre explicite. Le conteneur doit être du bon type;position
attribut estfixed
,relative
ouabsolute
.Fiddle par le commentaire de Nooshu
la source
top:0
,bottom:0
"étire" essentiellement l'élément. Je ne peux le faire fonctionner avecposition:absolute
sitop:20px;bottom:20px;left:20px;right:20px;
au lieu d'utiliser des marges?Il y a une nouvelle propriété dans CSS3 que vous pouvez utiliser pour changer la façon dont le modèle de boîte calcule la largeur / hauteur, elle s'appelle la taille de boîte.
En définissant cette propriété avec la valeur «border-box», l'élément que vous lui appliquez ne s'étire pas lorsque vous ajoutez un remplissage ou une bordure. Si vous définissez quelque chose avec une largeur de 100 pixels et un remplissage de 10 pixels, il sera toujours de 100 pixels de large.
Voir ici pour le support du navigateur . Il ne fonctionne pas pour IE7 et inférieur, cependant, je crois que IE7.js de Dean Edward ajoute un support pour cela. Prendre plaisir :)
la source
border-box
le héros de tout le monde :)La solution est de ne PAS utiliser du tout la hauteur et la largeur! Fixez la boîte intérieure en haut, à gauche, à droite, en bas, puis ajoutez une marge.
la source
La meilleure façon est d'utiliser la propriété calc (). Votre cas ressemblerait donc à:
Simple, propre, aucune solution de contournement. Assurez-vous simplement de ne pas oublier l'espace entre les valeurs et l'opérateur (par exemple,
(100%-5px)
cela cassera la syntaxe. Profitez-en!la source
Selon la hauteur de spécification w3c se réfère à la hauteur de la zone visible par exemple sur un moniteur de résolution 1280x1024 pixels hauteur 100% = 1024 pixels.
min-height fait référence à la hauteur totale de la page, y compris le contenu, donc sur une page dont le contenu est supérieur à 1024px min-height: 100% s'étirera pour inclure tout le contenu.
L'autre problème est alors que le rembourrage et la bordure sont ajoutés à la hauteur et à la largeur dans la plupart des navigateurs modernes sauf ie6 (ie6 est en fait assez logique mais n'est pas conforme à la spécification). C'est ce qu'on appelle le modèle de boîte. Donc, si vous spécifiez
Cela vous donnera en fait 100% + 5px + 5px pour la hauteur. Pour contourner cela, vous avez besoin d'un conteneur d'emballage.
la source
1. Pleine hauteur avec
padding
2. Pleine hauteur avec
margin
3. Hauteur totale avec
border
la source
C'est l'une des idioties pure et simple de CSS - je n'ai pas encore compris le raisonnement (si quelqu'un le sait, veuillez expliquer).
100% signifie 100% de la hauteur du conteneur - auquel sont ajoutées les marges, bordures et rembourrages. Il est donc effectivement impossible d'obtenir un conteneur qui remplit son parent et qui a une marge, une bordure ou un rembourrage.
Notez également que le réglage de la hauteur est notoirement incohérent entre les navigateurs.
Une autre chose que j'ai apprise depuis que j'ai posté ceci est que le pourcentage est relatif à la longueur du conteneur , c'est-à-dire sa largeur, ce qui rend un pourcentage encore plus inutile pour la hauteur.
De nos jours, les unités de fenêtre vh et vw sont plus utiles, mais toujours pas particulièrement utiles pour autre chose que les conteneurs de niveau supérieur.
la source
Une autre solution consiste à utiliser display: table qui a un comportement de modèle de boîte différent.
Vous pouvez définir une hauteur et une largeur pour le parent et ajouter du rembourrage sans l'agrandir. L'enfant a 100% de hauteur et de largeur moins les rembourrages.
JSBIN
Une autre option serait d'utiliser une propriété de dimensionnement de boîte. Le seul problème avec les deux serait qu'ils ne fonctionnent pas dans IE7.
la source
Une autre solution: vous pouvez utiliser des unités de pourcentage pour les marges ainsi que les tailles. Par exemple:
Le principal problème ici est que les marges augmenteront / diminueront légèrement avec la taille de l'élément parent. Vraisemblablement, la fonctionnalité que vous préféreriez est que les marges restent constantes et que l'élément enfant s'agrandisse / se rétrécisse pour combler les changements d'espacement. Ainsi, en fonction de l'étroitesse de votre écran, cela pourrait être problématique. (Je choisirais également une marge plus petite, comme 0,3%).
la source
Une solution avec flexbox (fonctionnant sur IE11): ( ou vue sur jsfiddle )
(La réinitialisation CSS n'est pas nécessairement importante pour le problème réel.)
La partie importante est
flex: 1
(en combinaison avecdisplay: flex
chez le parent). Curieusement, l'explication la plus plausible que je connaisse sur le fonctionnement de la propriété Flex provient d'une documentation native native, donc j'y fais référence quand même :la source
L'exemple de Frank m'a un peu dérouté - cela n'a pas fonctionné dans mon cas parce que je ne comprenais pas encore assez bien le positionnement. Il est important de noter que l'élément conteneur parent doit avoir une position non statique (il l'a mentionné mais je l'ai ignoré, et ce n'était pas dans son exemple).
Voici un exemple où l'enfant - avec un rembourrage et une bordure - utilise un positionnement absolu pour remplir le parent à 100%. Le parent utilise un positionnement relatif afin de fournir un point de référence pour la position de l'enfant tout en restant dans le flux normal - l'élément suivant "plus de contenu" n'est pas affecté:
Un lien utile pour apprendre rapidement le positionnement CSS
la source
Bordure autour de div, plutôt que marge du corps de la page
Une autre solution - je voulais juste une simple bordure autour du bord de ma page, et je voulais 100% de hauteur lorsque le contenu était plus petit que cela.
Border-box ne fonctionnait pas, et le positionnement fixe semblait incorrect pour un besoin aussi simple.
J'ai fini par ajouter une bordure à mon conteneur, au lieu de compter sur la marge du corps de la page - cela ressemble à ceci:
la source
Il s'agit du comportement par défaut de
display: block
La façon la plus rapide de le corriger en 2020 est de définir l'display: 'flex'
élément parent et le remplissage, par exemple 20 pixels, puis tous ses enfants auront 100% de hauteur par rapport à sa hauteur.la source
Ajouter -webkit et -moz serait plus approprié
la source
la source