Necesito una solución para autoajustar el width
y height
de un iframe
para apenas ajustarse a su contenido. El punto es que el ancho y la altura se pueden cambiar después de que iframe
se haya cargado. Supongo que necesito una acción de evento para lidiar con el cambio en las dimensiones del cuerpo contenido en el iframe.
javascript
html
iframe
adjustment
Corazón de piedra
fuente
fuente
Respuestas:
fuente
DOMContentLoaded
, yaDOMContentReady
que no parece ser una cosa: developer.mozilla.org/en-US/…Complemento de navegador cruzado jQuery .
Cross-bowser, biblioteca de dominio cruzado que se utiliza
mutationObserver
para mantener iFrame dimensionado para el contenido ypostMessage
para comunicarse entre iFrame y la página de host. Funciona con o sin jQuery.fuente
Todas las soluciones dadas hasta ahora solo representan un cambio de tamaño único. Menciona que desea poder cambiar el tamaño del iFrame después de modificar el contenido. Para hacer esto, debe ejecutar una función dentro del iFrame (una vez que se cambia el contenido, debe activar un evento para decir que el contenido ha cambiado).
Estuve atascado con esto por un tiempo, ya que el código dentro del iFrame parecía limitado al DOM dentro del iFrame (y no podía editar el iFrame), y el código ejecutado fuera del iFrame estaba atascado con el DOM fuera del iFrame (y no podía ' t recoger un evento que viene desde dentro del iFrame).
La solución vino al descubrir (a través de la asistencia de un colega) que a jQuery se le puede decir qué DOM usar. En este caso, el DOM de la ventana principal.
Como tal, un código como este hace lo que necesita (cuando se ejecuta dentro del iFrame):
fuente
jQuery("#IDofControlFiringResizeEvent").click(function ()
?Solución de una sola línea para incrustaciones: comienza con un tamaño mínimo y aumenta al tamaño del contenido. No hay necesidad de etiquetas de script.
fuente
scrollHeight/scrollWidth
deben ajustarse un poco para tener en cuenta los márgenes corporales. Los navegadores aplican márgenes predeterminados distintos de cero para el elemento del cuerpo de los documentos (y también es aplicable al contenido cargado en marcos). La solución de trabajo que he encontrado es que añadir lo siguiente:parseInt(window.getComputedStyle(this.contentDocument.body).margin
.Si el contenido del iframe es del mismo dominio, esto debería funcionar muy bien. Sin embargo, requiere jQuery.
Para que cambie su tamaño dinámicamente, puede hacer esto:
Luego, en la página que carga el iframe, agregue esto:
fuente
Aquí hay una solución de navegador cruzado si no desea usar jQuery:
fuente
Después de haber probado todo en la tierra, esto realmente funciona para mí.
index.html
fuente
Estoy usando este código para ajustar automáticamente la altura de todos los iframes (con la clase autoHeight) cuando se cargan en la página. Probado y funciona en IE, FF, Chrome, Safari y Opera.
fuente
Esta es una solución sólida
el html
fuente
Modifiqué ligeramente la gran solución de Garnaph anterior. Parecía que su solución modificó el tamaño del iframe en función del tamaño justo antes del evento. Para mi situación (envío por correo electrónico a través de un iframe), necesitaba cambiar la altura del iframe justo después del envío. Por ejemplo, mostrar errores de validación o mensaje de "agradecimiento" después del envío.
Acabo de eliminar la función click () anidada y la puse en mi iframe html:
Funcionó para mí, pero no estoy seguro acerca de la funcionalidad del navegador cruzado.
fuente
Si puede controlar tanto el contenido de IFRAME como la ventana principal, entonces necesita el iFrame Resizer .
Esta biblioteca permite el cambio de tamaño automático de la altura y el ancho de los iFrames iguales y de dominio cruzado para adaptarse a su contenido contenido. Proporciona una variedad de características para abordar los problemas más comunes con el uso de iFrames, que incluyen:
fuente
No todos pueden funcionar con los métodos anteriores.
javascript:
html:
Env: IE 10, Windows 7 x64
fuente
Descubrí otra solución después de experimentar un poco. Originalmente probé el código marcado como 'mejor respuesta' a esta pregunta y no funcionó. Supongo que mi iframe en mi programa en ese momento se generó dinámicamente. Aquí está el código que usé (funcionó para mí):
Javascript dentro del iframe que se está cargando:
Aquí está el html para el iframe:
Aquí está todo el código dentro de mi iframe:
He realizado pruebas en Chrome y un poco en Firefox (en Windows XP). Todavía tengo más pruebas que hacer, así que dime cómo funciona esto para ti.
fuente
Así es como lo haría (probado en FF / Chrome):
fuente
Aquí hay varios métodos:
Y OTRA ALTERNATIVA
PARA OCULTAR EL DESPLAZAMIENTO CON 2 ALTERNATIVAS COMO SE MUESTRA ARRIBA
HACK CON SEGUNDO CÓDIGO
Para ocultar las barras de desplazamiento del iFrame, se hace que el elemento primario "desborde: oculto" para ocultar las barras de desplazamiento y se hace que el iFrame pase al 150% de ancho y alto, lo que obliga a las barras de desplazamiento fuera de la página y, como el cuerpo no No tiene barras de desplazamiento. Uno no puede esperar que el iframe exceda los límites de la página. ¡Esto oculta las barras de desplazamiento del iFrame con todo su ancho!
fuente: establecer la altura automática del iframe
fuente
En caso de que alguien llegue aquí: tuve un problema con las soluciones cuando eliminé divs del iframe; el iframe no se acortó.
Hay un complemento de Jquery que hace el trabajo:
http://www.jqueryscript.net/layout/jQuery-Plugin-For-Auto-Resizing-iFrame-iFrame-Resizer.html
fuente
Encontré que este cambio de tamaño funciona mejor:
Tenga en cuenta que el objeto de estilo se elimina.
fuente
¡En jQuery, esta es la mejor opción para mí, que realmente me ayuda! Espero que te ayude!
iframe
jQuery
fuente
Contexto
Tuve que hacer esto yo mismo en un contexto de extensión web. Esta extensión web inyecta una parte de la interfaz de usuario en cada página, y esta interfaz de usuario vive dentro de un
iframe
. El contenido dentro deliframe
es dinámico, así que tuve que reajustar el ancho y la altura deliframe
mismo.Uso React pero el concepto se aplica a todas las bibliotecas.
Mi solución (esto supone que controlas tanto la página como el iframe)
En el interior
iframe
cambié losbody
estilos para tener dimensiones realmente grandes. Esto permitirá que los elementos en el interior se distribuyan utilizando todo el espacio necesario. Hacerwidth
yheight
100% no funcionó para mí (supongo que porque el iframe tiene un valor predeterminadowidth = 300px
yheight = 150px
)Luego inyecté toda la interfaz de usuario de iframe dentro de un div y le di algunos estilos
Después de renderizar mi aplicación dentro de esto
#ui-root
(en React hago esto dentrocomponentDidMount
) calculo las dimensiones de este div como y las sincronizo con la página principal usandowindow.postMessage
:En el marco principal hago algo como esto:
fuente
Es posible hacer un IFrame "fantasma" que actúa como si no estuviera allí.
Ver http://codecopy.wordpress.com/2013/02/22/ghost-iframe-crossdomain-iframe-resize/
Básicamente, utiliza el sistema de eventos
parent.postMessage(..)
descrito en https://developer.mozilla.org/en-US/docs/DOM/window.postMessage¡Esto funciona en todos los navegadores modernos!
fuente
Sé que la publicación es antigua, pero creo que esta es otra forma de hacerlo. Acabo de implementar en mi código. Funciona perfectamente tanto en la carga de la página como en el cambio de tamaño de la página:
fuente
Javascript para ser colocado en el encabezado:
Aquí va el código html de iframe:
Hoja de estilo css
>
fuente
Para el atributo de directiva angularjs:
Observe el porcentaje, lo inserté para que pueda contrarrestar la escala que generalmente se realiza para iframe, texto, anuncios, etc., simplemente ponga 0 si no se implementa la escala
fuente
Así es como lo hice al cargar o cuando las cosas cambian.
fuente
Claramente, hay muchos escenarios, sin embargo, tenía el mismo dominio para documentos e iframe y pude agregar esto al final de mi contenido de iframe:
Esto 'encuentra' el contenedor principal y luego establece la longitud agregando un factor de falsificación de 50 píxeles para eliminar la barra de desplazamiento.
No hay nada allí para "observar" el cambio de altura del documento, esto no lo necesitaba para mi caso de uso. En mi respuesta, traigo un medio para hacer referencia al contenedor principal sin usar identificadores horneados en el contenido principal / iframe.
fuente
Si puede vivir con una relación de aspecto fija y desea un iframe receptivo , este código le será útil. Son solo reglas CSS.
El iframe debe tener un div como contenedor.
El código fuente se basa en este sitio y Ben Marshall tiene una buena explicación.
fuente
Simplicidad:
fuente
Si el contenido es solo un html muy simple, la forma más simple es eliminar el iframe con javascript
Código HTML:
Código Javascript:
fuente
fuente