Быстрая и синхронная подгрузка картинок.
Добрый вечер.
Недавно у меня появился проект на котором требуется, что бы вся графика на странице появлялась(при загрузке страницы) одновременно и без особых задержек. Вопрос: Какие механизмы на сегодняшний день существуют в этом плане? (можно ли это организовать спрайтами или при помощи JS что-нибудь придумать?) |
Цитата:
"без особых задержек" - расплывчатая формулировка я тоже хочу, чтобы у меня было пару гигов фото, а отобразилось всё мгновенно при открытии страницы :haha: |
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script> <style> .img {display: none} </style> <img src="http://javascript.ru/forum/image.php?u=18034&dateline=1325652067"> <img class="img" src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235"> <img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235"> <img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235"> <script> jQuery(function ($) { var d = 0; var images = $(".img"); var len = images.size(); images.each(function() { $(this).on("load", function () { d++; }); }); var int = setInterval(function () { if (d == len) { images.show(); clearInterval(int); } }, 500); }); </script> если вообще все, то просто по window.onload если хоть с одной будут проблемы, не покажется ничего :) |
each можно убрать
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script> <style> .img {display: none} </style> <img src="http://javascript.ru/forum/image.php?u=18034&dateline=1325652067"> <img class="img" src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235"> <img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235"> <img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235"> <script> jQuery(function ($) { var d = 0; var images = $(".img"); var len = images.size(); images.on("load", function () { d++; }); var int = setInterval(function () { if (d == len) { images.show(); clearInterval(int); } }, 500); }); </script> |
bes,
а в ие проверяли? |
Цитата:
|
на форуме через ie - да, чёт не всё ладно
|
bes,
пробовал ие и без форума результат тотже нет картинок. |
Цитата:
Цитата:
Проверил у себя: C форума в IE тоже проблема - но с локалки в IE отображается в норме.(если картинки маленькие.) Если картинки побольше и все это дело на хостинг залить - то тогда всё это дело работает через раз. (По крайней мере лично у меня..) http://webmaster.ayrveda.ru/111/js_template.htmlhttp://webmaster.ayrveda.ru/111/js_template.html Пробовал увеличивать временной интервал(до 3500) - но это не помогает. В норме работает(всё это дело) только, если картинки уже в кеше браузера есть.. |
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script> <script>var d = 0;</script> <div id=out></div> <div style="position:absolute;z-index:-100;visibility:hidden"> <img class="img" src="http://javascript.ru/forum/image.php?u=18034&dateline=1325652067" onload="d++"> <img class="img" src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="d++"> <img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="d++"> <img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="d++"> </div> <script> var len = $(".img").length; var int = setInterval(function () { if (d >= len) { $(".img").appendTo("#out"); clearInterval(int); } }, 100); </script> |
Цитата:
(или я что то не правильно понял..) http://webmaster.ayrveda.ru/333/js_template.html Поставил интервал 7000 но грузиться все равно всё сразу + не одномоментно. |
Mike_Kharkov,
Я поправил |
Чуть ускорил:
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script> <script>var d = 0;</script> <style> .hide { position:absolute; z-index:-100; visibility:hidden; } </style> <div class="hide"> <img class="img" src="http://javascript.ru/forum/image.php?u=18034&dateline=1325652067" onload="d++"> <img class="img" src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="d++"> <img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="d++"> <img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="d++"> </div> <script> var len = $(".img").length; var int = setInterval(function () { if (d >= len) { $(".hide").removeClass("hide"); clearInterval(int); } }, 100); </script> |
Всё равно та же проблема.
(на сколько я понял.) Поставил 3000 - но подгрузка происходит моментально. http://webmaster.ayrveda.ru/333/js_template.html |
Mike_Kharkov,
ерунда увеличивать, - 100 - норма для теста, особенно если картинки малые - у меня нормально работает на всех браузерах и картинках... Поскольку идея однозначная - как только подгружены все - все и вылазит, другое дело, что само открытие картинок, лучше делать после рендинга всей страницы, т.е после загрузки картинок дождаться $(document).ready(function() <script src="http://code.jquery.com/jquery-1.8.3.min.js"></script> <script>var d = 0;</script> <style> .hide { position:absolute; z-index:-100; visibility:hidden; } </style> <div class="hide"> <img class="img" src="http://javascript.ru/forum/image.php?u=18034&dateline=1325652067" onload="d++"> <img class="img" src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="d++"> <img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="d++"> <img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="d++"> </div> <script> var len = $(".img").length; var int = setInterval(function () { if (d >= len) { $(document).ready(function(){ $(".hide").removeClass("hide"); clearInterval(int); }); } }, 100); </script> Типично же, применяют вариант подгрузки картинок на предыдущей странице, перед показом, в аналогичный cкрытый div, - без всяких скриптов, (типично пользователь на ней находится долее подгрузки их всех div должен стоять в самом конце страницы, дабы не утомлять пользователя задержками |
Смотрите.
Дело в том, что мне необходимо что бы картинки(в том числе и очень большие, при необходимости) подгружались не по частям, а целиком! (одномоментно!) В вашей реализации мне этого добиться не удалось потому, что не могу поставить большой временной интервал. Если временной интервал ставить маленьким то тогда картинка(если большая + скорость инета маленькая) разворачивается постепенно(как заранее свёрнутый бумажный лист). Именно такое развитие событий и не устраивает моего заказчика. Из за этого, собственно говоря, я и создал данный пост.. P.S. Понимаете мою мысль? |
Цитата:
тут возможны такие Варианты 1. Перевести все картинки в png - уже подгруженные - они рендяцо быстрее - но грузятся чуть долее 2. Отрендить загруженные картинки с opacity: 0 и абсолютным позицонированием (Окончание рендинга текущей картинки отслеживаем по высоте или ширине картинки(которую желательно знать заранее или тестировать прекращение её приращения), а затем перевести их класс в видимые |
Мысль примерно понял.
Спасибо! >> 2. Отрендить загруженные картинки с opacity: 0 и абсолютным позицонированием а затем перевести их класс в видимые Мне кажется абсолютное позиционирование будет лишним в данном случае? Или я ошибаюсь? (Всё равно же картинка будет изначально прозрачна. Какой смысл её позиционирование изменять?) |
Цитата:
второе - большие картинки рендяцо и при перемещении по странице так что желательно выставить обертку уже по размерам и там рендить картинку |
:) В принципе, при такой задаче, вероятно удобнее ставить картинки фоном к заранее созданным блокам с выставленными размерами, поскольку блоки с начальным opacity:0;эти блоки должны быть конечными ветками дерева, дабы не влиять на потомков
|
Цитата:
а я уж начал забывать :) надо покрутить с форматом адреса, например, лишние символы там убирать или ещё чего, но это вечером |
попробуем такой ход
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script> <style> .img {display: none} </style> <img src="http://javascript.ru/forum/image.php?u=18034&dateline=1325652067"> <img class="img" src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235"> <img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235"> <img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235"> <script> jQuery(function ($) { var d = 0; var images = $(".img"); images.each(function() { $(this).on("load", function () { d++; }); this.src = this.src; }); var len = images.size(); var int = setInterval(function () { if (d == len) { images.show(); clearInterval(int); } }, 500); }); </script> |
как ни странно - работает :)
|
bes,
Тут есть две идеи 1. Картинка может подгрузиться до jQuery(function ($) { 2. Мелкие картинки могут подгрузиться до окончания блока с картинками, поэтому возможно лучше onload ставить на тег 3. Похоже у чела проблемы не с подгрузкой, а с рендингом больших изо на странице, ибо перевод в bmp и построчное отражение картинки на странице занимает время, в итоге все картинки не будут отражены одновременно, нужно подгружать с opacity:0 или visibility:hidden и тестить окончание приращений высоты |
Цитата:
|
bes,
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script> <div style="overflow:auto; width:100%;height:300px"> <img src="http://www.gog.com/upload/images/2013/06/4a97d96f01382e2d3de6435cc9bf4134bf21c62c.jpg"> </div> <script> var d=0; $("img").on("load", function () { var height=[] var int = setInterval(function () { if ($("img").height() == height[0]) { alert(height) clearInterval(int); } height.push($("img").height()); }, 1); }); </script> |
Цитата:
через height этого не сделать |
bes,
:-E Походу соврал - пойду умоюсь |
Deff, вот мой простой пример
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script> <img class="img" src="http://www.gog.com/upload/images/2013/06/4a97d96f01382e2d3de6435cc9bf4134bf21c62c.jpg"> <script> jQuery(function ($) { var img = $(".img").eq(0); var int = setInterval(function () { console.log(img.height()); }, 1); }); </script> |
bes,
:) Тогда я не понимаю, почему у чела не одновременно... Хотя у cyber был подобный эффект при перетаскивании мап карты(хотя может уже забыл нюансы |
Цитата:
http://webmaster.ayrveda.ru/555/js_template.html Но так как на форуме - данный пример у меня работает только в IE + Mazilla!? (И то, при условии, что картинка не очень большой должна!) Не знаете - в чём причина может быть? (Может с подключением кода что то не так или с хостингом?) |
Цитата:
пример лишь показывает, что приращение высоты через height не получить спроси у заказчика, где он увидел подобный эффект |
Понял вас. Спасибо!
|
Но почему тогда ваш пример работает на форуме?
(так как нужно + во всех браузерах..) |
Цитата:
Цитата:
|
Цитата:
Посто визуально картинка с первого раза(когда её в моём кэше ещё не было) открылась мгновенно. (+ кроссбраузерно.) Пусть и с небольшой задержкой - но именно так как надо. (Хотелось бы такой же результат получить и у себя..) |
Хотя сейчас подумал и возможно ваш пример сработал у меня так потому, что до этого я просмотрел пример Deffa - а у него такая же картинка использовалась!(только сейчас это увидел..)
Наверное она из за этого уже ко мне в кешь попала и ваш пример соответственно быстро подгрузился.. (Я тогда не обратил внимание на этот факт..) |
Цитата:
|
))
|
Часовой пояс GMT +3, время: 09:46. |