Nous allons voir la mise en page fluide des éléments de type bloc de façon à les rendre sensible à la taille de la fenêtre du navigateur.
Il apparaît évident de ne pas déterminer de largeur fixe à ces éléments ou du moins le moins possible.
Le plus simple est de ne pas leur donner de valeur :
width
ou alors une valeur en pourcentage :
width:90%;
sans oublier de donner également une valeur aux éléments : margin, padding.
La formule suivante est alors d'un grand secours : cible / contexte = résultat
Exemple : la boîte doit faire 460 pixel dans un site qui fait 960 pixel. Cela donne 460/960=0,479166667. Alors le résulta est 47,9166667%.
Les navigateurs comprennent très bien les nombres comprenant une virgule. N'hésitez pas à inclure dans votre css dans résultats sans arrondir pour une mise en page parfaite.
L'utilisation de pourcentage peut parfois poser problème en particulier dans le cas de zones fines comme les marges ou les padding :
Pour cela, nous pourrons utiliser deux techniques différentes. Par exemple, si nous souhaitons faire varier la largeur d'un élément de liste en pourcentage
li {
width : 18%;
padding : 0 1%;
}
deviendra cela avec des valeurs en em :
li {
width : 18%;
padding : 0 1em;
}
cela permet alors de mieux contrôler le padding mais peut engendre des incohérences au niveau du flux. L'ajout de la nouvelle fonction CSS calc()
peut alors aider :
/*width : calc(20% - 2em);
padding : 0 1em;*/
Ce qui donnerait par exemple :
nav ul li{
float : left;
text-align:center;
/*width : calc(20% - 2em);
padding : 0 1em;*/
width : 18%;
padding : 0 1%;
}
On trouvera un exemple sur ce site : http://www.icehousempls.com/ dans lequel le margin des liens dans les listes est valorisé à 1em.
Nous voulons afficher 3 boites d'actualités côte à côte dans notre partie principale main. Ces zones devront être réparties équitablement, et chacune contenir une image, un titre, et un petit descriptif.
Notre code HTML pourra être :
<main>
<section>
<article>
<img src="http://img.over-blog-kiwi.com/0/72/42/51/20140209/ob_f392b0_cgc-gooseberry-icon.jpg" alt="image Gooseberry de blender" />
<h2>titre news</h2>
<p>texte de la news</p>
</article>
<article>
<img src="http://img.over-blog-kiwi.com/0/72/42/51/20140209/ob_f392b0_cgc-gooseberry-icon.jpg" alt="image Gooseberry de blender"/>
<h2>titre news</h2>
<p>texte de la news</p>
</article>
<article>
<img src="http://img.over-blog-kiwi.com/0/72/42/51/20140209/ob_f392b0_cgc-gooseberry-icon.jpg" alt="image Gooseberry de blender"/>
<h2>titre news</h2>
<p>texte de la news</p>
</article>
</section>
</main>
On pourra d'abord organiser les zones en leur donnant une largeur par défaut, et en définissant un placement par float:left.
main section article {
width:30%;
background:grey;
float:left;
}
et définissons que nos images dans le main occupent toute la largeur de la zone :
main article > img{width:100%;}
On obtient un résultat correct, mais les éléments sont collés les un aux autres et le texte suivant apparaît à droite dans l'espace qui lui reste. Nous allons alors accéder à l'élément du milieu (le deuxième article) et les appliquer des marges de 5% (100% - (30%*3)) :
main section article:nth-child(2) {
margin:0 5%;
}
On peut remarquer en regardant de plus prêt qu'un petit décalage apparaît si on ajoute une image au dessus. Corrigeons ce problème qui est dû à une non réinitialisation de la hauteur de ligne sur le main.
main {line-height:0;}
main > * {line-height:1}
Les trois zones vont se rétrécir en fonction de la taille de l'écran. Il sera alors possible de définir des valeurs extrêmes avec min-width et max-width, ce qui donnera :
main section article {
width:30%;
background:grey;
float:left;
min-width:100px;
max-width:200px;
}
et pour éviter que le texte placer dans un article directement dans le main (et pas dans la section définie) ne remonte :
main > article {clear:both}
Notre montage est maintenant prêt, et il ne reste plus qu'à appliquer des finitions stylistiques.
Il y a une erreur de communication avec le serveur Booktype. Nous ne savons pas actuellement où est le problème.
Vous devriez rafraîchir la page.