Индикатор загрузки изображений
Здравствуйте..
Помогите разобраться, как реализовать, чтобы при загрузке сайта за место пустых блоков(пока не загрузилось изображения)показывался индикатор в формате 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, время: 23:42. |