Come usare un iframe
Un <iframe> mostra un'altra pagina dentro la tua. Dagli l'indirizzo della pagina in src, un title che la descrive e una dimensione:
<iframe src="https://example.com/" title="Example site" width="600" height="400"></iframe>
Il frame carica la pagina come documento separato, con i suoi stili e i suoi script. Gli esempi di questa pagina usano srcdoc invece di src, che mette l'HTML del frame direttamente nell'attributo, così funzionano senza caricare un altro sito:
Il paragrafo esterno è blu e in grassetto; quello dentro il frame no, anche se nella pagina c'è la stessa regola p. Gli stili non attraversano mai il confine del frame, in nessuna delle due direzioni. Il bordo predefinito e la dimensione predefinita di 300×150 vengono dal browser; gli attributi width e height sostituiscono la dimensione.
Incorporare un video di YouTube o una mappa
I siti di video e i servizi di mappe ti danno codice iframe già pronto. Su YouTube, premi Condividi, poi Incorpora:
<iframe width="560" height="315"
src="https://www.youtube.com/embed/VIDEO_ID"
title="YouTube video player"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
Per Google Maps, apri il luogo, premi Condividi, poi Incorpora una mappa, e copia l'iframe allo stesso modo. Mantieni il title (i lettori di schermo lo annunciano quando si entra nel frame) e sostituisci le dimensioni fisse con il CSS responsive qui sotto. L'attributo allow concede al frame funzioni come autoplay o schermo intero che per le pagine incorporate sono disattivate di default.
Dimensioni, bordo e iframe responsive
I codici di incorporamento copiati usano dimensioni fisse in pixel, che sui telefoni escono dallo schermo. width: 100% più aspect-ratio fanno riempire al frame il suo contenitore mantenendo le proporzioni, e border: 0 toglie il bordo inset predefinito:
Cambia max-width: 480px con un altro valore e il frame mantiene le proporzioni 16:9 a ogni larghezza. Togli border: 0 per vedere il bordo predefinito del browser. I vecchi attributi frameborder, scrolling e marginheight sono obsoleti; usa il CSS.
sandbox: limitare quello che il frame può fare
Un frame può eseguire script, inviare form e aprire popup come qualsiasi pagina. L'attributo sandbox gli toglie questi poteri; un sandbox vuoto blocca quasi tutto, e ogni parola chiave ne restituisce uno. I due frame qui sotto ricevono lo stesso HTML con un piccolo script:
Il primo frame mantiene il testo segnaposto perché il suo script non viene mai eseguito (la console di Chrome registra per lui un messaggio "Blocked script execution"). Usa sandbox ogni volta che incorpori contenuti di cui non ti fidi del tutto, come HTML scritto dagli utenti, e aggiungi solo le parole chiave che servono:
| Parola chiave | Permette |
|---|---|
allow-scripts | Eseguire JavaScript |
allow-forms | Inviare form |
allow-popups | window.open e link target="_blank" |
allow-modals | alert(), confirm() e prompt() |
allow-same-origin | Trattare il contenuto come la sua vera origine (cookie, storage) |
allow-top-navigation | Portare l'intera scheda fuori dalla tua pagina |
Non combinare mai allow-scripts e allow-same-origin per contenuti della tua stessa origine: lo script incorporato potrebbe allora togliersi da solo la sandbox.
Comunicare con un frame: postMessage
La pagina esterna e il frame sono documenti separati. Quando le loro origini sono diverse non possono toccare l'uno il DOM dell'altro, ma possono scambiarsi messaggi. Scrivi un messaggio e mandalo dentro il frame:
Nel codice vero, passa l'origine esatta del frame (come 'https://maps.example.com') invece di '*', e controlla e.origin nel destinatario, così i messaggi vanno solo al sito che ti aspetti e arrivano solo da lui.
Prestazioni e siti che si rifiutano
- Lazy loading. Aggiungi
loading="lazy"ai frame in fondo alla pagina; il browser li carica solo quando chi legge ci arriva vicino scorrendo. Ogni iframe è un caricamento completo di pagina, quindi una pagina con molti contenuti incorporati diventa lenta senza. - "Connessione rifiutata". Molti siti (banche, quasi tutti i social network, la ricerca Google) inviano un'intestazione
X-Frame-Optionsoframe-ancestorsche vieta l'incorporamento, e il browser mostra un errore nel frame. La tua pagina non può aggirarla. Usa l'URL di incorporamento ufficiale del sito, o un link. - Accessibilità. Imposta sempre
title. È il nome con cui un lettore di schermo indica il frame, e una pagina con diversi frame senza titolo è difficile da esplorare.
Errori comuni
- Un
titlemancante. I lettori di schermo annunciano il frame senza nome. - Larghezze fisse dal codice di incorporamento copiato. Sostituiscile con
width: 100%easpect-ratio. - Incorporare un normale file video. Per un tuo file
.mp4, usa l'elemento video; gli iframe sono per le pagine. - Fidarsi del contenuto incorporato. Aggiungi
sandboxper tutto quello che non hai scritto tu. - Aspettarsi che il CSS esterno dia stile al frame. Dai stile alla pagina incorporata dal suo interno.
Domande frequenti
Cos'è un iframe in HTML?
Un <iframe> (inline frame) è un riquadro che mostra una pagina web separata dentro quella attuale. Ha il suo documento, i suoi stili e i suoi script, ed è per questo che si usa per contenuti incorporati come video, mappe, pubblicità e anteprime di codice.
Come incorporo un video di YouTube con un iframe?
Su YouTube scegli Condividi, poi Incorpora, e copia il codice. È un iframe il cui src è https://www.youtube.com/embed/ più l'id del video. Mantieni gli attributi title e allowfullscreen, e usa nel CSS aspect-ratio: 16 / 9 con width: 100% per renderlo responsive.
Perché il mio iframe dice che il sito ha rifiutato la connessione?
Il sito invia un'intestazione X-Frame-Options o Content-Security-Policy: frame-ancestors che vieta ad altri siti di incorporarlo. Molti siti lo fanno per prevenire il clickjacking. Non puoi aggirarla dalla tua pagina; usa l'URL di incorporamento ufficiale del sito, se ne ha uno.
Come tolgo il bordo di un iframe?
Imposta border: 0 nel CSS. Il vecchio attributo frameborder="0" è obsoleto, anche se molti codici di incorporamento copiati lo includono ancora.
Come rendo responsive un iframe?
Dagli width: 100% e un aspect-ratio nel CSS, per esempio aspect-ratio: 16 / 9 per un video, e lascia fuori un'altezza fissa. L'iframe si adatta allora al suo contenitore e mantiene le proporzioni.
Cosa fa l'attributo sandbox su un iframe?
Un attributo sandbox vuoto blocca script, invio di form, popup e altro dentro il frame, e tratta il suo contenuto come proveniente da un'origine unica. Poi permetti solo quello che serve al contenuto incorporato con parole chiave come allow-scripts o allow-forms.