Como tornar um iframe responsivo, sem assumir uma proporção? Por exemplo, o conteúdo pode ter qualquer largura ou altura desconhecida antes da renderização.
Observe que você pode usar Javascript.
Exemplo:
<div id="iframe-container">
<iframe/>
</div>
Dimensione isso iframe-container
para que o conteúdo mal caiba dentro sem espaço extra; em outras palavras, haverá espaço suficiente para o conteúdo, para que possa ser exibido sem rolagem, mas sem excesso de espaço. O container envolve o iframe perfeitamente.
Isso mostra como tornar um iframe responsivo, assumindo que a proporção do conteúdo seja 16: 9. Mas nesta questão, a proporção é variável.
Respostas:
Não é possível interagir com um iFrame de origem diferente usando Javascript, para obter o tamanho dele; a única maneira de fazer isso é usando
window.postMessage
otargetOrigin
conjunto no seu domínio ou o caractere curinga*
da fonte do iFrame. Você pode proxy o conteúdo dos diferentes sites de origem e usosrcdoc
, mas isso é considerado um hack e não funciona com SPAs e muitas outras páginas mais dinâmicas.Mesmo tamanho de iFrame de origem
Suponha que tenhamos dois iFrames de origem iguais, um de altura curta e largura fixa:
e um iFrame de altura alta:
Podemos obter o tamanho do iFrame no
load
evento usando oiframe.contentWindow.document
que enviaremos para a janela pai usandopostMessage
:Obteremos largura e altura adequadas para os dois iFrames; você pode conferir on-line aqui e ver a captura de tela aqui .
Tamanho diferente origem iFrame corte ( não recomendado )
O método descrito aqui é um hack e deve ser usado se for absolutamente necessário e não houver outro caminho; não funcionará para as páginas e SPAs gerados mais dinâmicos. O método busca o código-fonte HTML da página usando um proxy para ignorar a política do CORS (
cors-anywhere
é uma maneira fácil de criar um servidor proxy CORS simples e possui uma demonstração onlinehttps://cors-anywhere.herokuapp.com
) e injeta o código JS nesse HTML para usarpostMessage
e enviar o tamanho do iFrame para o documento pai. Ele até lida com o evento iFrameresize
( combinado com o iFramewidth: 100%
) e publica o tamanho do iFrame de volta ao pai.patchIframeHtml
:Uma função para corrigir o código HTML do iFrame e injetar Javascript personalizado que será usado
postMessage
para enviar o tamanho do iFrame para o paiload
e assim por dianteresize
. Se houver um valor para oorigin
parâmetro, um<base/>
elemento HTML será anexado ao cabeçalho usando o URL de origem; portanto, os URIs HTML/some/resource/file.ext
serão buscados corretamente pelo URL de origem dentro do iFrame.getIframeHtml
:Uma função para obter um HTML da página ignorando o CORS usando um proxy se
useProxy
param estiver definido. Pode haver parâmetros adicionais que serão passados para opostMessage
quando enviar dados de tamanho.A função de manipulador de eventos de mensagem é exatamente a mesma que em "Mesmo tamanho de iFrame de origem" .
Agora podemos carregar um domínio de origem cruzada dentro de um iFrame com nosso código JS personalizado injetado:
E nós vamos ajustar o tamanho do iFrame ao seu conteúdo em altura total, sem nenhuma rolagem vertical, mesmo usando
overflow-y: auto
o corpo do iFrame ( deve seroverflow-y: hidden
assim, para que a barra de rolagem não pisque no redimensionamento ).Você pode conferir online aqui .
Novamente, observe que isso é um hack e deve ser evitado ; não podemos acessar o documento iFrame de origem cruzada nem injetar qualquer tipo de coisa.
fonte
cors-anywhere
está desativado no momento, portanto você não pode ver a página de demonstração . Não quero adicionar uma captura de tela do site externo por motivos de direitos autorais. Vou adicionar um outro proxy CORS se isso permanecer inativo por muito tempo.Existem muitas complicações com a elaboração do tamanho do conteúdo em um iframe, principalmente devido ao CSS, permitindo que você faça coisas que podem quebrar a maneira como você mede o tamanho do conteúdo.
Eu escrevi uma biblioteca que cuida de todas essas coisas e também funciona em vários domínios, você pode achar útil.
https://github.com/davidjbradshaw/iframe-resizer
fonte
Minha solução está no GitHub e JSFiddle .
Apresentando uma solução para iframe responsivo sem suposição de proporção.
Nota: Não se esqueça de chamar a função de redimensionamento após o carregamento da página, pois a janela não é redimensionada por si só após o carregamento da página.
O código
index.html
style.css
main.js
Passei algum tempo nisso. Espero que você goste =)
Editar Esta é provavelmente a melhor solução genérica. No entanto, quando muito pequeno, o iframe não recebe o tamanho adequado. Isso é específico para o iframe que você está usando. Não é possível codificar uma resposta adequada para esse fenômeno, a menos que você possua o código do iframe, pois seu código não tem como saber qual tamanho é preferido pelo iframe para ser exibido corretamente.
Apenas alguns hacks como o apresentado por @Christos Lytras podem fazer o truque, mas nunca funcionará para todos os iframes. Apenas em uma situação particular.
fonte
Faça uma coisa definir o contêiner Iframe com alguma propriedade CSS de largura e altura
fonte