Foros del Web » Programando para Internet » Javascript »

Cambio de Imagen para responsividad

Estas en el tema de Cambio de Imagen para responsividad en el foro de Javascript en Foros del Web. Hola. Tengo una imagen de presentación de gran tamaño en la portada de mi sitio y quiero cambiarla en función de la resolución de la ...
  #1 (permalink)  
Antiguo 05/08/2016, 03:35
 
Fecha de Ingreso: noviembre-2005
Mensajes: 889
Antigüedad: 18 años, 5 meses
Puntos: 8
Cambio de Imagen para responsividad

Hola.

Tengo una imagen de presentación de gran tamaño en la portada de mi sitio y quiero cambiarla en función de la resolución de la pantalla.

Conozco la problemática de la responsividad de imágenes, y no voy a discutirla. He decidido que la imagen sea otra distinta a medida que el tamaño del screen baja.

Utilizo Jquery para identificar el width, y luego:

Código:
document.getElementById("laid").src="archivos/imagen2.png"
Etc.

El problema me resulta cuando veo (soy nuevo) que tienes que poner el código abajo en la página, porque si lo pones primero, no me funciona. Tengo que colocarlo bajo la imagen en sí para que la cambie al llegar el momento.

Incluso probando sólo con el código de arriba, es lo mismo; sólo funciona si está bajo la imagen en el html.

Pero esto no me sirve ni sirve para nada en realidad, porque la imagen que hay que cambiar ya se ha cargado y se trata de que no se cargue para optimizar la página en función del width. Es decir, que se cargue la imagen2.png en lugar de imagen.png para los que accedan desde el dispositivo correspondiente.

No voy a explicar más porque sé que me entendéis.

¿Hay solución a esto? ¿Estoy haciendo algo mal?

Gracias.
  #2 (permalink)  
Antiguo 05/08/2016, 04:49
 
Fecha de Ingreso: julio-2015
Mensajes: 85
Antigüedad: 8 años, 9 meses
Puntos: 4
Respuesta: Cambio de Imagen para responsividad

Buenas

Eso que comentas que solo funciona cuando lo pones debajo es debido a que esa linea se esta ejecutando antes de que el elemento html se haya creado entonces no encuentra ningun elemento con esa id.

Para resolverlo tienes la opcion javascript:
Código Javascript:
Ver original
  1. window.onload = function(){
  2. //Aqui el codigo JavaScript
  3. }

O la opcion JQuery

Código Javascript:
Ver original
  1. $(document).ready(function () {
  2. //Aqui el codigo JavaScript
  3. });

Ambas operaciones realizan la misma funcion, es lo que hace es ejecutar el codigo javascript una vez que se haya cargado todo el html asi evitas que te pase lo que sucede
  #3 (permalink)  
Antiguo 05/08/2016, 05:28
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Cambio de Imagen para responsividad

deberías de leer sobre la diferencia entre load y DOMContentLoaded
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #4 (permalink)  
Antiguo 05/08/2016, 15:00
 
Fecha de Ingreso: noviembre-2005
Mensajes: 889
Antigüedad: 18 años, 5 meses
Puntos: 8
Respuesta: Cambio de Imagen para responsividad

Ya entiendo, y he leído las referencias de Mozilla.

Pero entonces no me sirve, porque de lo que se trata es de ahorrar carga al navegador haciendo que se cargue la imagen2 en lugar de la imagen que estaba por defecto. Pero si tiene que esperar a que se cargue y parsee todo el contenido, entonces ya se ha cargado.

Entonces habría que establecer una condición para cargar una u otra en función del width, pero no quitar una y poner otra a medida que el width.

¿Estoy en lo cierto?

Gracias.
  #5 (permalink)  
Antiguo 05/08/2016, 20:58
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Cambio de Imagen para responsividad

¿Y si mejor utilizas media queries?

Código CSS:
Ver original
  1. @media all and (min-width: 800px){
  2.     #myImg{
  3.         content: url(imagenGrande.jpg);
  4.     }
  5. }
  6.  
  7. @media all and (min-width: 320px) and (max-width: 800px){
  8.     #myImg{
  9.         content: url(imagenMediana.jpg);
  10.     }
  11. }
  12.  
  13. @media all and (max-width: 320px){
  14.     #myImg{
  15.         content: url(imagenChica.jpg);
  16.     }
  17. }

__________________
«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

Última edición por Alexis88; 05/08/2016 a las 21:12 Razón: Corrección
  #6 (permalink)  
Antiguo 06/08/2016, 05:30
 
Fecha de Ingreso: noviembre-2005
Mensajes: 889
Antigüedad: 18 años, 5 meses
Puntos: 8
Respuesta: Cambio de Imagen para responsividad

