HTML5 / CSS 2.x/3 / PHP / MySQL ...

<

La mise en page avec positionnement CSS

Beaucoup de concepteurs de pages web n'abordent pas ou trop peu le positionnement des éléments constituant leur page web par CSS.

C'est pourtant le moyen le plus simple pour avoir des pages homogènes et dont la présentation est stable sur tous les navigateurs. C'est ce qu'on va s'efforcer de démontrer ici.

La notion de bloc pour le positionnement CSS

En HTML5 - comme en HTML4 d'ailleurs -, il existe deux type d'éléments:

On ne peut positionner avec CSS que des éléments de type blocs. Exemple:

<div style='position: absolute; top: 10px; left: 40px; background-color: yellow;'>
    Ce texte est positionné
</div>

Ici, le contenu de l'élément div sera positionné en haut de page. Par contre:

<span style='position: absolute; top: 10px; left: 40px; background-color: yellow;'>
    Ce texte n'est pas positionné
</span>

Le contenu de l'élément span ne sera pas positionné, car span n'est pas un élément délimitant un bloc.

En HTML5, de nouveaux éléments servent de marqueurs sémantiques destinés à se substituer à l'élément div: article aside section header footer etc....

Voir: Un web plus sémantique avec HTML5

Ces nouveaux éléments ne délimitent pas des blocs. Initialement l'élément div marque un bloc. Pour remplacer ceci:

<div class="header">Mon en tête de page</div>

par ceci:

<header>Mon en tête de page</header>

Il est nécessaire d'indiquer par l'intermédiaire de CSS que cet élément header est un bloc:

<header style='display: block;'>Mon en tête de page</header>

A partir de cet instant, header se comportera comme div et on pourra le positionner en CSS. Pour ne pas oublier d'indiquer les nouveaux éléments HTML5 comme éléments en tant que délimiteurs de blocs, on définira en tête de son CSS ceci:

article, aside, header, footer, nav {
    display: block;
}

Le positionnement par feuille de style

Dans le précédent article on expliquait la mise en page simple. Nous allons repartir de ceci pour aborder le positionnement CSS appliqué aux nouveaux éléments HTML5:

<div id='tetePage'>...texte de l'en-tête...</div>
<div id='contenuPage'>....contenu du corps de page...</div>
<div id='piedPage'>...contenu du pied de page...</div>

et que nous allons préalablement réécrire avec des éléments HTML5. Il est entendu que ces nouveaux éléments sont définis en CSS comme délimitant des blocs:

<header>...texte de l'en-tête...</header>
<article>....contenu du corps de page...</article>
<footer>...contenu du pied de page...</footer>

Voici le code CSS appliqué à l'élément header pour le positionner:

body header {
    position: absolute;
    top: 0px;
    left: 0px;
    width:600px;
    height:50px;
    background-color:hotpink;
    }
 
body article {
    position: absolute;
    top: 50px;
    left: 0px;
    width:600px;
    height:400px;
    background-color:aquamarine;
    }
body footer {
    position: absolute;
    top: 450px;
    left: 0px;
    width:600px;
    height:50px;
    background-color:yellow;
    }

Il est vrai que pour notre exemple, le positionnement css n'est pas nécessaire. Mais si on veut rajouter un bloc latéral aside, ça devient plus compliqué de le réaliser sans positionnement css:

body header {
    position: absolute;
    top: 0px;
    left: 0px;
    width:800px;
    height:50px;
    background-color:hotpink;
}
body aside { 
    position: absolute;
    top: 50px;
    left: 0px;
    width: 200px;
    height: 400px;
    background-color: greenyellow;
}
body article {
    position: absolute;
    top: 50px;
    left: 200px;
    width:600px;
    height:400px;
    background-color:aquamarine;
}
body footer {
    position: absolute;
    top: 450px;
    left: 0px;
    width:800px;
    height:50px;
    background-color:yellow;
}

et le code HTML qui va avec:

<header>...texte de l'en-tête...</header>
<aside>bloc latéral</aside>
<article>....contenu du corps de page...</article>
<footer>...contenu du pied de page...</footer>

et ce que ça donne à l'affichage:

positionnement en css

Là où ça devient intéressant, c'est quand on imbrique les éléments. Ainsi, un élément article peut contenir ses propres éléments header ou footer.

Positionnement des éléments imbriqués

