Un iframe (inline frame : cadre, encadrement, carcasse en ligne) est un espace défini dans une page Web. Dans cet espace réservé on va pouvoir afficher une autre page Web provenant de notre site ou de n'importe quel autre site sur le réseau. Le W3C appelle cet espace un contexte de navigation et plus particuliérement contexte de navigation imbriqué (nested browsing context. En simplifiant c'est comme si on avait une nouvelle fenêtre (onglet) du navigateur à l'intérieur de la fenêtre (onglet) de la page principale. Cette fenêtre n'a pas de barre de menu ou de barre d'URL, mais elle aura éventuellement des barres de défilement. Elle a aussi son propre historique de navigation.

Le principe des iframes est utilisé par exemple pour embarquer des publicités sur un site, inclure des "widgets" provenant d'autres sites (météo, cours de la bourse, mur facebook, tweets, vidéos youtube, google map, etc) ou encore émuler un système d'onglets.

Ce qui est intéressant avec les iframes c'est que le temps de chargement et d'affichage de leur contenu ne bloque pas l'affichage de la page principale. Le navigateur fait d'abord le rendu de la page principale, réserve un espace pour l'affichage de la page embarquée dans l'iframe et quand il a fini le rendu principale s'occcupe du rendu du contenu de l'iframe.

Les exemples suivants nécessitent une connexion Internet car ils affichent des éléments se trouvant sur le réseau. Ce sont des widgets offerts par différents sites que l'on peut intégrer dans nos propres pages.

Exemple : Besançon avec google map
Exemple : prévisions météo
Exemple : vidéo youtube
Exemple : hit-parade spotify
Exemple : player deezer

Ce dernier exemple embarque une page twitter. Twitter ne fournit pas le code HTML pour intégrer un iframe mais un lien HTML et du code JavaScript. C'est l'exécution de ce code qui au final générera un iframe.

Exemple : tweets

L'élément <iframe>

On utilise l'élément iframe pour embarquer dans la page web en cours une autre page. La balise doit avoir une balise de fermeture </iframe> bien que le contenu de l'élément ne soit pas dans le fichier HTML.

Dimensions

L'élément iframe créant un espace d'affichage dans une page, il faut en définir les dimensions avec les attributs width et height. La valeur de ces attributs est un nombre de pixels, sans que l'unité ne soit précisée.

Il n'est pas possible que les dimensions d'un iframe s'adaptent automatiquement à leur contenu.
Si le contenu de la page embarquée est trop petit pour remplir complétement l'iframe, un espace vide sera généré.
Si le contenu de la page embarquée est trop grand pour tenir dans l'espace de l'iframe, une barre de défilement verticale et/ou une barre de défilement horizontale seront automatiquement créée par le navigateur pour que le contenu puisse être vu malgré tout.

L'attribut src

Comme pour tous les éléments embarqués, il faut aussi définir la localisation de la ressource sur le réseau. On utilise l'attribut src dont la valeur est l'URL de la ressource.
Bien sûr si la ressource est située dans un des dossiers de votre site, il faut utiliser une URL relative pour faire le lien.

Je vous rappelle qu'il convient d'être prudent avec les caractères utilisés pour les noms des fichiers et des dossiers qui les contiennent et je vous conseille (à nouveau) d'adopter les règles suivantes :

  • les noms de fichier et de dossiers étant sensibles à la casse, utilisez uniquement des minuscules,
  • utilisez uniquement les caractères aplhabétiques non accentués (de a à z), des chiffres (de 0 à 9), le caractère -, le caractère _ et le caractère .
  • n'utilisez jamais d'espaces.
Exemple : embarquer une page Web

En testant l'exemple, on voit que le navigateur a automatiquement placé une barre de défilement verticale pour que l'on puisse faire défiler la page embarquée et la consulter en entier.
Une barre de défilement horizontal aurait aussi été ajoutée automatiquement si cela avait été nécessaire.

iframe est un élément en ligne. Si vous agrandissez la fenêtre de test, vous verrez que le texte entoure l'iframe. Pour qu'un iframe soit considéré comme un bloc il faut le placer dans un élément p ou div, ou l'entourer par des éléments de bloc.

On peut avoir autant d'élements iframe que l'on veut dans une page.

Exemple : plusieurs iframes dans la page

Bordure

Dans les versions précédentes de HTML, des attributs permettaient de gérer la bordure entourant un iframe. Bien que ces attributs soient toujours supportés par les navigateurs, il convient maintenant d'utiliser des propriétés de style CSS pour agir sur l'aspect des iframes.

Par défaut les iframes sont entourés par une bordure de 1 ou 2 pixels. On peut gérer cette bordure avec plusieurs propriétés CSS comme border, border-style, border-color, etc.

L'exemple suivant montre comment enlever la bordure autour d'un iframe, ou comment changer sa couleur.

Exemple : gestion de la bordure

Barres de défilement

Comme on l'a vu dans les exemples précédents, le navigateur place automatiquement une barre de défilement verticale pour que l'on puisse faire défiler la page embarquée et la consulter en entier.

