XHTML & CSS

Les boites arrondis redimensionnables

Le 1 décembre 2007 à 1:44 par Séverin

Coté design, le web2 c’est la grande mode les coins arrondis, quand on en connait la taille, c’est assez facile à réaliser, mais c’est plus compliqué si le contenu ou la taille de la fenêtre peuvent redimenssioner la zone.La technique de base consiste à imbriquer plusieurs éléments à la suite afin de pouvoir définir plusieurs images fonds avec des positionnements différents.

La boite est découpée en 9 zones :

  • 4 coins fixes ( 1, 3, 7 et 9 ).
  • 4 bords à taille variable ( 2, 4, 6 et 8 ) qui devront contenir des images supportant d’être répétées.
  • 1 zone de fond d’une couleur unie.

Exemple de découpage

Le code HTML devra donc contenir 9 DIVs. Mais attention à l’ordre dans lequel vous les disposer. Le dernier élément défini apparaitra au dessus des autres. Il faut donc d’abords définir le fond puis les bords et enfin les coins.

  1.  
  2. <div class="roundedBox">
  3.   <div class="area area5">
  4.     <div class="area area2">
  5.       <div class="area area4">
  6.         <div class="area area6">
  7.           <div class="area area8">
  8.             <div class="area area1">
  9.               <div class="area area3">
  10.                 <div class="area area7">
  11.                   <div class="area area9">
  12.                       <!– Contenu de la boite –>
  13.                   </div>
  14.                 </div>
  15.               </div>
  16.             </div>
  17.           </div>
  18.         </div>
  19.       </div>
  20.     </div>
  21.   </div>
  22. </div>
  23.  

Il ne reste plus qu’à définir les images de fond des 9 zones :

  1.  
  2. .roundedbox .area1{
  3.   background:url(image1.gif) no-repeat top left;
  4. }
  5. .roundedbox .area2{
  6.   background:url(image2.gif) repeat-x top;
  7. }
  8. .roundedbox .area3{
  9.   background:url(image3.gif) no-repeat top right;
  10. }
  11. .roundedbox .area4{
  12.   background:url(image4.gif) repeat-y left;
  13. }
  14. .roundedbox .area5{
  15.   background:#fff;
  16. }
  17. .roundedbox .area6{
  18.   background:url(image6.gif) repeat-y right;
  19. }
  20. .roundedbox .area7{
  21.   background:url(image7.gif) no-repeat bottom left;
  22. }
  23. .roundedbox .area8{
  24.   background:url(image8.gif) repeat-x bottom;
  25. }
  26. .roundedbox .area9{
  27.   background:url(image9.gif) no-repeat bottom right;
  28. }
  29.  

Et pour placer correctement le texte, on règle le padding de la dernière zone :

  1.  
  2. .roundedbox .area9{
  3.   padding:10px;
  4. }
  5.  

A ce stade, si on réduit trop la boite, les images vont se chevaucher. Pour éviter ça, on définit les dimensions minimales :

  1.  
  2. .roundedbox .area{
  3.   min-height:250px;
  4.   min-width:50px;
  5.   height:auto !important;
  6.   width:auto !important;
  7.   height:250px;
  8.   width:50px;
  9. }
  10.  

Tant que le contenu sera du texte simple, tout fonctionnera à merveille. Mais si on commence à utiliser des float ou des clear, on peut facilement rencontrer des problèmes. Pour ça on applique le clearfix et un nouveau contexte de formatage à chaque zone :

  1.  
  2. .roundedbox .area{
  3.   zoom:1;
  4.   overflow:hidden;
  5.   display: inline-block;
  6. }
  7.  
  8. .roundedbox .area:after {
  9.     content: ".";
  10.     display: block;
  11.     height: 0;
  12.     clear: both;
  13.     visibility: hidden;
  14. }
  15.  
  16. * html .roundedbox .area{height: 1%;}
  17.  
  18. .roundedbox .area{display: block;}
  19.  

