Я хочу очень быстро загрузить несколько изображений на веб-сайт. Какой метод лучше? - PullRequest
5 голосов
/ 26 февраля 2010

ОБНОВЛЕНИЕ: Этот вопрос устарел, не обращайте внимания

Итак ... моя идея состоит в том, чтобы загрузить полную мангу / комиксы сразу, с включенным индикатором выполнения, и создать вид потока, как:

  • Моя страница загружает основные (HTML + CSS + JS) (конечно)
  • Как только я закончу, я начинаю загружать imgs (URL-адреса хранятся в JS var) с моего сервера, один раз (или более быстрым способом), чтобы я мог сделать своего рода индикатор выполнения.
  • АЛЬТЕРНАТИВА: есть ли способ загрузить сжатый файл со всеми imgs и распаковать в браузере?
  • АЛЬТЕРНАТИВА: Я также думал о сохранении тогда как строки, а затем декодировать, они в основном .jpg
  • Изображения не должны показываться сразу, мне просто нужен обратный вызов, когда они сделаны.

XTML и HTML5 приемлемы

Какой самый быстрый способ загрузить серию изображений для моего сайта?

EDIT После @Oded комментария ... вопрос действительно в том, что является лучшей технологией для загрузки изображений, и пользователь не должен ждать каждый раз, когда переворачивает "страницу". Ориентация на более похожий опыт, например, когда вы читаете комиксы в реальной жизни.

EDIT2 Как некоторые люди помогли мне понять, я ищу предварительный загрузчик стероидов

EDIT3 Никакие css техники не сделают

Ответы [ 9 ]

7 голосов
/ 26 февраля 2010

Если вы разделите большие изображения на более мелкие части, они будут быстрее загружаться в современных браузерах благодаря конвейерной обработке.

alt text

5 голосов
/ 26 февраля 2010

Вы можете предварительно загрузить изображения в JavaScript, используя:

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

Это будет работать как тот, который вы описали как "сохранение изображения в строках".

5 голосов
/ 26 февраля 2010

АЛЬТЕРНАТИВА: есть ли способ загрузить файл сжатия со всеми imgs и распаковать в браузере?

Форматы изображений уже сжаты. Вы ничего не получите, если будете сшивать и пытаться еще больше сжать их.

Вы можете просто склеить изображения и использовать background-position для отображения их различных частей: это называется "спрайтинг". Но спрайты в основном полезны для небольших изображений, чтобы сократить количество HTTP-запросов к серверу и несколько уменьшить задержку; для больших изображений, таких как страницы манги, преимущество не так велико, возможно, перевешивается необходимостью извлекать одно гигантское изображение одновременно, даже если пользователь только читает первые несколько страниц.

АЛЬТЕРНАТИВА: Я также думал о сохранении в виде строк, а затем о декодировании

Чего бы это достигло? Передача в виде строки в большинстве случаев будет значительно медленнее, чем в двоичном формате. Затем, чтобы получить их из строк JavaScript в изображения, вам нужно будет использовать data: URL-адреса, которые не работают в IE6-IE7 и ограничены объемом данных, которые вы можете поместить в них. Опять же, это в первую очередь предназначено для небольших изображений.

Я думаю, что все, что вам действительно нужно, это стандартный загрузчик изображений.

3 голосов
/ 26 февраля 2010

спрайтов

Просто посмотрите, как это делает Facebook: http://b.static.ak.fbcdn.net/rsrc.php/z3JQK/hash/11cngjg0.png

Одно изображение, которое загружается быстрее, чем серия маленьких изображений. Чтобы отобразить значок, вы просто создаете div с фиксированными размерами и перемещаете фон внутри него. Ваш div работает как окно просмотра большого изображения. Вы используете background-position для перемещения к соответствующей части изображения. Все остальное скрыто.

Разные домены

Что-то, чего вы, вероятно, не знали - Internet Explorer имеет ограничение количества соединений на сервер. Вы можете прочитать об этом здесь: http://support.microsoft.com/?scid=kb;en-us;183110&x=17&y=11 ( вот точные цифры ).

Что это значит - если пользователь использует IE7, он сможет загружать ТОЛЬКО 4 (или 2) файла одновременно с вашего сервера независимо от скорости его интернет-соединения.

Чтобы ускорить процесс, вы можете создать несколько поддоменов: server1.mydomain.com, server2.mydomain.com, server3.mydomain.com и т. Д., А затем пользователь сможет загружать много файлов намного быстрее, поскольку вы используете разные хосты для обслуживать разные файлы.

