Les frames (cadres)

V'là aut' chose !
Les frames permettent également un découpage de la page, mais à la différence des tables, ce découpage est composé d'autant de documents HTML indépendants que de frames, de plus il est même possible de faire ouvrir d'autres fenêtres plutôt que de travailler dans celle de départ.

Je n'expliquerais pas ici comment rendre fou un utilisateur au moyen de fenêtres récursives, ni la façon de faire "planter" une machine se connectant dans une page piège, de tels risques pouvant de toute manière se produire avec des découpages complexes, mais seulement la façon de couper une page en deux (ou en trois) de manière à pouvoir accompagner vos pages d'un navigateur et d'un éventuel (hum..) entête, ce qui me semble déjà, la limite du supportable.

Deux frames ça va, mais trois, bonjour les dégâts ! (slogan piqué à la sécurité routière).


Mode d'emploi
En plus des documents contenus dans chaque frame, il faut créer le découpage de la page, c'est la page mère (appelons-la page0.html), elle ne contient rien d'affichable même si c'est un fichier html comme les autres, elle définit seulement:
  • les zones où l'on crée les frames dans la fenêtre du navigateur (avec FRAMESET et COLS ou ROWS)
  • quel est le document initial contenu dans la frame (avec FRAME SRC="", et le nom de celles-ci (avec NAME)
Le document initial s'affiche lui, sauf bien entendu s'il s'agit d'un nouveau découpage de frames.

Exemple de page mère:

<HTML>
  <HEAD>
    <TITLE>Le titre de l'ensemble des frames suivantes</TITLE>
  </HEAD>
  <FRAMESET COLS="*,180" BORDER="1">
    <FRAME SRC="page1.html" NAME="cible1">
    <FRAME SRC="nav.html" NAME="cible2">
  </FRAMESET>
  <NOFRAMES>
    <HR><H3>Votre navigateur n'affiche pas de frames:</H3><P>
    Pour voir les pages utilisez le <A HREF="nav.html">navigateur</A>,
    sélectionnez la page de votre choix, puis utilisez le bouton arrière de votre
    navigateur pour sélectionner une autre page.
  </NOFRAMES>
</HTML>

Ce qui donne:

Une frame du bord gauche de la page jusqu'à 180 pixels du bort de droite (grâce à COLS), contenant le document "page1.html" et de nom "cible1".
Une frame à droite (je suis droitier mais surtout anti-conformiste) de la page de 180 pixels de large, contenant le document "nav.html" et de nom "cible2".

Page mère (page0.html) (invisible)
page1.html

"cible1"
n
a
v
.
h
t
m
l

"
c
i
b
l
e
2
"

Observation importante, il n'y a pas de champ <BODY> dans la page mère, une déclaration de frames ne doit pas contenir de texte, celui-ci ne sera de toutes façons pas affiché, sauf sur un navigateur ne gérant pas les frames ou dans le cas ou celles-ci sont désactivées.

N'ommettez pas le titre dans la page mère entre <TITLE> et </TITLE>, car même s'il ne se voit pas, il peut-être d'une grande aide pour les non-voyants (dans les frames aussi d'ailleurs).


Le marqueur <NOFRAMES> permet de passer du texte pour ces cas-là, vous pouvez alors rediriger l'utilisateur sur des pages sans frames, ou utiliser chaque morceau de frame comme page "normale" en sautant les définitions de frames, ou encore, utiliser un "navigateur" contenant des liens sur les pages principales comme suggéré dans l'exemple ci-dessus.

COLS et ROWS déterminent le sens du découpage (dans le sens de la lecture), à savoir respectivement colonnes ou rangées, dont la quantité est à votre discrétion, mais dont le total ne doit pas dépasser la taille de la page. Dans l'exemple ci-dessus on a défini par <FRAMESET COLS=""> tout le reste de la page avec *, puis, une bande verticale de 180 pixels de large. On aurait aussi bien pu utiliser ROWS="*,10%" (ou ROWS="90%,10%") pour définir la presque totalité de hauteur disponible de la page et un bandeau horizontal, en bas, de 10% (il est bien sûr aussi possible de donner une valeur en pixels à la place d'un pourcentage, mais comme le total ne doit pas dépasser 100%, il faudra alors aussi utiliser *).

