J'ai un div avec la position: fixed qui est mon conteneur div pour certains menus. Je l'ai mis en haut: 0px, en bas: 0px pour toujours remplir la fenêtre. Dans ce div, je veux avoir 2 autres divs, le plus bas contient beaucoup de lignes et a débordement: auto. Je m'attendrais à ce qu'il soit contenu dans le conteneur div, mais s'il y a trop de lignes, il se dilate simplement en dehors du div fixe. Ci-dessous, mon code et une capture d'écran pour clarifier:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>MyPlan</title>
<meta name="X-UA-COMPATIBLE" value="IE=8" />
<style type="text/css">
#outerfixed { position:fixed; width:200px; background-color:blue; padding:5px; top:0px; bottom:30px;}
#innerstatic1 { width:100%; background-color:yellow; height:100px;}
#innerstatic2 { overflow:auto; background-color:red; width:100%;}
</style>
</head>
<body>
<div id="outerfixed">
<h3>OUTERFIXED</h3>
<div id="innerstatic1">
<h3>INNERSTATIC1</h3>
</div>
<div id="innerstatic2">
<h3>INNERSTATIC2</h3>
line<br />
...lots of lines
line<br />
</div>
</div>
</body>
</html>
Y at-il un moyen pour moi de faire cela? Encore une fois, je veux que # innerstatic2 soit correctement contenu dans #outerfixed et obtienne des barres de défilement s'il devient plus grand que l'espace disponible à l'intérieur de #outerfixed.
Je sais qu'il existe quelques possibilités pour résoudre ce problème en corrigeant également # innerstatic2, mais j'aimerais vraiment que cela soit dans le flux à l'intérieur de #outerfixed si possible, de sorte que si je déplace #outfixé quelque part, l'élément interne le suivra.
EDIT: Je sais que je peux définir overflow: auto sur #outerfixed et obtenir une barre de défilement sur tout le contenu, mais je veux spécifiquement une barre de défilement juste sur # innerstatic2, c’est une grille et je veux faire défiler la grille uniquement.
N'importe qui? Possible?
Il existe une solution en deux étapes pour cela, mais elle a un coût:
overflow-y: scroll;
au fichier CSS pour #innerstatic2
.height
(ou max-height
) pour #innerstatic2
, sinon ne débordera pas, sa hauteur augmentera continuellement (la valeur par défaut pour div
est height: auto
).J'ai posté une démo sur jsbin pour montrer une implémentation jQuery qui calculera une height
pour vous (ce n'est pas généralisé, donc cela ne fonctionnera qu'avec votre code HTML actuel).
(function($) {
$.fn.innerstaticHeight = function() {
var heightOfOuterfixed = $('#outerfixed').height(),
offset = $('#innerstatic2').offset(),
topOfInnerstatic2 = offset.top,
potentialHeight = heightOfOuterfixed - topOfInnerstatic2;
$('#innerstatic2').css('height',potentialHeight);
}
})(jQuery);
$(document).ready(
function() {
$('#innerstatic2').innerstaticHeight();
}
);
Je l'ai résolu en donnant une position absolue à l'ul et à la hauteur de 100%
ul {
overflow-y: scroll;
position: absolute;
height: 100%;
}
overflow-y:scroll;
Et ajoutez ceci pour les appareils iOS. Cela donne un meilleur défilement en utilisant le toucher. Le débordement doit être faire défiler! pour des raisons sécurisées. auto ne fonctionnera pas pour certaines personnes. ou du moins c'est ce que j'ai entendu.
-webkit-overflow-scrolling: touch;
vous devez définir la hauteur pour outerfixed et max-height pour innerstatic2
voir cela pourrait être utile DEMO
Pas idéal, mais cela devrait vous rendre 90% de leur chemin
<div style="position:fixed; bottom:1px; left:5em; height: 20em; width:20em; background-color:blue;">
<div style ="width:15em; background-color: green;">
Title
</div>
<div style ="background-color:yellow; max-height:80%; width:15em; overflow:auto;">
<div style="height:100em; background-color:red; width:10em;">
scroll<br/>
scroll<br/>
scroll<br/>
</div>
</div>
</div>
C'est le conteneur div qui doit être avec l'attribut overflow: auto. Dans ce cas, la div #outerfixed
La seule façon dont je figure est de placer innerstatic2 en position absolue (pour que vous puissiez utiliser top et bottom pour le dimensionner par rapport à outerfixed ), puis dans innerstatic2 créer un autre div mettez votre texte po Ensuite, vous donnez innerstatic2 le "débordement: auto;" indication. L'inconvénient de cette méthode est qu'Innerstatic2 ne descend pas quand Innerstatic1 se développe, car il doit être positionné absolument. Si elle doit être déplacée, il doit s'agir de "position: relative", mais vous devez alors définir une hauteur fixe. Donc, de toute façon, vous devez vous contenter d'un compromis.
Une fois que tous les navigateurs auront pris en charge les nouvelles fonctionnalités de CSS3, telles que la prise en charge des calculs, de meilleures options pour le faire, sans ces inconvénients.