1 голос
/ 26 февраля 2010

Предзагрузчики изображений существуют уже целую вечность. Вам действительно не нужно загружать их все сразу, вы можете сделать это по требованию [когда человек загружает следующую страницу, вы можете получить изображение после нее]

1 голос
/ 26 февраля 2010

Примечание: JPG и PNG уже сжаты.

Вы можете попробовать использовать технику "CSS sprites". По сути, идея в том, что вы используете вашу любимую программу для редактирования изображений, чтобы склеить все ваши изображения в одно изображение. Это быстрее отправить, потому что вы теряете накладные расходы на файл в плане кодирования изображения и его отправки. На стороне клиента вы используете CSS, чтобы выбрать только часть общего изображения, которая используется в любом месте.

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

И / ИЛИ

Вы можете использовать отложенную загрузку, чтобы загружать изображения только тогда, когда они появляются.
http://www.appelsiini.net/projects/lazyload

1 голос
/ 26 февраля 2010

Как только я начну загружать imgs ( URL хранятся в JS var) из моего сервер, один раз (или несколько быстрее путь) так что я могу сделать своего рода прогресс бар.

Ваш браузер уже сначала загружает HTML, поэтому он знает, как загрузить любые JS / изображения, на которые вы ссылаетесь. Вы пытаетесь изобрести что-то, что уже существует .

Просто убедитесь, что ваша манга состоит из множества изображений известного размера, которые вы указываете в своих img тегах. В большинстве браузеров есть индикатор прогресса, показывающий, что он загружает ресурсы для вас. Вы не сможете ускорить загрузку больших изображений, если не улучшите ни скорость, с которой ваш сервер обслуживает их, либо подключение к Интернету вашего пользователя, либо не сожмете их, чтобы уменьшить размер файлов изображений (вероятно, за счет качества изображения).

0 голосов
/ 26 февраля 2010
  • Моя страница загружает основные (HTML + CSS + JS) (конечно)
  • По завершении я начинаю загружать imgs (URL-адреса хранятся в JS var) из моего сервер, один раз (или какой-то более быстрый способ), чтобы я мог сделать своего рода индикатор выполнения.
  • Изображения не должны показываться сразу, мне просто нужен обратный звонок когда они будут сделаны.

Если вы хотите загрузить 10 изображений как можно быстрее, разместите на странице 10 <img> тегов, по одному для каждого изображения. Используйте Javascript, чтобы скрыть все, кроме текущего просматриваемого изображения; добавьте следующие / обратные ссылки, которые используют JS, чтобы скрыть текущее изображение и показать следующее. У многих браузеров уже есть какая-то форма индикатора выполнения, и при работе с обычным старым HTML он будет работать правильно.

Вы пытаетесь заново изобрести всю эту функциональность с помощью Javascript без веской причины. Вы не собираетесь делать это лучше, чем браузер.

Все это говорит, что это, вероятно, плохая идея. Вы можете сбросить 15 МБ комических страниц в окно браузера только для того, чтобы пользователь ушел после прочтения первой страницы. Вместо того, чтобы пытаться предварительно загружать все изображения, вы должны использовать JS, чтобы всегда сохранять предварительно загруженную следующую (или две) страницу, а не всю.

0 голосов
/ 26 февраля 2010

Вот кое-что, что вы можете попробовать, и я случайно кодировал его:

(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();
 })();

Поместите все имена ваших изображений (или те, которые вы хотите предварительно загрузить) в массив, и убедитесь, что этот скрипт запускаетсявверх, когда ваши страницы начинают загружаться.Он проработает список изображений, загрузит их, а затем перейдет к следующему, когда закончится каждое изображение.(Вызов setTimeout предназначен для того, чтобы убедиться, что обработчик "onload" не вызывается, пока вы все еще внутри обработчика.)

Возможно, вы захотите сделать это для большого количества "орехи и болты "изображения для всего сайта - иными словами, каждая страница будет пытаться загрузить изображения для всего.Конечно, как только они попадут в кеш, это не займет много времени.В качестве альтернативы, вы можете запустить этот скрипт только на нескольких страницах, таких как экраны входа в систему и главная «домашняя страница».Конечно, если у вас есть такой сайт, как Flickr, вы, вероятно, не захотите предварительно загружать все ваших изображений: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...