Avant HTML5, l'attribut scrolling permettait de gérer ces barres de défilement, mais cet attribut est déprécié et n'a pas été remplacé. Pour le moment, la propriété de style CSS overflow qui devrait gérer cet affichage n'est pas pris en compte pour les iframes par les navigateurs.
On continue donc d'utiliser l'attribut scrolling avec les valeurs :

  • no : aucune barre de défilement ne sera présente, et ce même si le contenu embarqué ne tient pas dans l'espace de l'iframe ;
  • yes : dans les versions anciennes de navigateurs, une barre de défilement verticale (et éventuellement une barre de défilement horizontale) seront présentes, et ce même si elles sont inutiles. Dans les nouvelles versions cette valeur réagit comme auto ;
  • auto : le navigateur gère automatiquement les barres de défilement (comportement par défaut).
Exemple : barres de défilement

Liens et iframes

Avec l'attribut target de l'élément a on va pouvoir faire un lien qui va s'afficher dans un iframe.

Pour que ça fonctionne, il faut que l'élément iframe soit nommé en utilisant un attribut name ou un attribut id. La valeur de cet attribut sera utilisée comme valeur de l'attribut target du lien.

Exemple : lien vers un iframe

Liens vers un iframe

Complétez le code HTML pour obtenir le résultat ci-dessous.

liens vers des iframes
arborescence de l'exercice

Quand on clique sur les petites images en haut de la page, une image correspondante de grandes dimensions s'affiche dans l'iframe situé sous les petites images.

L'iframe a pour dimensions 816 pixels sur 600. Il est entouré par une bordure noir de 1 pixel d'épaisseur.

Les images se trouvent dans l'arborescence ci-contre.

Pour simplifier, ne donnez pas les dimensions des images dans le code HTML.

Nom Dossier Correspondance Dossier
affiche_150.jpg lord_rings affiche_800.jpg images dans lord_rings
lego_150.jpg star_wars lego_800.jpg images dans star_wars
family_150.jpg star_wars family_800.jpg images dans star_wars

Code à compléter

Exercice : liens vers un iframe

Une solution possible

Exercice : liens vers un iframe

Liens vers des iframes

Réalisez des ensembles de liens et d'iframes pour obtenir le résultat ci-contre.

Quand on clique sur les images, une page HTML descriptive du personnage s'affiche dans l'iframe situé sous le personnage.

Les pages sur lesquelles pointent les liens se trouvent dans l'arborescence suivante :

arborescence de l'exercice

Les pages HTML concernant "Le Seigneur des Anneaux" se trouvent dans le dossier lord_rings.
Les images concernant "Le Seigneur des Anneaux" se trouvent dans le dossier lord_rings/images.

Les pages HTML concernant "La Guerre des Etoiles" se trouvent dans le dossier star_wars.
Les images concernant "La Guerre des Etoiles" se trouvent dans le dossier star_wars/images.

Les pages s'appellent du nom du personnage, tout en minuscules, et les espaces éventuels remplacés par un _ (underscore). L'extension du fichier est .html

Les images s'appellent du nom du personnage, tout en minuscules, et les espaces éventuels remplacés par un _ (underscore). L'extension du fichier est .png. Pour simplifier ne donnez pas les dimensions des images.

liens vers des iframes

Par ordre d'apparition : Gandalf, Frodon, Gimli, Sauron, Saroumane, Gollum, Yoda, Luke Skywalker, Chewbacca, Palpatine, Dark vador, Comte Dooku.

Code à compléter

Exercice : liens vers des iframes

Une solution possible

Exercice : liens vers des iframes

Une page dans un iframe peut aussi donner comme cible d'un de ses liens la page conteneur. La valeur de l'attribut target doit être le mot-clé _parent.

Code HTML de la page affichée dans l'iframe de l'exemple suivant :

<!DOCTYPE html>
<html lang="fr">
	<head>
		<meta charset="utf-8">
		<title>Lien vers le parent</title>
	</head>
	<body>
	
	<p>Ce lien va ouvrir la 
		<a href="gandalf.html" target="_parent">
		page gandalf.html</a> dans la fenêtre principale.
	</p>

	</body>
</html>
Exemple : lien vers le parent conteneur

Protection

Embarquer une page étrangère dans notre site peut s'avèrer dangereux car la page embarquée aura accès a l'environnement de la page parent : les cookies, le stockage local, les scripts, les éléments HTML, etc.

L'attribut sandbox permet de restreindre les droits des pages embarquées. sandbox travaille sur le principe de la liste blanche : d'abord on enlève tous les droits, puis on accord seulement les droits qui semblent nécessaires.

Si l'attribut sandbox est absent de la balise d'ouverture de l'élément iframe, la page embarquée a tous les droits. Si c'est une page de votre site, c'est normal, par contre si c'est une page d'un autre site c'est peut-être trop.

Exemple : pas de sandbox

Si la valeur de l'attribut sandbox est une valeur vide (<iframe sandbox="" src="http/site.com/page.html"> ) on enlève le maximum de droits :

Exemple : sandbox sans valeur

Pour accorder des droits à la page embarquée, on va donner comme valeur à l'attribut sandbox une liste de mots-clés :

Exemple : sandbox avec popup et scripts