How to make an iframe scrollable on iOS?

Proč iframe selhává na iOS 14.6 a jak na to?

03/03/2026

Rating: 4.68 (5367 votes)

V digitálním světě, kde se webové stránky neustále vyvíjejí, se některé dřívější pilíře webového designu stávají překážkou, zejména na moderních mobilních platformách. Jedním z takových prvků je HTML tag <iframe>, který slouží k vložení obsahu z jiné webové stránky do aktuálního dokumentu. Ačkoli byl kdysi nezbytným nástrojem pro vkládání externího obsahu, dnes s sebou nese řadu výzev, obzvláště na zařízeních se systémem iOS. Problémy s posouváním, prázdné stránky a bezpečnostní omezení se staly běžnou realitou pro vývojáře, kteří se snaží integrovat iframy do svých projektů. Tento článek se podrobně zaměří na úskalí používání iframů na iOS, s důrazem na verzi 14.6, a prozkoumá příčiny, proč se mohou zdát nefunkční, a jaké existují alternativy.

Does iframe still show?
It still displays, but comes out small on a vertical value. Thank you, erick. I tried that and it still didn’t show. It does show on Chromes developer tools mobile display. But on the actual devices themselves it’s like the iframe is completely ignored.
Obsahový index

Problémy s posouváním iframe na iOS: Proč stránka "skáče"?

Jedním z nejčastějších a nejfrustrujících problémů, se kterými se vývojáři setkávají při práci s iframy na iOS, je nepředvídatelné chování posouvání. Uživatelé často hlásí, že při pokusu o posouvání obsahu uvnitř iframu se celá stránka najednou přesune na začátek. Tento jev, známý jako "skákání" stránky, je specifický pro Safari na iOS a souvisí s tím, jak Apple optimalizuje posouvání a vykreslování obsahu.

Standardní CSS vlastnost overflow: scroll; sice funguje na většině desktopových prohlížečů, ale na iOS nemusí poskytovat očekávaný plynulý zážitek. Apple pro své mobilní prohlížeče zavedl proprietární vlastnost -webkit-overflow-scrolling: touch;, která má zajistit nativní, plynulé posouvání s inercií, podobně jako u nativních aplikací. Ačkoli se zdá, že tato vlastnost je řešením, v kombinaci s iframy se mohou objevit komplikace.

Hlavní příčinou skákání je často způsob, jakým iOS zpracovává dotykové události a gesta pro posouvání. Pokud iframe nemá explicitně definovanou výšku nebo pokud je jeho obsah dynamický a mění výšku, prohlížeč může mít potíže s určením posuvné oblasti. Dalším faktorem může být vnoření iframu do elementu, který sám o sobě má nastaveno posouvání, což vede ke konfliktu. Problémy se mohou projevit i při pokusu o posouvání uvnitř iframu, když prst uživatele opustí hranice iframu a dotkne se rodičovské stránky, což může vést k posouvání celé stránky namísto pouze iframu.

Možná řešení a tipy pro posouvání:

  • Fixní výška iframu: Snažte se nastavit pevnou výšku pro váš iframe. Pokud je obsah uvnitř dynamický, můžete zkusit JavaScript pro dynamickou úpravu výšky iframu na základě jeho obsahu, ale to může být složité a někdy vést k dalším problémům.
  • Wrapper div s posouváním: Místo toho, aby měl iframe přímo nastaveno posouvání, vložte jej do rodičovského <div> elementu, který bude mít nastavenou pevnou výšku a overflow: auto; nebo overflow: scroll;. Pro tento div pak aplikujte -webkit-overflow-scrolling: touch;.
  • CSS Hacky: Někdy pomůže nastavit position: relative; nebo z-index; na iframu nebo jeho rodičovském elementu, aby se správně vykreslil kontext posouvání. Experimentování s display: block; a width: 100%; také může pomoci.
  • Minimalizace dotykové oblasti: Snažte se omezit interakce s iframem, pokud je to možné, nebo navrhnout uživatelské rozhraní tak, aby posouvání iframu bylo jasně odděleno od posouvání hlavní stránky.

Proč se iframe nezobrazuje na iOS 14.6? Prázdná stránka nebo chyba

Jedním z nejvíce matoucích problémů, se kterými se uživatelé iOS 14.6 setkávají, je prázdná stránka uvnitř iframu, ačkoli na jiných platformách (Windows, Android) se obsah zobrazuje správně. Tento problém je často způsoben kombinací několika faktorů, které souvisí s moderními bezpečnostními standardy webu a specifickým chováním prohlížeče Safari na iOS.

