2010-02-26 14 views
5

ACTUALIZACIÓN: Esta pregunta es obsoleta, por favor ignoreQuiero cargar varias imágenes muy rápido en un sitio web, ¿cuál es el mejor método?

Así que .. mi idea es cargar una manga llena/cómics a la vez, con una barra de progreso incluido, y hacer una especie de corriente, como:

  • mi página carga la base (HTML + CSS + JS) (por supuesto)
  • Como se ha hecho, comienzo a cargar los IMG (las direcciones URL se almacenan en JS var) de mi servidor, una vez (o alguna forma más rápida) para que pueda hacer una especie de barra de progreso.
  • ALTERNATIVA: ¿Hay alguna manera de cargar un archivo de compresión con todos los archivos IMG y descomprimir en el navegador?
  • ALTERNATIVA: Yo también estaba pensando en el ahorro de entonces como cadenas y luego decodificar, que son en su mayoría .jpg
  • Las imágenes no tienen que mostrar de inmediato, sólo necesito la devolución de llamada cuando se hacen.

XTML y HTML5 es aceptable

¿Cuál es la manera más rápida para cargar una serie de imágenes para mi sitio web?

EDITAR Desde comentario @Oded .. la pregunta es realmente lo que es la mejor tecnología para cargar las imágenes y el usuario no tenga que esperar cada vez que se enciende la 'página'. Apuntando a una experiencia más similar, como cuando lees cómics en la vida real.

Edit2 Como algunas personas me ayudó a comprender, estoy buscando un pre-loader en los esteroides

Edit3 No hay técnicos de CSS harán

+2

Obtendrá más respuestas si realmente hace una pregunta. – Oded

+0

No podrá comprimir JPG porque ya están comprimidos. También guardarlos como cadenas no tiene sentido, excepto quizás para iconos muy pequeños que usan el protocolo de datos. – nalply

+0

¿A qué te refieres con "guardar entonces [sic] como cadenas y luego decodificar"? –

Respuesta

6

Si divide imágenes grandes en partes más pequeñas, se cargarán más rápido en los navegadores modernos debido a la canalización.

alt text

+2

El ejemplo aquí supone que 3 imágenes enrutadas serán más rápidas que 3 imágenes cargadas secuencialmente. Eso es verdad. Pero suponer que 3 imágenes canalizadas serán más rápidas de lo que 1 imagen puede ser, en el mejor de los casos, una suposición. De hecho, múltiples apretones de manos de 3 vías a lo largo de un enlace de larga distancia (alta latencia) pueden provocar que el enfoque de "pipeline" tome más tiempo. –

+2

Muy buen punto, ¡ahora estamos hablando! –

+0

Corrígeme si me equivoco, pero dividir una sola imagen para el pipeline solo agregaría beneficios si estuviera descargando una sola imagen grande. Como está, él ya está transfiriendo varios archivos, por lo que la canalización ocurrirá independientemente. – meagar

5

ALTERNATIVA: ¿Existe una forma de cargar un archivo de compresas con todos los archivos IMG y descomprimir en el navegador?

Los formatos de imagen ya están comprimidos. No ganarías nada al coser e intentar comprimirlos aún más.

puede simplemente pegue las imágenes y use background-position para mostrar diferentes partes de ellas: esto se llama 'spriting'. Pero spriting es principalmente útil para imágenes más pequeñas, para reducir el número de solicitudes HTTP al servidor y reducir algo la latencia; para imágenes más grandes, como las páginas manga, el beneficio no es tan grande, posiblemente superado por la necesidad de buscar una imagen gigante de una vez, incluso si el usuario solo va a leer las primeras páginas.

ALTERNATIVA: Yo también estaba pensando en el ahorro de entonces como cadenas y luego decodificar

Lo que habría que lograr? La transferencia como cadena sería, en la mayoría de los casos, considerablemente más lenta que el binario en bruto. Luego, para obtener cadenas de JavaScript en imágenes, deberá usar las URL data:, que no funcionan en IE6-IE7, y están limitadas a la cantidad de datos que puede poner en ellas. De nuevo, esto está destinado principalmente para imágenes pequeñas.

