J'ai un div wrapper qui contient 2 divs l'un à côté de l'autre. Au-dessus de ce conteneur, j'ai un div qui contient mon en-tête. Le div de l'emballage doit être égal à 100% moins la hauteur de l'en-tête. L'en-tête est d'environ 60 px. Ceci est corrigé. Ma question est donc la suivante: comment définir la hauteur de mon emballage pour qu'il soit égal à 100% moins le 60 px?
<div id="header"></div>
<div id="wrapper">
<div id="left"></div>
<div id="right"></div>
</div>
Voici un css fonctionnel, testé sous Firefox/IE7/Safari/Chrome/Opera.
* {margin:0px;padding:0px;overflow:hidden}
div {position:absolute}
div#header {top:0px;left:0px;right:0px;height:60px}
div#wrapper {top:60px;left:0px;right:0px;bottom:0px;}
div#left {top:0px;bottom:0px;left:0px;width:50%;overflow-y:auto}
div#right {top:0px;bottom:0px;right:0px;width:50%;overflow-y:auto}
"overflow-y" n'est pas approuvé par le w3c, mais tous les principaux navigateurs le supportent. Vos deux divs #left et #right afficheront une barre de défilement verticale si leur contenu est trop élevé.
Pour que cela fonctionne sous IE7, vous devez activer le mode conforme aux normes en ajoutant un DOCTYPE:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title></title>
<style type="text/css">
*{margin:0px;padding:0px;overflow:hidden}
div{position:absolute}
div#header{top:0px;left:0px;right:0px;height:60px}
div#wrapper{top:60px;left:0px;right:0px;bottom:0px;}
div#left{top:0px;bottom:0px;left:0px;width:50%;overflow-y:auto}
div#right{top:0px;bottom:0px;right:0px;width:50%;overflow-y:auto}
</style>
</head>
<body>
<div id="header"></div>
<div id="wrapper">
<div id="left"><div style="height:1000px">high content</div></div>
<div id="right"></div>
</div>
</body>
En CSS3, vous pouvez utiliser
height: calc(100% - 60px);
Si vous devez prendre en charge IE6, utilisez JavaScript pour gérer la taille du div de l'emballage (définissez la position de l'élément en pixels après la lecture de la taille de la fenêtre). Si vous ne voulez pas utiliser JavaScript, cela ne peut pas être fait. Il existe des solutions de contournement, mais attendez-vous une semaine ou deux pour que cela fonctionne dans tous les cas et dans tous les navigateurs.
Pour les autres navigateurs modernes, utilisez ce css:
position: absolute;
top: 60px;
bottom: 0px;
super ... maintenant j'ai cessé d'utiliser% he he he ... sauf le conteneur principal, comme indiqué ci-dessous:
<div id="divContainer">
<div id="divHeader">
</div>
<div id="divContentArea">
<div id="divContentLeft">
</div>
<div id="divContentRight">
</div>
</div>
<div id="divFooter">
</div>
</div>
et voici le css:
#divContainer {
width: 100%;
height: 100%;
}
#divHeader {
position: absolute;
left: 0px;
top: 0px;
right: 0px;
height: 28px;
}
#divContentArea {
position: absolute;
left: 0px;
top: 30px;
right: 0px;
bottom: 30px;
}
#divContentLeft {
position: absolute;
top: 0px;
left: 0px;
width: 250px;
bottom: 0px;
}
#divContentRight {
position: absolute;
top: 0px;
left: 254px;
right: 0px;
bottom: 0px;
}
#divFooter {
position: absolute;
height: 28px;
left: 0px;
bottom: 0px;
right: 0px;
}
j'ai testé cela dans tous les navigateurs connus et fonctionne bien. Y a-t-il des inconvénients à utiliser cette méthode?
Vous pouvez faire quelque chose comme height: calc (100% - nPx); par exemple height: calc (100% - 70px);
div {
height: 100%;
height: -webkit-calc(100% - 60px);
height: -moz-calc(100% - 60px);
height: calc(100% - 60px);
}
Assurez-vous en utilisant moins
height: ~calc(100% - 60px);
Sinon moins ne va pas le compiler correctement
Cela ne répond pas exactement à la question posée, mais crée le même effet visuel que vous essayez d'obtenir.
<style>
body {
border:0;
padding:0;
margin:0;
padding-top:60px;
}
#header {
position:absolute;
top:0;
height:60px;
width:100%;
}
#wrapper {
height:100%;
width:100%;
}
</style>
Je n'ai encore rien vu de tel, mais je pensais le publier.
<div class="main">
<header>Header</header>
<div class="content">Content</div>
Puis CSS:
body, html {
height: 100%;
margin: 0;
padding: 0;
}
.main {
height: 100%;
padding-top: 50px;
box-sizing: border-box;
}
header {
height: 50px;
margin-top: -50px;
width: 100%;
background-color: #5078a5;
}
.content {
height: 100%;
background-color: #999999;
}
Voici un travail jsfiddle
Note: Je n'ai aucune idée de ce qu'est la compatibilité du navigateur pour cela. Je ne faisais que jouer avec des solutions alternatives et cela semblait bien fonctionner.
Dans cet exemple, vous pouvez identifier différents domaines:
<html>
<style>
#divContainer {
width: 100%;
height: 100%;
}
#divHeader {
position: absolute;
left: 0px;
top: 0px;
right: 0px;
height: 28px;
background-color:blue;
}
#divContentArea {
position: absolute;
left: 0px;
top: 30px;
right: 0px;
bottom: 30px;
}
#divContentLeft {
position: absolute;
top: 0px;
left: 0px;
width: 200px;
bottom: 0px;
background-color:red;
}
#divContentCenter {
position: absolute;
top: 0px;
left: 200px;
bottom: 0px;
right:200px;
background-color:yellow;
}
#divContentRight {
position: absolute;
top: 0px;
right: 0px;
bottom: 0px;
width:200px;
background-color:red;
}
#divFooter {
position: absolute;
height: 28px;
left: 0px;
bottom: 0px;
right: 0px;
background-color:blue;
}
</style>
<body >
<div id="divContainer">
<div id="divHeader"> top
</div>
<div id="divContentArea">
<div id="divContentLeft">left
</div>
<div id="divContentCenter">center
</div>
<div id="divContentRight">right
</div>
</div>
<div id="divFooter">bottom
</div>
</div>
</body>
</html>