Jak używać iframe
<iframe> wyświetla inną stronę wewnątrz twojej. Podaj adres strony w src, opisujący ją title i rozmiar:
<iframe src="https://example.com/" title="Example site" width="600" height="400"></iframe>
Ramka wczytuje stronę jako osobny dokument, z własnymi stylami i skryptami. Przykłady na tej stronie używają srcdoc zamiast src, co umieszcza HTML ramki bezpośrednio w atrybucie, więc działają bez wczytywania innej strony:
Zewnętrzny akapit jest niebieski i pogrubiony; akapit w ramce nie jest, choć na stronie działa ta sama reguła p. Style nigdy nie przekraczają granicy ramki, w żadną stronę. Domyślna ramka i domyślny rozmiar 300×150 pochodzą od przeglądarki; atrybuty width i height nadpisują rozmiar.
Osadzanie filmu z YouTube lub mapy
Serwisy z filmami i mapami dają gotowy kod iframe. Na YouTube naciśnij Udostępnij, a potem Umieść:
<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>
W Mapach Google otwórz miejsce, naciśnij Udostępnij, potem Umieść mapę i tak samo skopiuj iframe. Zachowaj title (czytniki ekranu ogłaszają go przy wejściu do ramki) i zastąp stałe rozmiary responsywnym CSS opisanym niżej. Atrybut allow daje ramce funkcje takie jak autoodtwarzanie czy pełny ekran, które dla osadzonych stron są domyślnie wyłączone.
Rozmiar, ramka i responsywny iframe
Kopiowane kody do osadzania używają stałych rozmiarów w pikselach, które na telefonach wychodzą poza ekran. width: 100% plus aspect-ratio sprawia, że ramka wypełnia kontener i zachowuje proporcje, a border: 0 usuwa domyślną wklęsłą ramkę:
Zmień max-width: 480px na inną wartość, a ramka zachowa proporcje 16:9 przy każdej szerokości. Usuń border: 0, żeby zobaczyć domyślną ramkę przeglądarki. Stare atrybuty frameborder, scrolling i marginheight są przestarzałe; używaj CSS.
sandbox: ograniczanie możliwości ramki
Ramka może uruchamiać skrypty, wysyłać formularze i otwierać wyskakujące okna jak każda strona. Atrybut sandbox odbiera jej te możliwości; pusty sandbox blokuje prawie wszystko, a każde słowo kluczowe przywraca jedną z nich. Obie ramki poniżej dostają ten sam HTML z małym skryptem:
Pierwsza ramka zachowuje tekst zastępczy, bo jej skrypt nigdy się nie uruchamia (konsola Chrome zapisuje dla niej komunikat "Blocked script execution"). Używaj sandbox zawsze, gdy osadzasz treść, której nie ufasz w pełni, np. HTML napisany przez użytkowników, i dodawaj tylko potrzebne słowa kluczowe:
| Słowo kluczowe | Pozwala na |
|---|---|
allow-scripts | Uruchamianie JavaScriptu |
allow-forms | Wysyłanie formularzy |
allow-popups | window.open i linki target="_blank" |
allow-modals | alert(), confirm() i prompt() |
allow-same-origin | Traktowanie treści jako pochodzącej z jej prawdziwego źródła (ciasteczka, pamięć) |
allow-top-navigation | Przeniesienie całej karty z twojej strony gdzie indziej |
Nigdy nie łącz allow-scripts z allow-same-origin dla treści z własnego źródła: osadzony skrypt mógłby wtedy usunąć własny sandbox.
Komunikacja z ramką: postMessage
Zewnętrzna strona i ramka to osobne dokumenty. Gdy ich źródła się różnią, nie mogą dotykać nawzajem swojego DOM, ale mogą wysyłać wiadomości. Wpisz wiadomość i wyślij ją do ramki:
W prawdziwym kodzie podawaj dokładne źródło ramki (np. 'https://maps.example.com') zamiast '*' i sprawdzaj e.origin po stronie odbiorcy, żeby wiadomości trafiały tylko do oczekiwanej strony i tylko od niej pochodziły.
Wydajność i strony, które odmawiają
- Leniwe wczytywanie. Dodaj
loading="lazy"do ramek daleko w dół strony; przeglądarka wczyta je dopiero, gdy czytelnik się do nich zbliży. Każdy iframe to pełne wczytanie strony, więc strona z wieloma osadzeniami bez tego zwalnia. - "Odmowa połączenia". Wiele stron (banki, większość sieci społecznościowych, wyszukiwarka Google) wysyła nagłówek
X-Frame-Optionslubframe-ancestors, który zabrania osadzania, a przeglądarka pokazuje w ramce błąd. Twoja strona nie może tego obejść. Użyj oficjalnego adresu do osadzania albo linku. - Dostępność. Zawsze ustawiaj
title. Dzięki niemu czytnik ekranu nazywa ramkę, a po stronie z kilkoma ramkami bez tytułów trudno się poruszać.
Częste błędy
- Brak
title. Czytniki ekranu ogłaszają ramkę jako nienazwaną. - Stałe szerokości ze skopiowanego kodu. Zastąp je przez
width: 100%iaspect-ratio. - Osadzanie zwykłego pliku wideo w ramce. Dla własnego pliku
.mp4użyj elementu video; iframe służy do stron. - Ufanie osadzonej treści. Dodaj
sandboxdo wszystkiego, czego nie piszesz samodzielnie. - Oczekiwanie, że zewnętrzny CSS wystylizuje ramkę. Stylizuj osadzoną stronę od środka.
Najczęściej zadawane pytania
Czym jest iframe w HTML?
<iframe> (inline frame, czyli ramka wewnętrzna) to pudełko, które wyświetla osobną stronę internetową w bieżącej. Ma własny dokument, style i skrypty, dlatego używa się go do osadzania filmów, map, reklam i podglądów kodu.
Jak osadzić film z YouTube przez iframe?
Na YouTube wybierz Udostępnij, potem Umieść i skopiuj kod. To iframe, którego src to https://www.youtube.com/embed/ plus identyfikator filmu. Zachowaj atrybuty title i allowfullscreen, a responsywność zapewnij w CSS przez aspect-ratio: 16 / 9 z width: 100%.
Dlaczego mój iframe pokazuje, że strona odmówiła połączenia?
Strona wysyła nagłówek X-Frame-Options lub Content-Security-Policy: frame-ancestors, który zabrania innym stronom osadzania jej w ramce. Wiele stron robi tak, żeby zapobiec clickjackingowi. Nie da się tego obejść z twojej strony; użyj oficjalnego adresu do osadzania, jeśli strona go ma.
Jak usunąć ramkę z iframe?
Ustaw border: 0 w CSS. Stary atrybut frameborder="0" jest przestarzały, choć wiele kopiowanych kodów do osadzania nadal go zawiera.
Jak zrobić responsywny iframe?
Nadaj mu width: 100% i aspect-ratio w CSS, na przykład aspect-ratio: 16 / 9 dla wideo, i pomiń stałą wysokość. Iframe skaluje się wtedy razem z kontenerem i zachowuje proporcje.
Do czego służy atrybut sandbox w iframe?
Pusty atrybut sandbox blokuje w ramce skrypty, wysyłanie formularzy, wyskakujące okna i nie tylko, a jej treść traktuje jako pochodzącą z unikalnego źródła. Potem zezwalasz tylko na to, czego potrzebuje osadzona treść, słowami kluczowymi takimi jak allow-scripts czy allow-forms.