¿Cómo hacer que un iframe responda, sin asumir una relación de aspecto? Por ejemplo, el contenido puede tener cualquier ancho o alto, lo cual es desconocido antes de la representación.
Tenga en cuenta que puede usar Javascript.
Ejemplo:
<div id="iframe-container">
<iframe/>
</div>
Dimensione esto iframe-container
para que el contenido apenas encaje dentro sin espacio adicional, en otras palabras, hay suficiente espacio para el contenido para que pueda mostrarse sin desplazamiento, pero sin espacio en exceso. El contenedor envuelve el iframe perfectamente.
Esto muestra cómo hacer que un iframe responda, suponiendo que la relación de aspecto del contenido es 16: 9. Pero en esta pregunta, la relación de aspecto es variable.
javascript
html
css
iframe
responsive-design
fermentar
fuente
fuente
Respuestas:
No es posible interactuar con un iFrame de origen diferente usando Javascript para obtener el tamaño del mismo; la única forma de hacerlo es mediante el uso
window.postMessage
deltargetOrigin
conjunto a su dominio o el comodín*
de la fuente iFrame. Puede representar los contenidos de los diferentes sitios de origen y su usosrcdoc
, pero eso se considera un hack y no funcionará con SPA y muchas otras páginas más dinámicas.Mismo tamaño de iFrame de origen
Supongamos que tenemos dos iFrames del mismo origen, uno de corta altura y ancho fijo:
y un iFrame de larga altura:
Podemos obtener el tamaño de iFrame en el
load
evento usandoiframe.contentWindow.document
que enviaremos a la ventana principal usandopostMessage
:Obtendremos el ancho y la altura adecuados para ambos iFrames; Puede consultarlo en línea aquí y ver la captura de pantalla aquí .
Hack de diferente tamaño de iFrame ( no recomendado )
El método descrito aquí es un truco y debe usarse si es absolutamente necesario y no hay otra forma; no funcionará para la mayoría de las páginas dinámicas generadas y SPA. El método obtiene el código fuente HTML de la página utilizando un proxy para omitir la política CORS (
cors-anywhere
es una manera fácil de crear un servidor proxy CORS simple y tiene una demostración en líneahttps://cors-anywhere.herokuapp.com
) y luego inyecta el código JS a ese HTML para usarlopostMessage
y enviar el tamaño del iFrame al documento padre. Incluso maneja el evento iFrameresize
( combinado con iFramewidth: 100%
) y publica el tamaño del iFrame en el padre.patchIframeHtml
:Una función para parchear el código HTML de iFrame e inyectar Javascript personalizado que se usará
postMessage
para enviar el tamaño de iFrame al padre unaload
y otra vezresize
. Si hay un valor para elorigin
parámetro, entonces se<base/>
agregará un elemento HTML al encabezado usando esa URL de origen, por lo tanto, los URI de HTML como/some/resource/file.ext
serán recuperados correctamente por la URL de origen dentro del iFrame.getIframeHtml
:Una función para obtener una página HTML sin pasar por CORS usando un proxy si
useProxy
se establece param. Puede haber parámetros adicionales que se pasaránpostMessage
al enviar datos de tamaño.La función de controlador de eventos de mensaje es exactamente la misma que en "Mismo tamaño de iFrame de origen" .
Ahora podemos cargar un dominio de origen cruzado dentro de un iFrame con nuestro código JS personalizado inyectado:
Y conseguiremos que el iFrame se ajuste a su contenido a toda su altura sin ningún desplazamiento vertical, incluso si se usa
overflow-y: auto
para el cuerpo del iFrame ( debe seroverflow-y: hidden
así para que no tengamos parpadeo de la barra de desplazamiento al cambiar el tamaño ).Puedes consultarlo en línea aquí .
Una vez más, para notar que esto es un truco y debe evitarse ; que no se puede acceder de origen cruzado documento marco flotante ni inyectar cualquier tipo de cosas.
fuente
cors-anywhere
en este momento, por lo que no puede ver la página de demostración . No quiero agregar una captura de pantalla del sitio externo por razones de derechos de autor. Agregaré otro proxy CORS si eso permanece inactivo por mucho tiempo.Hay muchas complicaciones al calcular el tamaño del contenido en un iframe, principalmente debido a que CSS le permite hacer cosas que pueden romper la forma en que mide el tamaño del contenido.
Escribí una biblioteca que se encarga de todas estas cosas y también funciona en varios dominios, puede que le resulte útil.
https://github.com/davidjbradshaw/iframe-resizer
fuente
Mi solución está en GitHub y JSFiddle .
Presentar una solución para iframe receptivo sin suposición de relación de aspecto.
Nota: no olvide llamar a la función de cambio de tamaño después de cargar la página, ya que la ventana no cambia de tamaño por sí sola después de cargar la página.
El código
index.html
style.css
main.js
Pasé un tiempo en esto. Espero que lo disfrutes =)
Editar Esta es probablemente la mejor solución genérica. Sin embargo, cuando se hace muy pequeño, el iframe no tiene el tamaño adecuado. Esto es específico del iframe que está utilizando. No es posible codificar una respuesta adecuada para este fenómeno a menos que tenga el código del iframe, ya que su código no tiene forma de saber qué tamaño prefiere el iframe para que se muestre correctamente.
Solo algunos trucos como el presentado por @Christos Lytras pueden hacer el truco, pero nunca funcionará para cada iframe. Solo en una situación particular.
fuente
Haga una cosa: establezca el contenedor de marco flotante, un poco de ancho y alto, establezca la propiedad CSS
fuente