On défini ensuite le contenu de départ de la première frame avec <FRAME SRC="xxx">, puis de la seconde, dans ce cas-ci on charge une page de départ originalement baptisée "page1.html" dans la zone nommée "cible1" et une autre nommée "nav.html" dans la zone "cible2" (noms donnés grâce à l'option NAME="xxx" de FRAME et qui serviront plus loin).

Supposez par exemple que le navigateur (nav.html) contienne un certain nombre de liens sur toutes vos pages (par hasard) et que ces liens s'appellent (par pure coïncidence) "page2.html", "page3.html", etc...

Et bien c'est raté, en l'absence de toute précision un clic sur un de ces liens chargera le document voulu MAIS DANS LA FRAME SUR LAQUELLE VOUS AVEZ CLIQUE c'est à dire (dans ce cas-ci) à l'intérieur de la frame navigateur, ce qui n'est pas vraiment l'effet souhaité.

Il est absolument nécessaire en cas d'utilisation de frames de préciser pour chaque lien existant, le nom de la frame dans laquelle charger un document (sauf bien entendu si l'on souhaite qu'il se charge dans la frame où se trouve le lien).

Ceci se fait grâce à l'option TARGET du marqueur <A HREF=""><A HREF="page2.html" TARGET="cible1">Page 2</A>

Ce qui placera bien entendu la page2 dans la partie principale dénommée "cible1" dans la déclaration <FRAME>.

Si ce n'est pas encore assez clair voici une autre explication: HREF="" contient le nom du document à charger et TARGET=""contient le nom de la frame où charger ce document.

Si vous voulez changer le navigateur lui-même par un autre document avec un lien placé dans n'importe quel document (y compris nav.html lui-même), il suffit de faire ceci:

<A HREF="nav2.html" TARGET="cible2">Changement de navigateur</A>

Ce qui placera le document "nav2.html" dans la frame "cible2", simple et de bon goût.


Découpage simple
Tant que l'on découpe la page dans un seul sens verticalement ou horizontalement et quel que soit le nombre de morceaux, il n'y a pas de complications et on peut sauter l'exemple ci-dessous, mais si vous souhaitez créer des déclaration de frames complexes en les imbriquant comme les tables, apprenez qu'une telle méthode est fortement déconseillée, car elle ne permet pas un remplacement en bloc d'une déclaration de frame particulière (une page mère) et de tous les documents liés à cette déclaration.

Découpage complexe
Dans le cas de découpage multiple, il vaut mieux utiliser la page 1 de cet exemple (page1.html), comme une autre page déclaration de frame qui couperait par exemple, la frame centrale en deux nouveaux morceaux horizontaux tout en gardant le navigateur à droite...

Perdu ? C'est normal l'explication verbale est un peu raide, voici un petit dessin qui devrait être plus clair. Si on remplace la page 1 "normale" (ex page1.html) par une autre déclaration coupant horizontalement en deux la page on obtient:

Page mère no 1 (page0.html) (invisible)
Page mère no 2 (page1.html) (invisible)

page2.html
-
"dessus"
-
page3.html
-
"dessous"
-
n
a
v
.
h
t
m
l

"
c
i
b
l
e
2
"

Pour réaliser ceci, il suffit que le document "page1.html" contienne la déclaration de frames suivante:

Deuxième page mère:

<HTML>
  <HEAD>
    <TITLE>Le titre de l'ensemble des frames suivantes</TITLE>
  </HEAD>
  <FRAMESET ROWS="*,*" BORDER="1">
    <FRAME SRC="page2.html" NAME="dessus">
    <FRAME SRC="page3.html" NAME="dessous">
  </FRAMESET>
</HTML>

Ce qui nous donne maintenant, cinq documents HTML, trois "cibles" (ou frames, ou zones, ou morceaux de fenêtre), une bonne migraine et un raton laveur.

Résumé des documents:

  1. page0.html (page mère 1)
  2. nav.html (le navigateur)
  3. page1.html (page mère 2)
  4. page2.html (en "dessus")
  5. page3.html (en "dessous")

Il est bien clair que les noms de page ne sont plus très appropriés, mais je n'ai pas voulu compliquer les choses en changeant ces noms en cours d'explication, à vous de les choisir au départ de manière correcte.

Résumé des cibles:

  1. cible2
  2. dessus
  3. dessous

A vous de rajouter autant de demi-pages que vous voulez, à placer sens dessus-dessous (tout ce boulot pour un mauvais calembour, faut le faire hein ?) et de rajouter les liens correspondants dans nav.html.


Et grâce au fait que ces déclarations ne sont pas imbriquées, il est possible avec n'importe quel lien de faire "sauter" la coupure horizontale de la page en remplaçant la page mère no 2 par autre chose (qui pourrait tout aussi bien redécouper la page en deux verticalement), tout en gardant le navigateur...

Comment ? Eh bien c'est très simple, la page mère no 2 (page1.html) a été dénommée "cible1" dans la page mère no 1 (page0.html, voir tout en haut), et donc un lien avec TARGET="cible1" pointant sur un nouveau document (page4.html par exemple) accomplira un tel miracle, comme réexpliqué différement ci-dessous pour ceux qui ont sauté cette partie.


Le contrôle des frames
C'est pas fini ! Voici quelques petites bricoles bonnes à savoir:

Si on remplace une déclaration de frame (une page mère) par une page normale, toutes les frames enfants de celle-ci disparaissent, pour enlever la toute première frame il suffit de remplacer la page mère no 1 par un simple document, mais si vous voulez être sûr d'enlever toutes les frames (un site qui à mis un lien chez vous dans une de ses frames par exemple), il faut utiliser le nom "_top" dans l'option TARGET.

Par exemple le lien suivant placé où vous voulez et qui "vire" toutes les frames:

<A HREF="menu.html" TARGET="_top">Menu</A>

Quelques autres options possibles pour changer une frame cible:
  • TARGET="_parent"
    Pour changer la frame parent (un niveau en dessus de la frame courante), pratique parce que non-nominatif, peut servir à revenir en arrière pas à pas avec des vielles croûtes buggées comme net$crade 3 et moins.
  • TARGET="_self"
    Désigne la frame courante, permet de faire atterrir un même document dans n'importe quelle frame de départ (je ne vois pas la différence entre ça et l'omission de TARGET).
  • TARGET="_blank"
    LE PIRE ! Ouvre une frame dans une nouvelle fenêtre, à utiliser exceptionellement et avec discernement.

