O problema é que, quando você precisa usar IFrames para inserir conteúdo em um site, no mundo da web moderno espera-se que o IFrame também responda. Em teoria, é simples, basta usar <iframe width="100%"></iframe>
ou definir a largura do CSS para, iframe { width: 100%; }
no entanto, na prática, não é tão simples assim, mas pode ser.
Se o iframe
conteúdo for totalmente responsivo e puder se redimensionar sem barras de rolagem internas, o iOS Safari será redimensionado iframe
sem problemas reais.
Se você considerar o seguinte código:
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=9,10,11" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Iframe Isolation Test</title>
<style type="text/css" rel="stylesheet">
#Main {
padding: 10px;
}
</style>
</head>
<body>
<h1>Iframe Isolation Test 13.17</h1>
<div id="Main">
<iframe height="950" width="100%" src="Content.html"></iframe>
</div>
</body>
</html>
Com o Content.html :
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=9,10,11" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Iframe Isolation Test - Content</title>
<style type="text/css" rel="stylesheet">
#Main {
width: 100%;
background: #ccc;
}
</style>
</head>
<body>
<div id="Main">
<div id="ScrolledArea">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc malesuada purus quis commodo convallis. Fusce consectetur mauris eget purus tristique blandit. Nam nec volutpat augue. Aliquam sit amet augue vitae orci fermentum tempor sit amet gravida augue. Pellentesque convallis velit eu malesuada malesuada. Aliquam erat volutpat. Nam sollicitudin nulla nec neque viverra, non suscipit purus tincidunt. Aenean blandit nisi felis, sit amet ornare mi vestibulum ac. Praesent ultrices varius arcu quis fringilla. In vitae dui consequat, rutrum sapien ut, aliquam metus. Proin sit amet porta velit, suscipit dignissim arcu. Cras bibendum tellus eu facilisis sodales. Vestibulum posuere, magna ut iaculis consequat, tortor erat vulputate diam, ut pharetra sapien massa ut magna. Donec massa purus, pharetra sed pellentesque nec, posuere ut velit. Nam venenatis feugiat odio quis tristique.
</div>
</div>
</body>
</html>
Então isso funciona sem problemas no iOS 7.1 Safari. Você pode alternar entre paisagem e retrato sem problemas.
No entanto, basta alterar o CSS Content.html adicionando este:
#ScrolledArea {
width: 100%;
overflow: scroll;
white-space: nowrap;
background: #ff0000;
}
Você obtém isto:
Como você pode ver, embora o content.html conteúdo é totalmente sensível ( div # ScrolledArea tem overflow: scroll
set) eo iframe width é de 100% do iframe ainda leva a toda a largura da div # ScrolledArea como se o transbordamento nem sequer existe. Demo
Em casos como esse, onde o iframe
conteúdo possui áreas de rolagem, a questão é: como obter a iframe
resposta, quando o conteúdo do iframe possui áreas de rolagem horizontal? O problema aqui não está no fato de o Content.html não ser responsivo, mas no fato de o Safari do iOS simplesmente redimensionar o iframe para que div#ScrolledArea
ele fique totalmente visível.
white-space: nowrap
estilo?white-space: nowrap
em si não é o problema. Estou simplesmente usando-o para obter uma largura extrema paradiv#ScrolledArea
. O problema ocorre quando o conteúdo do IFrame possui áreas de rolagem horizontal. Se for esse o caso, o Safari do iOS simplesmente ignora as configurações de largura e mostra o conteúdo do furo e interrompe a capacidade de resposta do site.Respostas:
A solução para esse problema é realmente bastante simples e há duas maneiras de fazer isso. Se você tem controle sobre o Content.html , basta alterar a
div#ScrolledArea
largura do CSS para:Basicamente, a idéia aqui é simples: você define o valor
width
como algo menor que a janela de visualização (neste caso, largura do iframe) e a substituimin-width: 100%
para permitirwidth: 100%
que iOS Safari real substitua por padrão. O*width: 100%;
código está lá para que o código permaneça compatível com o IE6, mas se você não se importa com o IE6, pode omiti-lo. DemoComo você pode ver agora, a
div#ScrolledArea
largura é realmente 100%, e aoverflow: scroll;
lata pode fazer isso e ocultar o conteúdo transbordante. Se você tiver acesso ao conteúdo do iframe, é preferível.No entanto, se você não tiver acesso ao conteúdo do iframe (por qualquer motivo), poderá usar a mesma técnica no próprio iframe. Basta usar o mesmo CSS no iframe:
No entanto, há uma limitação nisso: você precisa desativar as barras de rolagem
scrolling="no"
no iframe para que isso funcione:Se as barras de rolagem forem permitidas, isso não funcionará mais no iframe. Dito isso, se você modificar o Content.html , poderá manter a rolagem no iframe. Demo
fonte
!important
aowidth
atributo para preparar o iframe responsivo-web-design em um iPhone 4 com iOS 7width
sido definida anteriormente com!important
ou um CSS de prioridade mais alta a tenha substituído. Em casos isolados no iPhone 4 iOS7, não era necessário.scrolling="yes"
caso contrário, não haja maneira de corrigir isso. Para que a correção funcione no IFRAME, é necessário apenasscrolling="no"
no IFRAMEO problema, ao que parece, é que o Mobile Safari se recusará a obedecer à largura do seu iFrame se o documento contido for maior do que o que você especificou. Exemplo:
http://jsbin.com/hapituto/1
Em um navegador de desktop, você verá um iFrame e um Div ambos configurados para 300px. O conteúdo é mais amplo, para que você possa rolar o iFrame.
No safari móvel, no entanto, você notará que o iFrame é expandido automaticamente para a largura do conteúdo.
Meu palpite é que essa é uma solução alternativa para problemas antigos com rolagem de conteúdo em uma página. No passado, se você tivesse um iframe de rolagem grande em um dispositivo de toque, ficaria "preso" no iframe, pois isso rolaria ao invés da própria página. Parece que a Apple decidiu que o comportamento padrão de um iFrame é 'sem rolagem' e se expande para evitá-lo.
Uma opção pode ser essa solução alternativa. Em vez de assumir que o iFrame rolará, coloque o iframe em uma DIV que você tem controle e deixe esse rolagem.
exemplo: http://jsbin.com/zakedaja/1
Exemplo de marcação:
No safari móvel, agora você pode rolar o conteúdo do iFrame agora totalmente expandido através da div que o contém.
O problema: isso parece realmente feio em um navegador de desktop, pois agora você tem barras de rolagem duplas. Portanto, você pode precisar fazer alguma detecção do navegador com o JS para contornar isso.
fonte
div#ScrolledArea
(em verde) no meu exemplo. Acabei de ler errado antes. Mas o iframe não deve ser rolagem única redimensionar-se com base no elemento contentor ou seja, terwidth: 100%;
Eu precisava de uma solução entre navegadores. Os requisitos foram:
Com base no que aprendi no @Idra sobre rolagem = "não" no iOS e nesta postagem sobre como ajustar o conteúdo do iFrame à tela no iOS, aqui está o que eu acabei. Espero que ajude alguém =)
HTML
CSS
JS
fonte
O problema com todas essas soluções é que a altura do
iframe
nunca muda realmente.Isso significa que você não poderá centralizar elementos dentro do
iframe
Javascript usandoposition:fixed;
, ouposition:absolute;
porque oiframe
próprio nunca rola.Minha solução detalhada aqui é agrupar todo o conteúdo do iframe dentro de um
div
usando este CSS:Dessa forma, o Safari acredita que o conteúdo não tem altura e permite atribuir a altura do conteúdo
iframe
corretamente. Isso também permite que você posicione os elementos da maneira que desejar.Você pode ver uma demonstração rápida e suja aqui.
fonte
iframe
, mas no meu caso, eu faço. Felicidades!Esse problema também está presente no iOS Chrome.
Olhei através de todas as soluções acima, a maioria é muito hacky.
Se você não precisar de suporte para navegadores mais antigos, defina a largura do iframe como 100vw;
Nota: verifique o suporte para unidades de viewport https://caniuse.com/#feat=viewport-units
fonte
Eu estou trabalhando com ionic2 e configuração do sistema é como abaixo-
Para mim, esse problema foi resolvido com este código -
para a tag iframe html -
Veja css da mesma as-
A propriedade Position desempenha um papel vital aqui no meu caso.
posição: relativa;
Pode ajudar você também !!!
fonte
Solução apenas CSS
HTML
CSS
DEMO
Outra demonstração aqui com a página HTML no iframe
fonte
Eu tive um problema com a largura no painel de conteúdo, criando uma barra de rolagem horizontal para o iframe. Verificou-se que uma imagem estava mantendo a largura maior que o esperado. Consegui resolvê-lo definindo todas as imagens css max-width como um percentual.
fonte
na verdade, para mim, apenas trabalhou no iOS desativando o pergaminho
<iframe src="//www.youraddress.com/" scrolling="no"></iframe>
e tratando o SO via script.
fonte
Para mim, as soluções CSS não funcionaram. Mas definir a largura programaticamente faz o trabalho. No carregamento do iframe, defina a largura programaticamente:
fonte