Индикатор загрузки изображений
Здравствуйте..
Помогите разобраться, как реализовать, чтобы при загрузке сайта за место пустых блоков(пока не загрузилось изображения)показывался индикатор в формате gif(картинка)? Буду очень благодарен.. |
<!DOCTYPE html> <html> <head> <style> html, body { padding: 0; margin: 0; } </style> <script type="text/javascript"> function DOMReady( callback ) { if ( document.readyState === "complete" ) { return setTimeout( callback, 1 ); } var loaded = function( doScroll ) { if ( document.removeEventListener ) { document.removeEventListener( 'DOMContentLoaded', loaded, false ); window.removeEventListener( 'load', loaded, false ); loaded = null; callback(); } else if ( document.detachEvent ) { if ( document.readyState === "complete" || doScroll === null ) { document.detachEvent( 'onreadystatechange', loaded ); window.detachEvent( 'onload', loaded ); loaded = null; callback(); } } } if ( document.addEventListener ) { document.addEventListener( "DOMContentLoaded", loaded, false ); window.addEventListener( "load", loaded, false ); } else if ( document.attachEvent ) { document.attachEvent( "onreadystatechange", loaded ); window.attachEvent( "onload", loaded ); var toplevel = false; try { toplevel = window.frameElement == null; } catch( _e_ ) {} if ( document.documentElement.doScroll && toplevel ) { var check = function() { if ( !loaded ) return; try { document.documentElement.doScroll( "left" ); } catch( _e_ ) { setTimeout( check, 0 ); return; } loaded( null ); } check(); } } } DOMReady( function(){ var imageScope = [], imgs = document.getElementsByTagName( 'img' ), bgdiv = document.createElement( 'DIV' ), div = document.createElement( 'DIV' ); if ( imgs.length > 0 ) { bgdiv.style.cssText = "position: fixed; width: 100%; height: 100%; background-color: #000;"+ "opacity: 0.3; filter: Alpha(opacity=30);"; div.style.cssText = "position: fixed; padding: 20px; width: 100px; height: 20px; left: 50%; top: 50%;"+ "margin: -30px 0 0 -70px; background-color: #fff; border: 1px solid #eaeaea; border-radius: 8px;"+ "opacity: 0.7; filter: Alpha(opacity=70); box-shadow: 2px 2px 4px #000; font: 20px Arial; color: #f00;"; div.innerHTML = 'Loading...'; document.body.insertBefore( div, document.body.firstChild ); document.body.insertBefore( bgdiv, document.body.firstChild ); for( var i = 0; i < imgs.length; i++ ) { imageScope.push(1); var img = new Image(); img.onload = img.onerror = function() { imageScope.pop(); if ( imageScope.length == 0 ) { bgdiv.parentNode.removeChild( bgdiv ); div.parentNode.removeChild( div ); } } img.src = imgs[ i ].src; } } }); </script> </head> <body> <img src="http://worldoftanks.ru/dcont/fb/media/batchat_ru_june_clear/1920x1200.jpg"> <img id="img" src="http://wallpaper.goodfon.ru/image/302908-2880x1800.jpg"/> </body> </html> |
..а можно просто назначить в css
img{background:transparent url(loading.gif) 50% 50% no-repeat}.) |
а если у меня пнг изображения на прозрачном фоне?
css не подойдёт.. Спасибо devote, опробую, расскажу.. |
Цитата:
|
Немножко неправильно..
Мне надо, чтобы такой индикатор был над каждым загружаемым изображением, а не один индикатор по центру с текстом Loading...:) |
Ingiborn,
:) Какие сложности одеть в span каждое ? Именно это и подразумевал |
Непойму как=)
|
|
devote,
Смысл новый img создавать? Не проще на старый события повесить? |
Цитата:
|
Цитата:
|
Цитата:
|
Раед,
вот пример: <!DOCTYPE html> <html> <head> <style> html, body { padding: 0; margin: 0; } </style> <script type="text/javascript"> function DOMReady( callback ) { if ( document.readyState === "complete" ) { return setTimeout( callback, 1 ); } var loaded = function( doScroll ) { if ( document.removeEventListener ) { document.removeEventListener( 'DOMContentLoaded', loaded, false ); window.removeEventListener( 'load', loaded, false ); loaded = null; callback(); } else if ( document.detachEvent ) { if ( document.readyState === "complete" || doScroll === null ) { document.detachEvent( 'onreadystatechange', loaded ); window.detachEvent( 'onload', loaded ); loaded = null; callback(); } } } if ( document.addEventListener ) { document.addEventListener( "DOMContentLoaded", loaded, false ); window.addEventListener( "load", loaded, false ); } else if ( document.attachEvent ) { document.attachEvent( "onreadystatechange", loaded ); window.attachEvent( "onload", loaded ); var toplevel = false; try { toplevel = window.frameElement == null; } catch( _e_ ) {} if ( document.documentElement.doScroll && toplevel ) { var check = function() { if ( !loaded ) return; try { document.documentElement.doScroll( "left" ); } catch( _e_ ) { setTimeout( check, 0 ); return; } loaded( null ); } check(); } } } DOMReady( function(){ var imageScope = [], imgs = document.getElementsByTagName( 'img' ), bgdiv = document.createElement( 'DIV' ), div = document.createElement( 'DIV' ); if ( imgs.length > 0 ) { bgdiv.style.cssText = "position: fixed; width: 100%; height: 100%; background-color: #000;"+ "opacity: 0.3; filter: Alpha(opacity=30);"; div.style.cssText = "position: fixed; padding: 20px; width: 100px; height: 20px; left: 50%; top: 50%;"+ "margin: -30px 0 0 -70px; background-color: #fff; border: 1px solid #eaeaea; border-radius: 8px;"+ "opacity: 0.7; filter: Alpha(opacity=70); box-shadow: 2px 2px 4px #000; font: 20px Arial; color: #f00;"; div.innerHTML = 'Loading...'; document.body.insertBefore( div, document.body.firstChild ); document.body.insertBefore( bgdiv, document.body.firstChild ); for( var i = 0; i < imgs.length; i++ ) { if ( !imgs[i].complete ) { imageScope.push(1); imgs[i].onload = imgs[i].onerror = function() { imageScope.pop(); if ( imageScope.length == 0 ) { bgdiv.parentNode.removeChild( bgdiv ); div.parentNode.removeChild( div ); } } } } } }); </script> </head> <body> <img src="роывп рыпва"> <img id="img" src="http://wallpaper.goodfon.ru/image/302908-2880x1800.jpg"/> </body> </html> |
Раед,
тут одна картинка имеет ошибочный адрес, и из-за этого надпись "Loading..." никогда не исчезнет. Поэтому использование img.complete тут не катит |
хм.. хотя иногда исчезает.. видимо onerror все же успевает отработать... но не всегда.
|
В ИЕ8 вообще всегда висит надпись "Loading..."
|
Цитата:
P.S. А что это за новая мода, вместо инкремент-декремент массивы юзать? |
Цитата:
Цитата:
|
Так как лучше делать?=)
|
Ребят помогите, очень надо..
|
Ingiborn,
Выложите HTML код двух -трёх картинок и минимального окружения - интересует первый один -два блока в который они вложены |
допустим слайдшоу.
<div id=""slider"> <img src="1"> <img src="2"> <img src="3"> </div> |
<style> #slider img{ visibility:hidden; background-color:#000; background-image:url(http://uploads.ru/i/0/S/c/0ScZL.gif); background-position:center center; background-repeat:no-repeat; } </style> <script type="text/javascript"> function LoImg(a) { a.visibility='visible'; a.backgroundСolor='transparent'; a.backgroundImage='none'; } </script> <div id="slider"> <img src="1" onload="LoImg(this)"> <img src="2" onload="LoImg(this)"> <img src="3" onload="LoImg(this)"> </div> |
jQuery
<style> #slider img{ visibility:hidden; display:inline-block; background-color:#000; background-image:url(http://uploads.ru/i/0/S/c/0ScZL.gif); background-position:center center; background-repeat:no-repeat; } </style> <div id="slider" > <img src="1" > <img src="2" > <img src="3" > </div> <script type="text/javascript"> $("#slider img").load(function() { $(this).css({ 'visibility':'visible', 'background-color':'transparent', 'background-image':'none' }); }); </script> |
А для общем функции #slider img заменить на img?
|
Ingiborn,
Ну наверно можно - если для всех изо -а не ток для слайдера - чревато тем - что, к примеру смайлик отсутствует - будет крутиться загрузка( в слайдере то обычно проверяете наличие |
А если подойти с другой стороны: на что человеку смотреть приятнее во времф загрузки большой картинки: на крутящуюся х*ню, или на саму загружающущюся картинку?)
|
Цитата:
|
Цитата:
Кстати, для того, о чём подуали вы, давно есть progressive jpeg. |
Спасибо Deff. Очень помог твой способ!
|
Пример ро jquery не работает, можно как то поправить?
|
всё именно также, всё равно не рабоает
|
оу, там дополнительная библиотека
|
Ingiborn,
Вариант кривой по-ходу - поскольку изо уже может быть в кеше - jQuery не успевает отследит load (нужно извращацо через делегирование |
то есть, не работает этот вариант?
я всё подключил как в примере, всё равно не работает.. |
и кеш чистил, всё равно не работает..
|
Цитата:
|
для jpg где нет прозрачного фона задал бэкграунд, для png решения так и не нашёл..
|
Ingiborn,
Пробуйте так: <style> span.wrap{ display:inline-block; background-color:#000; background-image:url(http://uploads.ru/i/0/S/c/0ScZL.gif); background-position:center center; background-repeat:no-repeat; } #slider img{ visibility:hidden; } </style> <script type="text/javascript"> function LoImg(a) { a.visibility='visible'; a.parentNode.backgroundСolor='transparent'; a.parentNode.backgroundImage='none'; } </script> <div id="slider"> <span class=wrap><img src="1" onload="LoImg(this)"><span> <span class=wrap><img src="2" onload="LoImg(this)"><span> <span class=wrap><img src="3" onload="LoImg(this)"><span> </div> |
Часовой пояс GMT +3, время: 04:30. |