#javascript #html #css
#javascript #HTML #css
Вопрос:
На моем веб-сайте у меня есть три изображения 1.png, 2.png and 3.png
. Когда я нажимаю 1.png
, я хочу, чтобы анимированный gif 1a.gif
загружался и отображался / обновлялся в теге img, расположенном внутри <div id="container">
. Когда я нажимаю 2.png
, 2a.gif
должно отображаться (пока 1a.gif
исчезает) и так далее… Это мой код:
<html>
<body>
<div>
<img src="1.png" onclick="document.getElementById('img').src = '1a.gif'" />
<img src="2.png" onclick="document.getElementById('img').src = '2a.gif'" />
<img src="3.png" onclick="document.getElementById('img').src = '3a.gif'" />
</div>
<div id="container">
<img id="img" src="1a.gif" />
</div>
</html>
</body>
Он работает, однако ненадежен (проверено с firefox и Chrome)! Когда я обновляю HTML-страницу и нажимаю на 1.png, чем на 2.png… внезапно в какой-то момент отображается только первый кадр анимированного gif-файла. Я должен снова щелкнуть по тому же изображению (1,2 или 3.png), чтобы запустить gif. Почему? Я ищу легкое решение javascript без jquery. Я просто спрашиваю себя, почему gif не воспроизводится должным образом, как только я нажимаю на изображение.
В качестве примечания: было бы неплохо показать загружаемое изображение во время загрузки gif (5 МБ). Мне не удалось добиться этого с помощью css:
#container {background:url('loading.png') no-repeat; }
В этом случае загружаемое изображение вообще не отображается. Вероятно, потому, что я обновляюсь непосредственно из одного (например 1a.gif ) к другому (например, 2a.gif ).
Отображение его непосредственно перед загрузкой gif также не помогло:
<img src="1.png" onclick="document.getElementById('img').src = 'loading.png';
document.getElementById('img').src = '1a.gif'" />
Ответ №1:
Существует много способов реализации такого рода вещей, но чтобы соответствовать тому, как вы это делаете, вам нужно подключиться к onload
событию img
.
Обратите внимание, что в этом фрагменте у меня нет доступа к вашим GIF-файлам, поэтому я использую dummyimage.com обслуживание, которое происходит довольно быстро, так что вы не видите «загрузку» очень долго.
window.onload = function() {
var img = document.getElementById('img');
var container = document.getElementById('container');
var showImage = function showImage() {
img.style.display = "inline";
container.style.backgroundImage = "";
};
img.addEventListener('load', showImage);
img.addEventListener('error', showImage);
var thumbs = document.getElementsByClassName('thumb');
for (var i = 0, z = thumbs.length; i < z; i ) {
var thumb = thumbs[i];
var handler = (function(t) {
return function clickThumb() {
container.style.backgroundImage = "url('https://dummyimage.com/500x500/000/fff.gifamp;text=loading')";
img.style.display = "none";
img.src = t.dataset['image'];
};
})(thumb);
thumb.addEventListener('click', handler);
}
};
<div>
<img src="1.png" class="thumb" data-image="https://dummyimage.com/500x200/000/fff.gif" />
<img src="2.png" class="thumb" data-image="https://dummyimage.com/200x200/000/fff.gif" />
<img src="3.png" class="thumb" data-image="https://dummyimage.com/500x500/000/fff.gif" />
</div>
<div id="container">
<img id="img" class="main" />
</div>
Ответ №2:
Это происходит потому, что второй img еще не загружен! Я предлагаю вам поместить 2 изображения в 2 разных раздела и использовать javascript, чтобы скрыть / показать весь раздел!
Комментарии:
1. gif-файлы такие большие. Я хотел загружать их только при нажатии на x.png, чтобы минимизировать время загрузки и трафик.