Selon les besoins, cette technique peut s’appliquer à des boites plus ou moins complexes. Par exemple, une boite qui ne se redimensionne que dans un sens (verticalement ou horizontalement) ne nécessitera que 3 Divs imbriqués, mais une boite avec une entête et un pied eux même redimensionnables pourra nécessiter jusqu’à 21 Divs et on peut continuer comme ça en ajoutant des colonnes ou des lignes supplémentaires à la boite. Il n’y a pas de limites.
Le nombre de DIV nécessaires est en fait égal au nombre d’images + le nombre de zones de contenu.

Ca peut vite être assez lourd à gérer et surtout ça augmente le poids de la page et ça peut vite s’avéré gênant. Du coup, il y’a la solution du javascript :

  1.  
  2. function doBox(id,nb){
  3.   var e = document.getElementById(id);
  4.   var content = e.innerHTML;
  5.   for(i=nb;i>0;i–){
  6.     content = "<div class=\"area area"+i+"\">"+content+"</div>";
  7.   }
  8.   e.innerHTML = content;
  9. }
  10. </script>
  11.  
  12. <div id="box">
  13.   bla bla bla
  14. </div>
  15. <script>doBox(’box’, 9);</script>
  16.  

9 commentaires »

Gravatar

Commentaire de eMeRiKa

le 1 décembre 2007 à 2:38

Aille atroce.. Dans le genre, je ralentis mon site à cause de multiples requètes HTTP, et le parseur de mon navigateur avec un code HTML hallucinant..

Déja avec du CSS sprite çà passerait mieux mais à éviter!!

Gravatar

Pingback de Les boites arrondis redimensionnables - Kazhar

le 1 décembre 2007 à 3:04

[…] Source : Les boites arrondis redimensionnables […]

Gravatar

Commentaire de Darklg

le 1 décembre 2007 à 3:11

Bon tutoriel, meme si c’est pas génial niveau sémantique.
Heureusement, CSS 3 permettra l’implantation de multiples images de fond : http://www.w3.org/TR/css3-background/ :)

Gravatar

Commentaire de Séverin

le 1 décembre 2007 à 3:13

Oula, on est pas non plus dans l’usine à gaz. Si pour un site à 4 millions de visites/jour ça peut être lourd, pour un blog moyen c’est tout à fait faisable sans que le serveur ou les visiteurs ne ressentent de ralentissements notables.

C’est une solution pour les boites dont la taille est vraiment inconnue. Si on connait les dimensions maximums, il y’a en effet des solutions bien plus légères en utilisant un seul fichier image et moins de divs.

Gravatar

Commentaire de Grummfy

le 1 décembre 2007 à 3:34

l’idéal est d’utiliser -moz-border-radius qui est valide (c’est dans les spécification du w3c) meêm si le validateur rouspette.

enfin en attendant css3

Gravatar

Commentaire de Damien

le 1 décembre 2007 à 9:25

-moz-border-raduis n’est pas valide, c’est border-raduis qui l’est :)
Le -moz- est utilisé par Mozilla pour tester des propriété CSS3, donc ça marche sous Firefox mais ça va pas plus loin normalement.

Sinon 9 divs c’est pas rien ! Mais il s’agit d’une boite vraiment fluide aussi bien en largeur qu’en hauteur. Si elle avait été de largeur fixe (c’est qui est bien plus courant) ça aurait été beaucoup plus simple :)

Gravatar

Commentaire de Séverin

le 1 décembre 2007 à 11:58

Et puis dans l’exemple, il ne s’agit pas que de coins arrondis mais aussi d’une bordure en dégradée. Du coup border-radius ne suffirai pas.

Gravatar

Commentaire de Charliend

le 16 décembre 2007 à 14:17

Etonnant, cette imbrication des divs je n’y aurai pas pensé par moi même. Personnelement j’utilisais une “architecture” plane.. Mais bon, je comprends la justification et c’est une bonne idée.
Bon tutorial en tout cas, à recommander.

Gravatar

Commentaire de Gabriel

le 9 janvier 2008 à 1:26

La propriété de feuille de style css -moz-border-radius n’est reconnu que par FireFox et Nestcape.

Laisser un commentaire

Votre Nom

Votre E-mail (obligatoire mais ne sera pas publié)

Votre Site ou blog

Votre commentaire

Valid XHTML 1.0 Transitional