Esto ya lo conozco, ¿pero acaso el contenido incluido a través de la propiedad content es indexable?

No. Porque no forma parte del código en sí.

No me sirve. Además, las imágenes llevan alt y title.

Más aun, y aunque ello no venga al caso, tienen forma irregular y sobre ellas a un área para un enlace muy especial con forma irregular que coincida con la forma de la imagen.

No valen las media queries.
  #7 (permalink)  
Antiguo 06/08/2016, 09:44
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Cambio de Imagen para responsividad

Para un caso como el que recién explicaste —y que creo que debiste mencionar desde un inicio para así recomendarte otra solución—, pues, solo te queda controlar el problema mediante una función que se ejecute antes de la carga de los subrecursos del DOM (audio, vídeo, imágenes, frames), pero luego de la carga del DOM.

Código Javascript:
Ver original
  1. document.addEventListener("readystatechange", function(){
  2.     switch (this.readyState){
  3.         case "loading":
  4.             console.log("El documento está cargando");
  5.             break;
  6.         case "interactive":
  7.             console.log("El DOM ha terminado de cargar, pero no los subrecursos");
  8.             break;
  9.         case "complete":
  10.             console.log("El DOM y los subrecursos han terminado de cargar");
  11.             break;
  12.     }
  13. }, false);

Desde que el documento empieza a cargar hasta que termina, se producen tres eventos cuya descripción puedes ver en los mensajes del ejemplo. Sabiendo esto, lo que podrías hacer es, leer las medidas del dispositivo (ancho y alto) y, según sea el caso, asignar la imagen respectiva, misma que cargará de forma asíncrona puesto que fue añadida luego del proceso de carga del DOM. Esto es algo similar al ejemplo de las media queries, pues también deberás leer las medidas del dispositivo para establecer una imagen en particular, solo que aquí también podrás definir los valores para las propiedades alt y title. Y estos mismos cambios deberás establecerlos en una función que se ejecute cuando se redimensione la ventana o cuando se cambie la orientación del dispositivo, para lo cual existen los eventos respectivos.

__________________
«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
  #8 (permalink)  
Antiguo 06/08/2016, 10:35
Avatar de siddartha23  
Fecha de Ingreso: septiembre-2013
Mensajes: 357
Antigüedad: 10 años, 7 meses
Puntos: 39
Respuesta: Cambio de Imagen para responsividad

Mobile first. Carga por defecto la imagen mas ligera.

Y en desktop, que es donde tienes mas recursos, recién cargas tu script y reemplazas la imagen por una mas acorde al tamaño de la pantalla...
__________________
velarde23.com - Soluciones Web
  #9 (permalink)  
Antiguo 06/08/2016, 11:15
 
Fecha de Ingreso: noviembre-2005
Mensajes: 889
Antigüedad: 18 años, 5 meses
Puntos: 8
Respuesta: Cambio de Imagen para responsividad

He visto vuestras soluciones y las estoy poniendo en práctica.

Gracias.
  #10 (permalink)  
Antiguo 06/08/2016, 14:30
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Cambio de Imagen para responsividad

Cita:
Iniciado por JUMASOL Ver Mensaje
Ya entiendo, y he leído las referencias de Mozilla.

Pero entonces no me sirve, porque de lo que se trata es de ahorrar carga al navegador haciendo que se cargue la imagen2 en lugar de la imagen que estaba por defecto. Pero si tiene que esperar a que se cargue y parsee todo el contenido, entonces ya se ha cargado.

Entonces habría que establecer una condición para cargar una u otra en función del width, pero no quitar una y poner otra a medida que el width.

¿Estoy en lo cierto?

Gracias.
en realidad no posteé para darte una opción, sino en respuesta a la sugerencia de dardosmania de usar el evento load. para que entiendas la diferencia entre ambos eventos, te dejo este ejemplo
Cita:
<!DOCTYPE html>
<html dir="ltr" lang="es-es">
<head>
<title></title>
<meta charset="utf-8">
<style>
div {
font-size: 2rem;
}
</style>
<script>
document.addEventListener('DOMContentLoaded', function() {

document.querySelector('div').textContent = 'se ha disparado DOMContentLoaded y la imagen no ha empezado a cargar';

}, false);


window.addEventListener('load', function() {

document.querySelector('div').textContent = 'se ha completado la carga de todos los elementos de la página';

}, false);

</script>
</head>
<body>
<div></div>
<img src="http://cdn2.wallpapersok.com/uploads/picture/449/111/111449/loshadi-beg-trava-oblaka-515.jpg?width=7510&height=5350&crop=true">

</body>
</html>
y para darte una opción al caso que ocupa - supeditada a la compatibilidad con los navegadores - tienes la etiqueta <picture> de html5
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}

Etiquetas: funcion, html
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:06.