Creo que todo lo que realmente quieres es un preloader de imágenes estándar de pantano.

+0

Sí, de acuerdo, para imágenes pequeñas es una buena tecnología, pero no es el caso, ya que sobrecargaría mucho sin ningún beneficio, o incluso un bloqueo del navegador ya que el img sería gigantesco. –

+0

Estaba buscando un preloader con esteroides, ¿quizás un SWF? Mi única preocupación es que no utilizo un CDN, pero tampoco quiero caer en el límite de carga de imagen. –

1

Como se ha hecho, comienzo a cargar los IMG (los URL se almacenan en JS var) de mi servidor , una vez (o alguna más rápido manera) para que pueda hacer una especie de progreso bar.

Su navegador ya descarga el HTML primero, así es como sabe cargar cualquier JS/imágenes que haga referencia. Está intentando inventar algo que ya existe.

Solo asegúrate de que tu manga esté compuesta por muchas imágenes de un tamaño conocido, que especifiques en tus etiquetas img. La mayoría de los navegadores tienen algún tipo de barra de progreso para mostrar que está cargando recursos para usted. No va a hacer que la carga de imágenes grandes sea más rápida a menos que mejore la velocidad a la que el servidor las atienda o la conexión a Internet de su usuario, o las comprima para reducir sus archivos de imagen (probablemente a costa de la calidad de imagen).

+0

Ok, respuesta justa tnxs –

4

Se puede cargar previamente las imágenes en JavaScript usando:

var x = new Image(); 
x.src = "someurl"; 

Esto funcionaría como el que usted describe como "guardar la imagen en las cadenas".

1

Nota: JPG y PNG ya están comprimidos.

Puede intentar usar una técnica de "sprites CSS". Básicamente, la idea es usar tu programa favorito de edición de imágenes para unir todas tus imágenes en una sola imagen. Es más rápido enviar esto porque pierde la sobrecarga por archivo en términos de codificación de la imagen y envío de la imagen. En el lado del cliente, utiliza CSS para seleccionar solo la parte de la imagen total que se usa en cualquier lugar.

http://www.alistapart.com/articles/sprites/
http://www.fiftyfoureleven.com/weblog/web-development/css/css-sprites-images-optimization

Y/O

Puede utilizar la carga diferida para cargar imágenes sólo cuando vienen a la vista.
http://www.appelsiini.net/projects/lazyload

0

aquí hay algo que puede realizar, que por casualidad acabo codificado por:

(function() { 
    var imgs = [ "image1.png", "image2.png", ... /* all your image names */ ], 
    index = 0, 
    img; 

    function loader() { 
    if (index >= imgs.length) return; 
    (img = new Image()).onload = loader; 
    setTimeout(function() { img.src = "/path/to/images/" + imgs[index++]; }, 1); 
    } 

    loader(); 
})(); 

Plop todos sus nombres de imagen (o las que desee para cargar previamente) en la matriz, y asegurarse de que esto script se inicia cuando sus páginas comienzan a cargarse. Recorrerá la lista de imágenes, las cargará y luego pasará a la siguiente cuando termine cada imagen. (La llamada setTimeout es para asegurarse de que el manejador "onload" no reciba una llamada cuando aún está dentro de un controlador.)

Probablemente quiera hacer esto para muchos de los "tornillos y tuercas" imágenes para todo su sitio; en otras palabras, cada página intenta cargar imágenes para todo. Una vez que están en el caché, por supuesto, esto no tomará una cantidad significativa de tiempo. Alternativamente, podría ejecutar esta secuencia de comandos solo en un par de páginas, como pantallas de "inicio de sesión" y la página principal "inicio".Por supuesto, si usted tiene un sitio como Flickr, entonces es probable que no quieren cargar previamente todos sus imágenes :-)

1