1. Direktivy X-Frame-Options a Content-Security-Policy (CSP)

Nejčastější příčinou prázdné stránky nebo chyby "Refused to display ... in a frame because it set 'X-Frame-Options' to 'DENY'" je hlavička X-Frame-Options. Tato HTTP hlavička je navržena tak, aby chránila uživatele před útoky typu clickjacking, kdy útočníci vkládají citlivý obsah do iframu, aby oklamali uživatele k provedení nechtěných akcí. Hodnoty této hlavičky mohou být:

  • DENY: Obsah se nesmí zobrazit v žádném iframu, bez ohledu na původ.
  • SAMEORIGIN: Obsah se smí zobrazit v iframu pouze, pokud je rodičovská stránka ze stejné domény.
  • ALLOW-FROM uri: Obsah se smí zobrazit v iframu pouze, pokud je rodičovská stránka z určené URI (tato hodnota je však zastaralá a má omezenou podporu).

Mnoho moderních webových služeb, zejména ty, které pracují s citlivými daty, jako jsou přihlašovací stránky (např. accounts.google.com) nebo bankovní portály, nastavuje X-Frame-Options: DENY. To znamená, že i když se pokusíte vložit takový obsah do iframu, prohlížeč to z bezpečnostních důvodů odmítne a zobrazí prázdnou stránku nebo chybovou zprávu. To je přesně případ, který je zmíněn u accounts.google.com.

Podobnou, ale modernější a flexibilnější alternativou k X-Frame-Options je direktiva frame-ancestors v rámci hlavičky Content-Security-Policy (CSP). CSP umožňuje webovým vývojářům definovat, odkud mohou být načítány různé typy obsahu, včetně iframů. Pokud je frame-ancestors 'none' nebo frame-ancestors 'self' a stránka s iframem není ze stejné domény, obsah se nenačte. Přestože Apps Script může mít nastaveno XFrameOptionsMode.ALLOWALL, globální bezpečnostní politika Google pro domény jako accounts.google.com nebo určité části Google Drive/Apps Script může mít vyšší prioritu a zakázat vkládání do iframu z důvodu ochrany uživatelských dat.

2. Smíšený obsah (Mixed Content)

