/*---- Cadrage des absolus */
#general {position:relative;}
/*---- Suppression du titre redondant */
.h2Album {display:none}
/*---- Menu des galeries*/
#galeries a {display:block;}
#galeries {position:absolute; width:205px; left:23px;
margin-left:0; margin-top:2px;}
/* Ramène le menu à l'avant-plan */
#galeries { z-index:2;}
/*---- Rétrécir la partie droite */
.quickNavAlbum, .nomPhotoAlbum, #photo,
.decrPhotoAlbum {margin-left:215px;}
/*---- Panneau d'imagettes */
/* placement et dimensions */
.thumbsAlbumContainer {position:absolute;
width:205px;width:120px; top:116px;
height:577px; padding-top:115px;
padding-right:10px; padding-left:75px; }
/* fond de pellicule*/
.thumbsAlbumContainer .center {
margin:0; padding:0;
background:transparent
url([blablabla]pellicule.gif) repeat-y ;}
/*---- Imagettes */
.thumbAlbum, .thumbAlbum a {display:block}
/* dimensions et espacement*/
div.thumbAlbum
{height:102px; width:104px;
padding:4px 0; margin:0px auto;}
/* liens sur les images */
.thumbAlbum a {background:#707070;
line-height:102px; padding: 0;}
.thumbAlbum a:hover {background:#909090}
/* toutes imagettes */
.thumbAlbum img
{ margin:0; padding:0;border:0;margin:0 0 2px;
vertical-align:middle;}
/* imagette courante*/
.thumbCouranteAlbum img
{border:1px solid #fcf9ec;}
/*---- Pagination*/
.pagination { position:absolute; border:none;
top:340px; left:30px; width:55px; }
.pagination a, .pagination b {display:block;}
/* verbiage cosmétique */
.pagination a, .pagination b {margin:0 0 8px;
border-width:1px; background-color:#fcf9ec}
.currentPage {padding: 0px ;
vertical-align:baseline;}
.pagination a:hover {background-color:#ede2cc}
a.textNext:hover, a.textLast:hover,
a.textPrevious:hover, a.textFirst:hover
{color:#ede2cc}
.textNext, .textPrevious ,
.textLast, .textFirst
{text-align:left; padding-left:0; color:#fcf9ec;
background-position:center center}
.textLast {padding-left :5px; }
.textNext {background-image:
url([blablabla]nav16V-Next.gif) }
.textPrevious {background-image:
url([blablabla]nav16V-Previous.gif) }
.textLast {background-image:
url([blablabla]nav16V-Last.gif) }
.textFirst {background-image:
url([blablabla]nav16V-First.gif) }
Le but du jeu
Cette page sort d'un de mes albums photo, son aspect est classique : tout en bandes horizontales. La bande d'imagettes et la pagination sont trop bas pour qu'on aille y voir, or il y a beaucoup de place de part et d'autre de la photo (600 pixels maxi en largeur). Pourquoi ne pas disposer galeries, imagettes et pagination sur le côté gauche de la photo, comme les modules dans le blog ? Cette démo va vous montrer toutes les étapes de la transformation.
Le jeu n'est pas réservé aux cinglés
Le design du blog est en "mode avancé" : chaque type de page peut avoir un CSS particulier en plus du CSS d'ensemble. Nous ne modifierons que le CSS de complément pour les "photos seules".C'est la seule particularité de l'album et la cuisine ici décrite est possible dès le niveau "confiance".
Scénario
Nous irons de haut en bas, en commençant par les galeries. Nous allons vraiment intervenir en direct sur la page, j'ai trop le respect du client pour vous présenter des copies d'écran ! Avec un outil comme l'inspecteur DOM de Firefox, vous verrez évoluer le style de la page
À propos de cette page : elle est semblable à n'importe quelle "vraie" page d'un "vrai" album, je lui ai seulement rajouté une (longue) section nommée "explications" et quelques id supplémentaires pour les besoins de l'exposé. Le reste du HTML est inchangé (un coup d'œil au source vous en convaincra), juste redisposé pour être plus lisible.
Maniement
Les instructions disparaîtront au fur et à mesure de leur exécution. Comme il serait trop difficile de revenir en arrière, je n'ai prévu qu'un lien pour tout reprendre à zéro. Donc ALLEZ-Y DOUCEMENT ! C'est facile mais, mine de rien, c'est assez dense.
Vous pourrez aussi, à tout moment, réduire ou développer tout le pavé pour dégager la vue.
Utilisateurs d'IE : la page peut prendre une drôle de tête par moments, cela vient de ce qu'elle n'est pas rafraîchie après chaque ajout. Cependant le résultat final est bel et bien correct : c'est le CSS réel de mes albums photo.
Alors, on commence ?
(et voici
l'article dont sort cette démo)
1 - Se débarrasser d'un titre inutile
Ce titre "Coups d'œil - Eiffel-E-O.jpg" doublonne avec l'indication de l'album (mis en évidence dans la liste des galeries) et le titre proprement dit de la photo. Donc, à la trappe ! C'est facile : puisqu'il est de classe h2Album, il suffit de cette ligne de CSS :
.h2Album {display:none}
Allez-y, la suite apparaîtra.
2 - La liste des galeries
Elle porte l'identifiant galeries, tout bêtement. Il faut, pour commencer :
a) disposer les liens en colonne plutôt qu'en ligne
#galeries a {display:block;}
Hop !
b) fixer une largeur à l'ensemble de #galeries
#galeries {width:205px;}
Hop !
c) placer le tout en absolu
#galeries {position:absolute;}
Zou !
Pas mal pour un début. On fignolera le placement plus tard, maintenant il faut resserrer la partie "photo".
Zou !
3 - Rétrécir la partie "photo"
Elle se compose de plusieurs éléments. On en découvre les noms et l'organisation en examinant le code source. Pour vous épargner cette corvée, il vous suffit de passer le curseur sur les liens ci-dessous (inutile de cliquer) :
La manœuvre (utilisée dans les liens précédents) est tout simplement de changer la marge gauche de ces quatre éléments ; en d'autres termes :
.quickNavAlbum, .nomPhotoAlbum, #photo,
.decrPhotoAlbum {margin-left:215px;}
Hop !
Ça prend forme. Attaquons-nous aux imagettes.
Zou !
4 - Les imagettes
En dessous de la photo, vous les voyez ? Même genre de travail que pour les galeries, avec des raffinements.
La structure des imagettes est plus complexe que celle des liens de la galerie : chaque image est incluse dans un lien de classe thumbAlbum ou thumbCouranteAlbum, lui-même inclus dans un div de classe thumbAlbum lui aussi : à l'occasion, il faudra savoir les distinguer.
Pour obtenir une disposition en ligne, j'avais écrit .thumbAlbum {display:inline}, il faudra donc corriger en :
.thumbAlbum, .thumbAlbum a {display:block}
Et naturellement, pour que le panneau d'imagettes passe en "absolu" (j'ai aussi calculé top pour le faire remonter) :
.thumbsAlbumContainer {position:absolute;
width:205px; top:116px;}
Tout en une fois, zou !
Gasp ! Ça commence à ressembler à une colonne de navigation, mais… ça masque les galeries, ce n'est pas aussi haut que la partie droite… du calme.
Pour remettre les galeries au premier plan, y a un truc (que nous regarderons de plus près dans le prochain article) :
#galeries { z-index:2;}
Hop !
Du coup, ce menu masque le haut de la pile d'imagettes. Pour la faire descendre, donnons au panneau un padding supérieur assez grand :
.thumbsAlbumContainer {padding-top: 115px;}
Hop !
Meilleur mais encore un peu court. Pour que la colonne, avec 1 ou 5 imagettes, soit toujours aussi haute que la partie photo il lui faut une hauteur bien ajustée :
.thumbsAlbumContainer { height:577px; }
Zou !
On avance. Avant de traiter la pagination, je voudrais enjoliver un peu les imagettes.
D'abord un peu de ménage. Pour la bande horizontale on avait ajouté des marges et bordures aux images, retour aux valeurs sûres
.thumbAlbum img
{ margin:0;padding:0;border:0;}
Hop !
Structure : chaque imagette est une img, incluse dans un lien a, lui-même inclus dans un div de classe thumbAlbum : trois niveaux d'intervention possibles.
Une imagette mesure au maximum 100 pixels de côté. En ménageant 1 pixel pour une future bordure, elle s'incrit donc dans un carré de 102 pixels de côté. Pour établir ce carré, je choisis le div div.thumbAlbum, et rajoute 2 pixels en largeur parce je sais qu'il traîne des espaces dans le code HTML du lien :
div.thumbAlbum {height:102px; width:104px;}
D'accord, ce n'est plus rigoureusement un carré. Mais je garde le mot, na !
Notez le sélecteur un peu spécial. En effet :
- div.thumbAlbum (sans espace) est "un div de classe thumbAlbum", alors que
- .thumbAlbum n'est que "un thumbAlbum" y compris certains liens et que
- div .thumbAlbum (avec espace) est "un thumbAlbum dans un div quelconque", ce qui en pratique revient au même.
Vous avez bien tout lu ? On avance ?
Depuis que la largeur est fixée à 104px, tout a filé à gauche. Patience…
Puisque les liens sont devenus des blocs contenus dans un bloc de 104 pixels de large, inutile d'indiquer leur largeur (on pourrait). Pour qu'ils écrivent bien leur "texte" (en fait, une image) sur 102 pixels de hauteur, précisons leur hauteur de ligne. Au passage, collons-leur un fond gris foncé :
.thumbAlbum a {background:#707070;
line-height:102px; padding: 0;}
… fond qui s'éclaircira un peu au survol :
.thumbAlbum a:hover {background:#909090}
Pourquoi du gris ? Attendez la suite !
Hop !
Petite fioriture, rajouter une bordure claire à l'imagette en cours :
.thumbCouranteAlbum img
{border:1px solid #fcf9ec;}
Zou !
Ça devient sérieux.
Grosse fioriture, j'ai une mimi image de pellicule photo pour le fond de la colonne. Je choisis d'appliquer ce fond au div de classe center qui enveloppe les imagettes, comme ça je pourrai ensuite le caler finement dans le panneau :
.thumbsAlbumContainer .center {
margin:0; padding:0;
background:transparent
url([blablabla]pellicule.gif) repeat-y ;}
Hop !
Pas bien chouette, hein ? C'est le moment de caler la colonne dans le panneau pour laisser de la place à la pagination, puis de caler les imagettes dans la colonne.
Pour caler la colonne j'ai choisi de jouer sur la géométrie du panneau thumbsAlbumContainer plutôt que sur celle de la colonne, on aurait pu faire l'inverse. Donc je corrige le width et les padding latéraux – notez que le total reste égal à 205 :
.thumbsAlbumContainer
{ width:120px;
padding-right:10px; padding-left:75px;}
Hop !
Pour séparer les carrés contenant les imagettes, on joue sur leur padding haut et bas.
Pour centrer les carrés sur l'axe vertical de la colonne, astuce diabolique avec les marges auto, déjà vue ailleurs.
Pour caler les imagettes en hauteur, on joue sur leur margin haut et bas.
Pour centrer les images sur l'axe horizontal de leur carré, astuce encore plus diabolique, directement reliée au line-height déjà croisé, mais hélas astuce pas comprise par tous les navigateurs.
Les images se centreront toutes seules sur l'axe vertical des carrés parce qu'elles sont dans un div de classe center, laquelle classe dit que text-align:center - magique !
div.thumbAlbum
{padding:4px 0; margin:0px auto;}
.thumbAlbum img
{margin:0 0 2px; vertical-align:middle;}
Hop !
Une bonne chose de faite, passons à la pagination.
Zou !
5 - La pagination
On commence comme pour les imagettes : mise à la verticale, définition de la largeur, placement à la bonne hauteur :
.pagination { position:absolute;
top:340px; width:55px; }
.pagination a, .pagination b {display:block;}
Hop !
Décoration : supprimons la bordure, changeons quelques couleurs et dimensions, mettons en place des flèches dans le bon sens… je vous épargne les détails :
.pagination {border:none;}
.pagination a, .pagination b {margin:0 0 8px;
border-width:1px; background-color:#fcf9ec}
.pagination a {padding: 4px 0px 6px; }
.pagination a:hover {background-color:#ede2cc}
.currentPage {padding: 0px ;
vertical-align:baseline;}
a.textNext:hover, a.textLast:hover,
a.textPrevious:hover, a.textFirst:hover
{color:#ede2cc}
.textNext, .textPrevious ,
.textLast, .textFirst
{text-align:left; padding-left:0;color:#fcf9ec;
background-position:center center}
.textLast {padding-left :5px; }
.textNext {background-image:
url([blablabla]nav16V-Next.gif) }
.textPrevious {background-image:
url([blablabla]nav16V-Previous.gif) }
.textLast {background-image:
url([blablabla]nav16V-Last.gif) }
.textFirst {background-image:
url([blablabla]nav16V-First.gif) }
Zou !
Après ça, on passera aux choses sérieuses…
6 - Alignement des pavés
Toutes les pièces ont l'aspect désiré, reste à les mettre en place précisément. Cela concerne trois pavés :
- #galeries liste des albums disponibles,
- .thumbsAlbumContainer panneau d'imagettes,
- .pagination pagination pour avancer de 5 en 5 photos.
Qu'ils soient tous à peu près alignés sur la gauche n'est que de la chance : au départ ces côtés gauches étaient déjà tous presque à l'aplomb et le passage en absolu n'y a rien changé. Fi des coïncidences ! Nous souhaitons une maîtrise complète.
Pour le placement vertical vous avez déjà vu passer top. Sur la lancée, utilisons left pour le placement horizontal. La pagination est ce qu'on fait de plus décalé sur la page, nous commencerons donc par elle. Si on essaye ça :
.pagination {left:30px;}
… qu'est-ce que ça donne ?
Wheu… la cata ! La pagination est à 30 pixels du bord gauche de la fenêtre, ce qui n'a aucun intérêt ici :une largeur de fenêtre, ça varie. Ce qu'on veut, c'est que le corps
de la page d'album serve de référence.
OR, justement, ce corps
porte un identifiant, à savoir #general (passez sur le lien pour voir). OR, justement, je vous ai parlé d'une manœuvre diabolique pour en faire la référence des absolus désorientés :
#general {position:relative;}
/* sans indiquer aucun décalage */
Cela ne va aucunement faire bouger le corps du blog, mais donner un cadre
à tous les pavés que nous avons mis en position:absolute.
Chiche ?
Gagné ! Comme le panneau d'imagettes est OK, ne reste plus qu'à placer les galeries :
#galeries { left:23px;
margin-left:0; margin-top:2px;}
Zzzzzzzzzzzzou !
Ben voilà, c'est fini. Réduisez ce pavé pour admirer le résultat : ce que vous êtes bon, tout de même…
Remarquez juste une chose : dans le CSS que nous venons d'ajouter, c'est la mise en forme de la pagination qui prend le plus de place !
Le changement de mise en page proprement dit se résume à mettre quelques pavés en position:absolute, préciser leurs dimensions et leur emplacement, mettre des liens en display:block pour qu'ils s'empilent au lieu de se juxtaposer, et c'est à peu près tout.
Le reste n'est que du travail décoratif…