Image preloaders han existido por siglos. Usted realmente no necesita cargar todos a la vez, puede hacerlo en la demanda [cuando la persona que carga la página siguiente, se puede recuperar la imagen después de que]

+0

Esto es lo que iría con un ligero giro: cargue las páginas 1 y 2 para comenzar cuando la persona pase a la página 2, comience a cargar la página 3 en segundo plano. De esta forma, no tiene que cargar todo el cómic por adelantado, pero cada página será rápida ya que la página siguiente ya está cargada cuando el lector llegue al final de la página actual. – Paolo

3

spriting

Sólo echar un vistazo cómo lo hace facebook: http://b.static.ak.fbcdn.net/rsrc.php/z3JQK/hash/11cngjg0.png

Una imagen que carga MÁS RÁPIDAMENTE que series de imágenes pequeñas. Para mostrar el icono, simplemente crea un div con dimensiones fijas y mueve el fondo dentro de él. Tu div funciona como una ventana gráfica para la imagen grande. Utiliza la posición de fondo para moverse a la parte apropiada de la imagen. Todo lo demás está oculto.

diferentes dominios

algo que probablemente no sabía - Internet Explorer tiene un límite de conexiones por servidor. Puede leer sobre esto aquí: http://support.microsoft.com/?scid=kb;en-us;183110&x=17&y=11 (here are exact numbers).

Qué significa: si el usuario está utilizando IE7, podrá cargar SOLO 4 (o 2) archivos al mismo tiempo desde su servidor, independientemente de la velocidad de su conexión a Internet.

Para acelerar las cosas, puede crear algunos subdominios: servidor1.midominio.com, servidor2.dominio.com, servidor.midominio.com, etc. - y luego el usuario puede descargar muchos archivos mucho más rápido, porque utiliza diferentes hosts para servir diferentes archivos

+0

Sprint: CSS no funcionará para esto. Sí, estoy al tanto de ese límite de IE, mi ALTERNATIVA sobre cadenas y compacidad tenía eso en mente. –

0
  • Mi página carga la base (HTML + CSS + JS) (por supuesto)
  • Como se ha hecho, comienzo a cargar los IMG (las direcciones URL se almacenan en JS var) a partir de mi servidor , uno por vez (o una forma más rápida) para que pueda hacer una especie de barra de progreso.
  • Las imágenes no tienen que mostrarse de inmediato, solo necesito la devolución de llamada cuando hayan terminado.

Si desea cargar 10 imágenes tan rápido como sea posible, colocar 10 <img> etiquetas en la página, uno para cada imagen. Use Javascript para ocultar toda la imagen, excepto la vista actualmente; agregue los enlaces siguiente/posterior que usan JS para ocultar la imagen actual y mostrar la siguiente. Muchos navegadores ya tienen algún tipo de barra de progreso, y al hacer cosas con el viejo HTML normal, funcionará correctamente.

Está intentando reinventar toda esta funcionalidad con Javascript sin ningún motivo justificado. No lo vas a hacer mejor que el navegador.

Dicho todo esto, esta es probablemente una mala idea. Puede descargar 15MB de páginas de cómic en la ventana del navegador para que el usuario se vaya después de leer la primera página. En lugar de tratar de precargar todas las imágenes, debe usar JS para mantener siempre la página siguiente (o dos) precargadas, no toda la cosa.

+0

La tecnología es lo básico que tenía en mente, alternativa al objeto de imagen js. Es probable 2MB (imagen en blanco y negro), y no, ¡estoy tratando de encontrar una rueda _improved_! Las personas probablemente no se retiren en medio de un cómic ... Y si lo hacen, simplemente no lo cargará todo. –

+0

Estoy diciendo que su camino agregará complejidad sin ganancia. No puede usar Javascript para hacer que los datos ya comprimidos viajen por las tuberías más rápido. – meagar

+0

Quiero agregar complejidad, sí, pero para agregar ganancia, de lo contrario no tiene sentido. Vea la respuesta de @Chris Dennett, ese es el tipo de cosas que busco, ahora necesito hacerlo factible –

Cuestiones relacionadas