Ver Mensaje Individual
  #8 (permalink)  
Antiguo 10/07/2016, 10:34
Avatar de Alexis88
Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años, 3 meses
Puntos: 977
Respuesta: Optimizar de carga pagina

Estimado Gunet:

Paso a responder los puntos señalados:

1. Si cambias al <span> por un elemento <img>, <label> o el que fuera, y mantuvieras la clase que le asigné a los <span> del ejemplo, la funcionalidad seguiría siendo la misma.
Código HTML:
Ver original
  1. <ul id="lista">
  2.     <li>
  3.         <img src="imagen1.jpg" class="enlace" />
  4.         <div class="modal">
  5.             <iframe data-src="ejemplo.html"></iframe>
  6.         </div>
  7.     </li>
  8.     <li>
  9.         <img src="imagen2.jpg" class="enlace" />
  10.         <div class="modal">
  11.             <iframe data-src="otroEjemplo.html"></iframe>
  12.         </div>
  13.     </li>
  14. </ul>

2. Te aconsejo dejar la estructura como en el punto anterior y tener un <div> externo que serviría de fondo para todos los casos.
Código HTML:
Ver original
  1. <ul id="lista">
  2.     <li>
  3.         <img src="imagen1.jpg" class="enlace" />
  4.         <div class="modal">
  5.             <iframe data-src="ejemplo.html"></iframe>
  6.         </div>
  7.     </li>
  8.     <li>
  9.         <img src="imagen2.jpg" class="enlace" />
  10.         <div class="modal">
  11.             <iframe data-src="otroEjemplo.html"></iframe>
  12.         </div>
  13.     </li>
  14. </ul>
  15.  
  16. <div id="fondo"></div>

Con unos cuantos estilos, le darías la apariencia que necesitas:
Código CSS:
Ver original
  1. #fondo{
  2.     position: absolute; /* Posición absoluta para que pueda ser ubicado sin tomar en cuenta a los demás elementos */
  3.     background-color: black; /* Fondo de color negro */
  4.     display: none; /* Inicialmente, el fondo no debe verse */
  5.     top: 0; /* En el eje Y, se ubicará partiendo del borde superior del documento */
  6.     left: 0; /* En el eje X, se ubicará partiendo del borde izquierdo del documento */
  7.     width: 500%; /* Ancho amplio para que sea visible cuando se muestre un <iframe> ubicado muy abajo */
  8.     height: 500%;   /* Altura amplia para que sea visible cuando se muestre un <iframe> ubicado muy abajo */
  9. }

Y tan solo sería cuestión de que, cuando vayas a mostrar un <iframe>, selecciones al fondo, lo hagas visible (propiedad display) y le asignes una opacidad (propiedad opacity) mayor a cero y menor a uno para obtener un efecto de transparencia. También te aconsejo añadir un botón o imagen al cual, una vez que se le dé un clic, oculte tanto al <iframe> que se está mostrando como al fondo para que así el usuario pueda seleccionar otro. Debes tener en cuenta que, este último botón, también deberá ser mostrado y ocultado junto con cada <iframe> y el fondo.

Para que no se muestren las barras de desplazamiento al momento de mostrar el fondo (porque es más grande que la vista del documento), solo tendrías que ocultarlas mediante la propiedad overflow:
Código JavaScript:
Ver original
  1. document.body.overflow = "hidden";

Y volver a mostrarlas cuando ocultes al <iframe> y el fondo:
Código JavaScript:
Ver original
  1. document.body.overflow = "auto";

Para centrar al <iframe>, podrías asignarle una posición absoluta (así como el fondo) y aplicarle los siguientes estilos:
Código Javascript:
Ver original
  1. elIframe.style.top = window.innerHeight / 2 - elIframe.offsetHeight / 2 + window.scrollY + "px";
  2. elIframe.style.left = window.innerWidth / 2 - elIframe.offsetWidth / 2 + window.scrollX + "px";

De esta manera, el punto medio del <iframe> quedará en la misma ubicación del punto medio de la pantalla, centrándose completamente.

Como añadí un efecto de transición a todos los elementos para que los cambios de estilos (aunque no todos) se produzcan con un efecto de retardo, deberás centrar al <iframe> pasado el tiempo que se asignó a la propiedad transition en la hoja de estilos. En este ejemplo, fue de ".1s", es decir, cien milésimas de segundo; por lo tanto, necesitarás utilizar un temporizador para realizar el centrado efectivamente:
Código Javascript:
Ver original
  1. setTimeout(function(){
  2.     //Centramos al <iframe>
  3.     elIframe.style.top = window.innerHeight / 2 - elIframe.offsetHeight / 2 + window.scrollY + "px";
  4.     elIframe.style.left = window.innerWidth / 2 - elIframe.offsetWidth / 2 + window.scrollX + "px";
  5. }, 100);

Esto se debe a que, como se le asigna al <iframe> un ancho y alto en tiempo de ejecución, pasarán cien milésimas de segundo hasta que se complete el proceso, pero el centrado se ejecutará antes de que eso ocurra, por lo que, las medidas que se toman en las dos líneas que realizan el centrado, no serán las cifras finales.

Ejemplo en vivo (sin el botón para ocultar todo)

Algunos enlaces de referencia.
Si tienes otra duda, consúltanos con total confianza.

__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand