El problema es que cuando tiene que usar IFrames para insertar contenido en un sitio web, entonces en el mundo web moderno se espera que el IFrame también responda. En teoría es simple, simplemente use <iframe width="100%"></iframe>
o configure el ancho de CSS eniframe { width: 100%; }
sin embargo, en la práctica no es tan simple, pero puede serlo.
Si el iframe
contenido responde completamente y puede cambiar su tamaño sin barras de desplazamiento internas, iOS Safari cambiará el tamaño deliframe
sin problemas reales.
Si considera el siguiente 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>
Con el 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>
Entonces esto funciona sin problemas en iOS 7.1 Safari. Puede cambiar entre paisaje y retrato sin ningún problema.
Sin embargo, simplemente cambiando Content.html CSS agregando esto:
#ScrolledArea {
width: 100%;
overflow: scroll;
white-space: nowrap;
background: #ff0000;
}
Obtienes esto:
Como puede ver, aunque el contenido Content.html es totalmente receptivo ( div # ScrolledArea se ha overflow: scroll
establecido) y el ancho del iframe es del 100%, el iframe todavía toma el ancho completo del div # ScrolledArea como si el desbordamiento no existiera.Manifestación
En casos como este, si el iframe
contenido tiene áreas de desplazamiento, la pregunta es cómo iframe
responder, cuando el contenido del iframe tiene áreas de desplazamiento horizontal. El problema aquí no está en el hecho de que Content.html no responde, sino en el hecho de que iOS Safari simplemente cambia el tamaño del iframe para que div#ScrolledArea
sea completamente visible.
white-space: nowrap
estilo?white-space: nowrap
en sí mismo no es el problema. Simplemente lo estoy usando para obtener un ancho extremodiv#ScrolledArea
. El problema surge cuando el contenido de IFrame tiene áreas desplazables horizontalmente. Si ese es el caso, iOS Safari simplemente ignora la configuración de ancho y muestra el contenido del agujero y rompe la capacidad de respuesta del sitio.Respuestas:
La solución para este problema es en realidad bastante simple y hay dos formas de solucionarlo. Si tiene control sobre Content.html , simplemente cambie el
div#ScrolledArea
ancho CSS a:Básicamente, la idea aquí es simple, establece el valor
width
en algo que es más pequeño que la ventana gráfica (ancho del iframe en este caso) y luego lo sobrescribemin-width: 100%
para permitirwidth: 100%
que el Safari de iOS sobrescriba por defecto. El*width: 100%;
está ahí por lo que el código seguiría siendo compatible IE6, pero si no le importa para IE6 se puede omitir. ManifestaciónComo puede ver ahora, el
div#ScrolledArea
ancho es en realidad del 100% yoverflow: scroll;
puede hacer lo suyo y ocultar el contenido desbordado. Si tiene acceso al contenido del iframe, entonces es preferible.Sin embargo, si no tiene acceso al contenido del iframe (por cualquier razón), puede utilizar la misma técnica en el propio iframe. Simplemente use el mismo CSS en el iframe:
Sin embargo, hay una limitación con esto, debe desactivar las barras de desplazamiento con
scrolling="no"
el iframe para que esto funcione:Si las barras de desplazamiento están permitidas, esto ya no funcionará en el iframe. Dicho esto, si modifica Content.html en su lugar, puede retener el desplazamiento en el iframe. Manifestación
fuente
!important
alwidth
atributo para tener listo el diseño web sensible al iframe en un iPhone 4 con iOS 7width
se haya configurado anteriormente!important
o que una CSS de mayor prioridad lo sobrescribiera. En casos aislados en iPhone 4 iOS7 no era necesario.scrolling="yes"
contrario no hay forma de corregir esto, para que la solución funcione en IFRAME solo necesita tenerloscrolling="no"
en el IFRAMEParece que el problema es que Mobile Safari se negará a obedecer el ancho de su iFrame si el documento que contiene es más ancho de lo que ha especificado. Ejemplo:
http://jsbin.com/hapituto/1
En un navegador de escritorio, verá un iFrame y un Div ambos configurados en 300 px. El contenido es más amplio para que pueda desplazarse por el iFrame.
Sin embargo, en el safari móvil, notará que el iFrame se expande automáticamente al ancho del contenido.
Supongo que esta es una solución para problemas de larga data con el desplazamiento de contenido dentro de una página. En el pasado, si tenía un iframe de desplazamiento grande en un dispositivo táctil, se quedaba 'atascado' en el iframe, ya que se desplazaría en lugar de la página en sí. Parece que Apple ha decidido que el comportamiento predeterminado de un iFrame es 'sin desplazamiento' y se expande para evitarlo.
Una opción puede ser esta solución alternativa. En lugar de suponer que el iFrame se desplazará, coloque el iframe en un DIV sobre el que tenga control y deje que se desplace.
ejemplo: http://jsbin.com/zakedaja/1
Marcado de ejemplo:
En el safari móvil, ahora puede desplazarse por el contenido del iFrame ahora completamente expandido a través del div que lo contiene.
El truco: esto se ve realmente feo en un navegador de escritorio, ya que ahora tiene barras de desplazamiento dobles. Por lo tanto, es posible que deba detectar el navegador con JS para evitar esto.
fuente
div#ScrolledArea
(en verde) en mi ejemplo. Acabo de leer mal antes. Pero el iframe no debería estar desplazándose solo cambiando su tamaño en función del elemento contenedor, es decir, tenerwidth: 100%;
Necesitaba una solución de navegador cruzado. Los requisitos fueron:
A partir de lo que aprendí de @Idra sobre el desplazamiento = "no" en iOS y esta publicación sobre cómo ajustar el contenido de iFrame a la pantalla en iOS, esto es lo que terminé. Espero que ayude a alguien =)
HTML
CSS
JS
fuente
El problema con todas estas soluciones es que la altura del
iframe
nunca cambia realmente.Esto significa que no podrá centrar elementos dentro del
iframe
uso de Javascriptposition:fixed;
, oposition:absolute;
ya que eliframe
mismo nunca se desplaza.Mi solución detallada aquí es envolver todo el contenido del iframe dentro de un
div
uso de este CSS:De esta manera, Safari cree que el contenido no tiene altura y le permite asignar la altura del contenido
iframe
correctamente. Esto también le permite colocar elementos de la forma que desee.Puedes ver una demostración rápida y sucia aquí.
fuente
iframe
, pero en mi caso, lo hago. ¡Salud!Este problema también está presente en iOS Chrome.
Eché un vistazo a todas las soluciones anteriores, la mayoría son muy hacky.
Si no necesita soporte para navegadores antiguos, simplemente configure el ancho del iframe en 100vw;
Nota: Verifique el soporte para unidades de viewport https://caniuse.com/#feat=viewport-units
fuente
Estoy trabajando con ionic2 y la configuración del sistema es la siguiente:
Para mí, este problema se resolvió con este código,
para la etiqueta html iframe,
Ver css de lo mismo que-
La propiedad de posición juega un papel vital aquí en mi caso.
posición: relativa;
¡Puede que también te ayude!
fuente
Solución solo CSS
HTML
CSS
MANIFESTACIÓN
Otra demostración aquí con página HTML en iframe
fuente
Tuve un problema con el ancho en el panel de contenido al crear una barra de desplazamiento horizontal para el iframe. Resultó que una imagen tenía el ancho más ancho de lo esperado. Pude resolverlo estableciendo todas las imágenes css max-width en un porcentaje.
fuente
de hecho para mí solo trabajé en ios deshabilitando el pergamino
<iframe src="//www.youraddress.com/" scrolling="no"></iframe>
y tratar el sistema operativo a través de script.
fuente
Para mí, las soluciones CSS no funcionaron. Pero establecer el ancho mediante programación hace el trabajo. En la carga de iframe, configure el ancho mediante programación:
fuente