Attention, il faut absolument mettre ces options en caractères minuscules, tels que montrés ci-dessus.

Les options de <FRAMESET>:

  • ROWS= Rangées
  • COLS= Colonnes
  • BORDER= Epaisseur du bord
  • BORDERCOLOR= Couleur du bord
  • FRAMEBORDER="NO" Bord de frame (MSIE/Netscape)
  • FRAMESPACING= Espace entre frames (MSIE Uniquement)

Les options de <FRAME>:

  • NORESIZE= Taille fixe (le bord ne peut pas être déplacé avec la souris)
  • SCROLLING= Barre de défilement (YES/NO/AUTO)
  • MARGINHEIGHT= Marge haut/bas
  • MARGINWIDTH= Marge gauche/droite
  • FRAMEBORDER="NO" Bord de frame (MSIE/Netscape)

Attention aussi de ne pas déclarer plus de 100% avec FRAMESET, sinon les résultats peuvent être imprévisibles, il vaut mieux utiliser le symbole "*" dans un découpage, ce qui en plus, évite les calculs...


Pas si vite
Et voilà ! Vous savez presque tout des frames, mais si le principe est simple, l'application peut devenir un vrai cauchemar, la multiplication des frames, peut vite devenir la multiplication des ennuis, mais heureusement il y a de nombreux exemples sur le sujet à la fin du guide dont vous pourrez vous inspirer.

Dans votre intérêt, il vaut mieux dépoussiérer une feuille de papier et exhumer un reste de crayon pour esquisser une stratégie, établir un plan et donner des noms au frames avant de les créer, (c'était le judicieux conseil gratuit et désintéressé de la page 11, sans supplément de prix).


RetourInfo Suite

Dernière mise à jour de cette page: 04/09/2001, visiteurs: depuis le 6 avril 2002