Dalším běžným problémem je smíšený obsah, kdy se zabezpečená stránka (HTTPS) pokouší načíst obsah ze nezabezpečeného zdroje (HTTP) uvnitř iframu. Moderní prohlížeče, včetně Safari na iOS, striktně blokují smíšený obsah, aby zabránily potenciálním útokům typu Man-in-the-Middle. I malá, zdánlivě nevinná reference na HTTP (například styl z http://www.w3.org/2000/svg, jak bylo zmíněno) může způsobit, že prohlížeč zablokuje načítání celého iframu. Správným krokem je zajistit, aby veškerý obsah načítaný v rámci HTTPS stránky, včetně iframů a všech jejich interních zdrojů, byl také načítán přes HTTPS.

Why is iframe not popular now?
In the responsive-web era, IFRAME is not very popular now. Also, had you debug your mobile Safari with Mac Safari with the Developer menu enabled? Moreover, the src of the iframe cannot be opened. Probably due to a permission problem?

3. Google Apps Script a specifická omezení

Případ s Google Apps Script (GAS) je zajímavý. Ačkoli vývojář může v GAS explicitně nastavit XFrameOptionsMode.ALLOWALL, aby umožnil vkládání do iframů, nemusí to stačit. Google má rozsáhlé bezpečnostní politiky, které se mohou lišit pro různé služby a domény. Například, stránky související s přihlašováním nebo ověřováním (jako accounts.google.com) budou téměř vždy blokovány z důvodu bezpečnosti, aby se předešlo phishingovým útokům. Je možné, že i když je skript nastaven na ALLOWALL, pokud se pokouší načíst nebo předat uživatele na jinou Google doménu, která má přísnější pravidla (např. Google Drive rozhraní), může dojít k zablokování. Safari na iOS je navíc známé svou přísností v oblasti ochrany soukromí a bezpečnosti, což může vést k odlišnému chování oproti prohlížečům na Androidu nebo Windows.

V daném případě, kdy se https://script.google.com/macros/... nezobrazuje na iOS 14.6, ale funguje na starší 12.5.1, to naznačuje, že novější verze iOS/Safari zavedla přísnější bezpečnostní kontroly nebo interpretace stávajících politik. Pokud se zobrazí prázdná stránka bez chyb v konzoli (což je na iOS bez debugovacího zařízení těžké ověřit), může to být způsobeno tichým zablokováním kvůli bezpečnostní politice, která nehlásí explicitní chybu do JavaScriptové konzole rodičovské stránky.

Proč iframe ztrácí na popularitě a jaké jsou alternativy?

Iframe, ačkoliv kdysi revoluční, dnes čelí rostoucí kritice a ztrácí na popularitě. Důvodů je hned několik, a souvisí s bezpečností, výkonem, SEO a uživatelským zážitkem.

Bezpečnostní rizika

Jak již bylo zmíněno, iframy jsou zranitelné vůči útokům typu clickjacking, kdy útočník vloží neviditelný iframe přes legitimní stránku a oklame uživatele, aby kliknul na něco, co si myslí, že je součástí původní stránky. Hlavičky X-Frame-Options a CSP byly zavedeny jako obrana, ale vyžadují, aby je server, jehož obsah je vkládán, správně nastavil. Pokud ne, riziko přetrvává.

Výkonnostní dopady

Každý iframe představuje samostatný dokumentový kontext, který má svůj vlastní DOM, CSS a JavaScript. To znamená, že prohlížeč musí vykreslovat a spravovat více nezávislých stránek najednou, což může výrazně zpomalit načítání a vykreslování stránky, zejména na mobilních zařízeních s omezenými zdroji. Komunikace mezi rodičovskou stránkou a iframem je také omezená a složitá (kvůli same-origin policy), což komplikuje vývoj složitějších interakcí.

SEO a přístupnost

Obsah uvnitř iframu není Googlem a jinými vyhledávači vždy správně indexován jako součást rodičovské stránky. To může negativně ovlivnit SEO, protože vyhledávače nemusejí připsat tento obsah k hlavní stránce. Z hlediska přístupnosti mohou iframy také představovat problémy pro uživatele s asistivními technologiemi, jako jsou čtečky obrazovky, které mohou mít potíže s navigací mezi rodičovskou stránkou a obsahem iframu.

Responsivita a uživatelský zážitek

Navržení responsivního iframu, který se správně přizpůsobí různým velikostem obrazovky, je notoricky obtížné. Často se stává, že obsah uvnitř iframu se nezobrazuje správně na mobilních zařízeních, což vede k špatnému uživatelskému zážitku, nutnosti posouvání do stran nebo nečitelným textům.

How to make an iframe scrollable on iOS?
In order to make an iframe scrollable on iOs, you have to add the CSS3 property "-webkit-overflow-scrolling:touch" to the parent container.

Alternativy k iframe: Moderní přístupy

Vzhledem k výše uvedeným problémům se vývojáři stále více obracejí k alternativním řešením pro vkládání externího obsahu nebo integraci služeb:

Funkce<iframe>API/AJAXServer-Side Includes (SSI) / PHP includesWeb Components / Micro-frontends
BezpečnostPotenciální rizika (clickjacking), závisí na X-Frame-Options.Vysoká, kontrola dat na serveru.Vysoká, obsah generován na serveru.Vysoká, izolované komponenty.
VýkonNižší, samostatný kontext, více HTTP požadavků.Vyšší, asynchronní načítání dat.Vysoká, obsah spojen před odesláním klientovi.Vyšší, modulární načítání.
SEOSlabší, obsah iframu často není indexován s rodičovskou stránkou.Velmi dobrá, obsah je součástí DOM.Velmi dobrá, obsah je součástí HTML.Dobrá, obsah je součástí DOM.
Komplexita vývojeJednoduché vložení, ale složitá komunikace a zabezpečení.Vyšší, vyžaduje práci s JavaScriptem a daty.Střední, vyžaduje konfiguraci serveru.Vyšší, vyžaduje frameworky a architekturu.
FlexibilitaOmezená, izolovaný obsah.Vysoká, plná kontrola nad daty a vykreslováním.Vysoká, statické vkládání.Vysoká, opakovaně použitelné komponenty.
  • API a AJAX: Pro dynamické vkládání obsahu je mnohem lepší používat API externích služeb a načítat data asynchronně pomocí JavaScriptu (AJAX nebo Fetch API). Tímto způsobem máte plnou kontrolu nad tím, jak se data zobrazují, můžete je stylovat a zajistit jejich responsivitu a přístupnost.
  • Server-Side Includes (SSI) nebo PHP/Node.js includes: Pro vkládání statického obsahu nebo opakujících se částí stránek (např. záhlaví, zápatí) je efektivnější použít server-side includes. Obsah se sloučí na serveru před odesláním klientovi, což eliminuje problémy s výkonem a bezpečností iframů.
  • Web Components a Micro-frontends: Pro složitější aplikace, které vyžadují integraci modulů z různých zdrojů, se stávají populární architektonické přístupy jako Web Components nebo micro-frontends. Tyto techniky umožňují vytvářet izolované, znovupoužitelné komponenty, které se chovají jako nativní HTML elementy, ale nabízejí mnohem větší flexibilitu a kontrolu než iframy.

Často kladené otázky (FAQ)

Proč se mi na iOS zobrazuje prázdná stránka v iframu, když na Androidu a Windows funguje?

Nejčastější příčinou je přísnější bezpečnostní politika Safari na iOS, zejména v novějších verzích (jako 14.6). Pravděpodobně jde o hlavičku X-Frame-Options nebo direktivu frame-ancestors v Content-Security-Policy nastavenou serverem, jehož obsah se snažíte vložit. Další možností je smíšený obsah (HTTPS stránka se snaží načíst HTTP obsah v iframu), který iOS blokuje.

Může za to X-Frame-Options?

Velmi pravděpodobně ano. Pokud se pokoušíte vložit obsah z domény, která chrání své uživatele před clickjackingem (např. Google přihlašovací stránky, bankovní weby), server odmítne zobrazení v iframu nastavením X-Frame-Options: DENY nebo SAMEORIGIN. I když Google Apps Script umožňuje ALLOWALL, globální zásady Google mohou přepsat toto nastavení pro určité citlivé služby.

Jak mohu otestovat iframe na iOS bez fyzického zařízení?

Nejlepší způsob je použít simulátor iOS, který je součástí Xcode na macOS, nebo použít vzdálené ladění (remote debugging) Safari. Pokud máte Mac, připojte své iOS zařízení k Macu, otevřete Safari na Macu, přejděte do menu Vývojář (Developer) a vyberte své zařízení. Zde uvidíte otevřené karty na zařízení a můžete otevřít konzoli pro ladění Safari na iOS. To vám umožní vidět chyby v konzoli a zkontrolovat síťové požadavky, což je klíčové pro diagnostiku.

Je iframe bezpečný pro vkládání externího obsahu?

Závisí to na zdroji obsahu a vašich potřebách. Pro vkládání důvěryhodného obsahu (např. YouTube videa, Google Maps) je často bezpečný, protože tyto služby mají vlastní bezpečnostní opatření. Pro vkládání obsahu z neznámých nebo nedůvěryhodných zdrojů je iframe rizikový. Vždy je lepší preferovat API a AJAX, pokud je to možné, protože vám dávají plnou kontrolu nad daty a jejich zabezpečením.

Existují lepší způsoby, jak vložit externí obsah?

Ano, pro většinu případů existují lepší a modernější alternativy. Používání API a AJAX je preferovanou metodou pro dynamický obsah, protože umožňuje plnou kontrolu nad daty a jejich zobrazením. Pro statický obsah nebo pro opakující se části stránky jsou efektivnější server-side includes. Pro složité modulární aplikace se pak používají Web Components nebo micro-frontends. Tyto alternativy nabízejí lepší výkon, bezpečnost, SEO a uživatelský zážitek.

Na závěr je důležité si uvědomit, že zatímco <iframe> má stále své místo v určitých specifických scénářích (např. pro vkládání mediálního obsahu z důvěryhodných platforem), jeho použití by mělo být zváženo s ohledem na bezpečnostní rizika, výkonnostní dopady a omezení na mobilních platformách, zejména na iOS. Většinu problémů s prázdnými iframy a posouváním na iOS lze přičíst přísným bezpečnostním politikám a chování prohlížeče Safari. Pochopení hlaviček jako X-Frame-Options a Content-Security-Policy je klíčové pro úspěšnou integraci. Pro budoucí projekty je doporučeno prozkoumat moderní alternativy, které nabízejí robustnější a flexibilnější řešení pro integraci externího obsahu.

Chceš-li si přečíst další články podobné jako Proč iframe selhává na iOS 14.6 a jak na to?, navštiv kategorii iPhone.

Go up