Como todos os navegadores modernos oferecem suporte à transformação há um bom tempo, eu consideraria usar a versão não corrigida (pelo menos como uma alternativa).
Wortwart #
55
Encontrei uma solução que funciona no IE e Firefox (pelo menos nas versões atuais). No Safari / Chrome, o iframe é redimensionado para 75% do tamanho original, mas o conteúdo do iframe não é redimensionado. No Opera, isso não parece funcionar. Isso parece um pouco esotérico, por isso, se houver uma maneira melhor de fazê-lo, eu gostaria de receber sugestões.
<style>#wrap {width:600px;height:390px;padding:0;overflow: hidden;}#frame {width:800px;height:520px;border:1px solid black;}#frame {zoom:0.75;-moz-transform: scale(0.75);-moz-transform-origin:00;}</style>
...
<p>Some text before the frame</p><divid="wrap"><iframeid="frame"src="test2.html"></iframe></div><p>Some text after the frame</p></body>
Nota: eu tive que usar o wrapelemento para o Firefox. Por alguma razão, no Firefox, quando você reduz o objeto em 75%, ele ainda usa o tamanho original da imagem por motivos de layout. (Tente remover a div do código de exemplo acima e você verá o que quero dizer.)
Acabei de testar e, para mim, nenhuma das outras soluções funcionou. Eu simplesmente tentei isso e funcionou perfeitamente no Firefox e Chrome, exatamente como eu esperava:
Você também deseja adicionar overflow: hidden;ao .wrapelemento. Quando você usa o iframe { width: 200%; height: 200%; transform: scale(0.5); }iframe começa a transbordar.
ozgrozer
Essa é a abordagem mais avançada. Obrigado!
fuggi
10
Seguimento da resposta do lxs : notei um problema em que ter as tags zoome --webkit-transformao mesmo tempo parece confundir o Chrome (versão 15.0.874.15), fazendo um efeito de zoom duplo. Consegui solucionar o problema substituindo zoompor -ms-zoom(direcionado apenas para o IE), deixando o Chrome para fazer uso apenas da --webkit-transformtag e isso esclareceu as coisas.
Você não precisa agrupar o iframe com uma tag adicional. Apenas certifique-se de aumentar a largura e a altura do iframe na mesma quantidade que você reduz o tamanho do iframe.
por exemplo, para dimensionar o conteúdo de iframe para 80%:
#frame { /* Example size! */
height:400px;/* original height */
width:100%;/* original width */}#frame {
height:500px;/* new height (400 * (1/0.8) ) */
width:125%;/* new width (100 * (1/0.8) )*/
transform: scale(0.8);
transform-origin:00;}
Basicamente, para obter o mesmo tamanho de iframe, é necessário dimensionar as dimensões.
Seria 0,8 para 80%, mas esse é um Microsoftismo proprietário, portanto provavelmente não é adequado. Também funcionaria se o documento carregado no quadro pudesse ser editado, o que é improvável.
Quentin
7
Pensei em compartilhar o que descobri, usando muito do que foi dado acima. Eu não verifiquei o Chrome, mas funciona no IE, Firefox e Safari, até onde eu sei.
As compensações específicas e o fator de zoom neste exemplo funcionaram para reduzir e centralizar dois sites em iframes para as guias do Facebook (largura de 810px).
Os dois sites utilizados foram um site wordpress e uma rede ning. Eu não sou muito bom com html, então isso provavelmente poderia ter sido feito melhor, mas o resultado parece bom.
Se você quiser que o iframe e seu conteúdo sejam redimensionados quando a janela for redimensionada, defina o seguinte para o evento de redimensionamento da janela, bem como para o evento de iframes onload.
Isso fará com que o iframe e seu conteúdo sejam dimensionados para 100% de largura da div de quebra automática (ou a porcentagem que você desejar). Como um bônus adicional, você não precisa definir o css do quadro como valores codificados, pois todos serão definidos dinamicamente; você só precisará se preocupar com a forma como deseja que a div wrap seja exibida.
Eu testei isso e funciona no chrome, IE11 e firefox.
Acho que você pode fazer isso calculando a altura e a largura desejadas com javascript (via document.body.clientWidth etc.) e injetando o iframe no seu HTML assim:
Desculpe minha ignorância, mas isso não tornaria o iframe 80% da página de origem, em vez de diminuir o zoom na própria página de origem?
precisa
3
Para aqueles que estão com problemas para que isso funcione no IE, é útil usar -ms-zoomcomo sugerido abaixo e usar a função de zoom na #wrapdiv, não o iframeID. Na minha experiência, com a zoomfunção tentando escalar a div iframe de#frame , ela escalaria o tamanho do iframe e não o conteúdo nele (que é o que você procura).
Se parece com isso. Funciona para mim no IE8, Chrome e FF.
A solução #wrap #frame funciona bem, desde que os números em #wrap sejam #frame vezes o fator de escala. Ele mostra apenas a parte do quadro reduzido. Você pode vê-lo aqui diminuindo a escala de sites e colocando-o em um formulário do tipo pinterest (com o plugin woodmark jQuery):
Não faça isso. De developer.mozilla.org/pt-BR/docs/Web/CSS/zoom : "Este recurso não é padrão e não segue os padrões. Não o use em sites de produção voltados para a Web: ele não funcionará para todos os usuários. Também pode haver grandes incompatibilidades entre implementações e o comportamento pode mudar no futuro. "
Hackel
+1 Isso (modificar o conteúdo do iframe, não o próprio iframe) parece uma ideia melhor. Eu precisava de uma maneira de reduzir a escala de uma página e mostrá-la como uma prévia dessa página, e essa abordagem resolveu o problema.
akinuri
@akinuri Sim, foi exatamente para isso que eu o usei. Passei por várias soluções, mas isso parecia o mais fácil. Eu apenas percorri os iframes e reduzi todos eles para obter uma página de miniaturas. Não são necessárias alterações nas páginas filhas.
Graham
1
Se o seu html estiver estilizado com css, você provavelmente poderá vincular folhas de estilo diferentes para tamanhos diferentes.
Eu não acho que o HTML tenha essa funcionalidade. A única coisa que posso imaginar que faria o truque é fazer algum processamento no servidor. Talvez você possa obter uma imagem instantânea da página da web que deseja exibir, dimensioná-la no servidor e servi-la ao cliente. Esta seria uma página não interativa, no entanto. (talvez um mapa de imagem possa ter o link, mas ainda assim.)
Outra idéia seria ter um componente do lado do servidor que alterasse o HTML. Como o recurso de zoom do firefox 2.0. é claro que isso não é um zoom perfeito, mas é melhor que nada.
Como disse, duvido que você consiga.
Talvez você possa dimensionar pelo menos o próprio texto, definindo um estilo font-size: 80%;.
Não testado, não tenho certeza de que funciona e não redimensionará caixas ou imagens.
Respostas:
A solução do Kip deve funcionar no Opera e Safari se você alterar o CSS para:
Você também pode especificar o estouro: oculto no #frame para impedir as barras de rolagem.
fonte
Encontrei uma solução que funciona no IE e Firefox (pelo menos nas versões atuais). No Safari / Chrome, o iframe é redimensionado para 75% do tamanho original, mas o conteúdo do iframe não é redimensionado. No Opera, isso não parece funcionar. Isso parece um pouco esotérico, por isso, se houver uma maneira melhor de fazê-lo, eu gostaria de receber sugestões.
Nota: eu tive que usar o
wrap
elemento para o Firefox. Por alguma razão, no Firefox, quando você reduz o objeto em 75%, ele ainda usa o tamanho original da imagem por motivos de layout. (Tente remover a div do código de exemplo acima e você verá o que quero dizer.)Eu encontrei um pouco disso nesta pergunta .
fonte
Depois de lutar com isso por horas tentando fazê-lo funcionar no IE8, 9 e 10, eis o que funcionou para mim.
Este CSS simplificado funciona no FF 26, Chrome 32, Opera 18 e IE9 -11 a partir de 1/7/2014:
Para o IE8, defina a largura / altura para corresponder ao iframe e adicione -ms-zoom à div do contêiner .wrap:
Basta usar seu método favorito para detectar o condicionalmente o CSS apropriado, consulte Existe uma maneira de executar CSS condicional específico do navegador em um arquivo * .css? para algumas idéias.
O IE7 foi uma causa perdida, já que o -ms-zoom não existia até o IE8.
Aqui está o HTML real com o qual testei:
http://jsfiddle.net/esassaman/PnWFY/
fonte
Acabei de testar e, para mim, nenhuma das outras soluções funcionou. Eu simplesmente tentei isso e funcionou perfeitamente no Firefox e Chrome, exatamente como eu esperava:
e o css:
Isso dimensiona todo o conteúdo em 30%. As porcentagens de largura / altura do curso precisam ser ajustadas de acordo (1 / scale_factor).
fonte
overflow: hidden;
ao.wrap
elemento. Quando você usa oiframe { width: 200%; height: 200%; transform: scale(0.5); }
iframe começa a transbordar.Seguimento da resposta do lxs : notei um problema em que ter as tags
zoom
e--webkit-transform
ao mesmo tempo parece confundir o Chrome (versão 15.0.874.15), fazendo um efeito de zoom duplo. Consegui solucionar o problema substituindozoom
por-ms-zoom
(direcionado apenas para o IE), deixando o Chrome para fazer uso apenas da--webkit-transform
tag e isso esclareceu as coisas.fonte
Você não precisa agrupar o iframe com uma tag adicional. Apenas certifique-se de aumentar a largura e a altura do iframe na mesma quantidade que você reduz o tamanho do iframe.
por exemplo, para dimensionar o conteúdo de iframe para 80%:
Basicamente, para obter o mesmo tamanho de iframe, é necessário dimensionar as dimensões.
fonte
html {zoom: 0.4;}? -)
fonte
Pensei em compartilhar o que descobri, usando muito do que foi dado acima. Eu não verifiquei o Chrome, mas funciona no IE, Firefox e Safari, até onde eu sei.
As compensações específicas e o fator de zoom neste exemplo funcionaram para reduzir e centralizar dois sites em iframes para as guias do Facebook (largura de 810px).
Os dois sites utilizados foram um site wordpress e uma rede ning. Eu não sou muito bom com html, então isso provavelmente poderia ter sido feito melhor, mas o resultado parece bom.
fonte
Se você quiser que o iframe e seu conteúdo sejam redimensionados quando a janela for redimensionada, defina o seguinte para o evento de redimensionamento da janela, bem como para o evento de iframes onload.
Isso fará com que o iframe e seu conteúdo sejam dimensionados para 100% de largura da div de quebra automática (ou a porcentagem que você desejar). Como um bônus adicional, você não precisa definir o css do quadro como valores codificados, pois todos serão definidos dinamicamente; você só precisará se preocupar com a forma como deseja que a div wrap seja exibida.
Eu testei isso e funciona no chrome, IE11 e firefox.
fonte
Acho que você pode fazer isso calculando a altura e a largura desejadas com javascript (via document.body.clientWidth etc.) e injetando o iframe no seu HTML assim:
Eu não testei isso no IE6, mas parece funcionar com os bons :)
fonte
Para aqueles que estão com problemas para que isso funcione no IE, é útil usar
-ms-zoom
como sugerido abaixo e usar a função de zoom na#wrap
div, não oiframe
ID. Na minha experiência, com azoom
função tentando escalar a div iframe de#frame
, ela escalaria o tamanho do iframe e não o conteúdo nele (que é o que você procura).Se parece com isso. Funciona para mim no IE8, Chrome e FF.
fonte
zoom
no modo de padrões IE8, use-ms-zoom
no modo quirks.Esta foi a minha solução em uma página com largura de 890px
fonte
A solução #wrap #frame funciona bem, desde que os números em #wrap sejam #frame vezes o fator de escala. Ele mostra apenas a parte do quadro reduzido. Você pode vê-lo aqui diminuindo a escala de sites e colocando-o em um formulário do tipo pinterest (com o plugin woodmark jQuery):
http://www.genautica.com/sandbox/woodmark-index.html
fonte
Portanto, provavelmente não é a melhor solução, mas parece funcionar bem.
Obviamente, não tentando consertar o pai, basta adicionar o estilo "zoom: 50%" ao corpo do filho com um pouco de javascript.
Talvez pudesse definir o estilo do elemento "HTML", mas não tentou isso.
fonte
Se o seu html estiver estilizado com css, você provavelmente poderá vincular folhas de estilo diferentes para tamanhos diferentes.
fonte
Eu não acho que o HTML tenha essa funcionalidade. A única coisa que posso imaginar que faria o truque é fazer algum processamento no servidor. Talvez você possa obter uma imagem instantânea da página da web que deseja exibir, dimensioná-la no servidor e servi-la ao cliente. Esta seria uma página não interativa, no entanto. (talvez um mapa de imagem possa ter o link, mas ainda assim.)
Outra idéia seria ter um componente do lado do servidor que alterasse o HTML. Como o recurso de zoom do firefox 2.0. é claro que isso não é um zoom perfeito, mas é melhor que nada.
Fora isso, estou sem idéias.
fonte
Como disse, duvido que você consiga.
Talvez você possa dimensionar pelo menos o próprio texto, definindo um estilo
font-size: 80%;
.Não testado, não tenho certeza de que funciona e não redimensionará caixas ou imagens.
fonte