A partir du moment où un élément est positionné par feuille de style CSS, il est isolé du contexte général. Pour bien comprendre ce mécanisme, voici comment on peut réaliser une mise en page très simple:

<aside>bloc latéral</aside>
<article>....contenu du corps de page...</article>

et qui aura rigoureusement le même effet si on écrit ceci:

<article>....contenu du corps de page...</article>
<aside>bloc latéral</aside>

L'inversion de l'écriture des éléments positionnés par feuille de style n'a aucune incidence sur leur positionnement par feuille de style. Voici un exemple très simple de code HTML avec un contexte général et un bloc latéral marqué par aside:

<body>
Ceci est le début du texte dans le contexte général.
<aside>bloc latéral</aside>
Ceci est la suite du texte dans le contexte général.
</body>

et ce qu'on retrouve à l'affichage:

positionnement en css

Dans un élément positionné par feuille de style css, donc indépendant du contexte général, on peut positionner des sous-éléments. Ces sous-éléments seront positionnés par rapport à l'élément qui l'englobe. Exemple:

body aside { 
    position: absolute;
    top: 50px;
    left: 0px;
    width: 200px;
    height: 400px;
    background-color: greenyellow;
}
body aside header {
    position: absolute;
    top: 6px;
    left: 6px;
    width: 188px;
    heigh: 24px;
    background-color: white;
}

et le code HTML associé:

<body>
Ceci est le début du texte dans le contexte général.
<aside>
    <header>tête bloc latéral</header>
bloc latéral
</aside>
Ceci est la suite du texte dans le contexte général.
</body>

et ce que ça donne à l'affichage:

positionnement en css

Nous allons maintenant déplacer le bloc latéral en le positionnant du coté droit:

/* début css inchangé */
body aside { 
    position: absolute;
    top: 50px;
    left: 600px;
    width: 200px;
    height: 400px;
    background-color: greenyellow;
}
body aside header {
    position: absolute;
    top: 6px;
    left: 6px;
    width: 188px;
    heigh: 24px;
    background-color: white;
}
body article {
    position: absolute;
    top: 50px;
    left: 0px;
    width:600px;
    height:400px;
    background-color:aquamarine;
}
/* fin css inchangé */

et le code HTML complet pour cet exemple:

<header>...tête de page...</header>
<aside>
    <header>tête bloc latéral</header>
bloc latéral
</aside>
<article>...corps de page...</article>
<footer>...pied de page...</footer>

et ce que ça donne à l'affichage:

positionnement en css

On constate que l'en-tête de notre bloc latéral marqué par header reste toujours positionné par rapport à l'élément contenant aside.

Souplesse et homogénéïté

Le positionnement des éléments par feuille de style css offre des avantages incontestables:

Voici un exemple d'en-tête de page qui exploite le positionnement par feuille de style css:

positionnement en css

et le code HTML qui permet d'afficher cet en-tête de site web:

<header>
    <img src="images/peintures_de_marc.gif" alt="bannière accueil"
              style="position: absolute; left: 90px;"/>
    <nav>
        <a href="index.php?page=accueilGalerie">galerie</a>
        <a href="index.php?page=autresSites">autres sites</a>
        <a href="index.php?page=ecrireMessage">contact</a>
    </nav>
    <span class="selectionLangue">
        sélection langue: 
        <a href="selectLangue.php?lang=fr"><img src='images/flag_fr.gif' alt='fr'/></a>
        <a href="selectLangue.php?lang=en"><img src='images/flag_en.gif' alt='en'/></a>
        <a href="selectLangue.php?lang=de"><img src='images/flag_de.gif' alt='de'/></a>
        <a href="selectLangue.php?lang=es"><img src='images/flag_es.gif' alt='es'/></a>
        <a href="selectLangue.php?lang=it"><img src='images/flag_it.gif' alt='it'/></a>
        <a href="selectLangue.php?lang=ru"><img src='images/flag_ru.gif' alt='ru'/></a>
        <a href="selectLangue.php?lang=jp"><img src='images/flag_jp.gif' alt='jp'/></a>
    </span>
</header>

Ici on utilise de manière exceptionnelle l'attribut class pour l'élément span. Pour le reste de la page, l'imbrication des éléments et l'affectation des styles respecte une hiérarchie simple. La refonte de l'aspect général d'un tel site sera très facile.

Tous les articles sur ce thème