J'essaie de créer des classes CSS réutilisables pour plus de cohérence et moins d'encombrement sur mon site, et je suis coincé à essayer de normaliser une chose que j'utilise fréquemment.
J'ai un conteneur pour <div>
lequel je ne veux pas définir la hauteur (car il variera en fonction de l'endroit où il se trouve sur le site), et à l'intérieur, il y a un en-tête <div>
, puis une liste non ordonnée d'éléments, le tout avec CSS appliqué à leur.
Cela ressemble beaucoup à ceci:
Je veux que la liste non ordonnée occupe l'espace restant dans le conteneur <div>
, sachant que l'en-tête <div>
est 18px
grand. Je ne sais tout simplement pas comment spécifier la hauteur de la liste comme "le résultat de 100%
moins 18px
".
J'ai vu cette question posée dans quelques autres contextes sur SO, mais j'ai pensé qu'il valait la peine de se poser à nouveau pour mon cas particulier. Quelqu'un at-il des conseils dans cette situation?
Réponses:
Je me rends compte que c'est un ancien article, mais étant donné qu'il n'a pas été suggéré, il convient de mentionner que si vous écrivez pour des navigateurs compatibles CSS3, vous pouvez utiliser
calc
:Il vaut la peine de noter que tous les navigateurs ne prennent pas actuellement en charge la fonction standard CSS3 calc (), donc l'implémentation des versions spécifiques au navigateur de la fonction peut être requise comme suit:
la source
lessc --strict-math=on
moins afin de ne pas évaluer l'expression à l'intérieur decalc
- juste un problème auquel j'ai été confronté et j'ai passé beaucoup de temps (à partir de Less 2.0.0)100%-18px
,100%- 18px
et100% -18px
ne fonctionne pas dans les navigateurs que j'ai testé avec.Pour un peu d'une approche différente, vous pouvez utiliser quelque chose comme ça sur la liste:
Cela fonctionne tant que le conteneur parent a
position: relative;
la source
position: relative;
me faisait trébucher.absolute
dans le conteneur pour enfants, elle ne peut pas l'êtrerelative
.absolute
aussi), et il doit également être réglé sur 100% de hauteur.J'utilise Jquery pour cela
puis je lie le redimensionnement de la fenêtre pour le recalculer chaque fois que la fenêtre du navigateur est redimensionnée (si la taille du conteneur a changé avec le redimensionnement de la fenêtre)
la source
Ne définissez pas la hauteur en pourcentage, définissez simplement le
top=0
etbottom=0
, comme ceci:la source
height:100%
etdisplay:block
. Sinon, ce serait une solution très élégante. Fait intéressant,margin:auto
ne parvient pas non plus à centrer verticalement un objet à largeur fixe, même s'il fonctionne correctement horizontalement.Présumer la hauteur de l'en-tête 17px
Liste css:
En-tête CSS:
la source
ul { margin-top: -17px; }
overflow:hidden;
sur l'élément contenantoverflow:auto;
l'élément souhaité.Ça a marché pour moi!
la source
calc()
le centrer lors de l'exécution. Mais pour de nombreux cas, cela ne devrait pas être un problème. Une autre chose à garder à l'esprit est que l'utilisation de nombreuses valeurs négatives pour les marges, le remplissage et les décalages peut entraîner une confusion lors du débogage de code plus tard, alors essayez de garder les choses simples.Essayez le dimensionnement des boîtes. Pour la liste:
Pour l'en-tête:
Bien sûr, le conteneur parent devrait avoir quelque chose comme:
la source
Une autre façon d'atteindre le même objectif: les boîtes flexibles . Faites du conteneur une boîte flexible de colonne, puis vous avez toute liberté pour autoriser certains éléments à avoir une taille fixe (comportement par défaut) ou à remplir / réduire l'espace du conteneur (avec flex-grow: 1 et flex- rétrécir: 1).
Voir https://jsfiddle.net/2Lmodwxk/ (essayez d'agrandir ou de réduire la fenêtre pour remarquer l'effet)
Remarque: vous pouvez également utiliser la propriété de raccourci:
la source
J'ai essayé certaines des autres réponses, et aucune n'a fonctionné comme je le souhaitais. Notre situation était très similaire où nous avions un en-tête de fenêtre et la fenêtre était redimensionnable avec des images dans le corps de la fenêtre. Nous voulions verrouiller le rapport hauteur / largeur du redimensionnement sans avoir besoin d'ajouter des calculs pour tenir compte de la taille fixe de l'en-tête tout en laissant l'image remplir le corps de la fenêtre.
Ci-dessous, j'ai créé un extrait très simple qui montre ce que nous avons fini par faire qui semble bien fonctionner dans notre situation et devrait être compatible avec la plupart des navigateurs.
Sur notre élément de fenêtre, nous avons ajouté une marge de 20 pixels qui contribue au positionnement par rapport aux autres éléments de l'écran, mais ne contribue pas à la "taille" de la fenêtre. L'en-tête de fenêtre est ensuite positionné de manière absolue (ce qui le supprime du flux d'autres éléments, de sorte qu'il ne provoquera pas le déplacement d'autres éléments comme la liste non ordonnée) et son sommet est positionné à -20px, ce qui place l'en-tête à l'intérieur de la marge de la fenêtre. Enfin, notre élément ul est ajouté à la fenêtre, et la hauteur peut être réglée à 100% ce qui la fera remplir le corps de la fenêtre (hors marge).
la source
Merci, j'ai résolu le mien avec votre aide, en l'ajustant un peu car je veux un div 100% de largeur 100% de hauteur (moins de hauteur d'une barre inférieure) et pas de défilement sur le corps (sans pirater / cacher les barres de défilement).
Pour CSS:
Pour HTML:
Cela a fait l'affaire, oh oui, j'ai mis une valeur un peu plus grande sur div.justée pour le bas que pour la hauteur de la barre inférieure, sinon la barre de défilement verticale apparaît, j'ai ajusté pour être la valeur la plus proche.
Cette différence est parce que l'un des éléments de la zone dynamique ajoute un trou inférieur supplémentaire dont je ne sais pas comment me débarrasser ... c'est un tag vidéo (HTML5), veuillez noter que j'ai mis ce tag vidéo avec ce css ( il n'y a donc aucune raison pour qu'il fasse un trou au fond, mais il le fait):
L'objectif: avoir une vidéo qui prend 100% du navigateur (et se redimensionne dynamiquement lorsque le navigateur est redimensionné, mais sans modifier le rapport d'aspect) moins un espace inférieur que j'utilise pour une div avec quelques textes, boutons, etc. (et validateurs w3c & css bien sûr).
EDIT: J'ai trouvé la raison, le tag vidéo est comme du texte, pas un élément de bloc, donc je l'ai corrigé avec ce CSS:
Notez la
display:block;
balise on video.la source
Je ne sais pas si cela fonctionne dans votre situation particulière, mais j'ai trouvé que le remplissage sur la div intérieure poussera le contenu à l'intérieur d'une div si la div contenant est de taille fixe. Vous devrez soit flotter soit positionner absolument votre élément d'en-tête, mais sinon, je n'ai pas essayé cela pour les divs de taille variable.
la source