Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Смена фоновой картинки через каждые 5 секунд (https://javascript.ru/forum/misc/29498-smena-fonovojj-kartinki-cherez-kazhdye-5-sekund.html)

sitebuilder 30.06.2012 15:49

Смена фоновой картинки через каждые 5 секунд
 
У меня есть
<div id="place"></div>


Как сделать чтобы через каждые 5 секунд менялось бы фоновое изображение у DIVa? У меня 5 фоновых картинок, после 5-й нужно чтобы опять первая загружалась и так по кругу.

Заранее спасибо.

Deff 30.06.2012 16:30

<div id="place" style="border:red solid 1px;height:100px;width:340px;"></div>
<script type="text/javascript">
    var phr = new Array();
    phr.push("http://mybb.ru/f/collection/0211.gif");
    phr.push("http://mybb.ru/f/collection/0213.gif");
    phr.push("http://i039.radikal.ru/0806/ec/a5ffc6d7cfd9.gif");

function Rotator_cont() {
var s = 5000;  // Время отображения
var N=phr.length;
var i=Math.round(Math.random()*(N));Rotator(i);

function Rotator(i){
i++; if(i>N-1){i=0};//alert(i);
document.getElementById('place').style.backgroundImage='url('+phr[i]+')';
timerId01=setTimeout(function(){Rotator(i)},s);return;}
}Rotator_cont()

</script>

sitebuilder 30.06.2012 17:37

Круто. А как быть если картинки у меня большие и при подгрузке очередной возникает на долю секунды пустое пространство. Можно ли как то показывать следующую картинку только после полной ее загрузки?

Deff 30.06.2012 17:41

sitebuilder,
1. cоздайте нужное кол-во диваков с заранее установленным фоном(фон ставите сss), а скриптом предыдущий display: none: а последущий - display:block;

e-partner 14.03.2017 19:12

Прошу помочь доработать скрипт
 
Всем доброго времени суток!

Помогите пожалуйста доработать данный скрипт. Он очень хорошо работает и быстро, но хотелось бы, чтобы фоновые картинки переключались плавно.
Для меня это очень сложно сейчас. я новичок. Очень прошу помочь!:help:

Paguo-86PK 14.03.2017 20:08

Дёшего и сердито
 
<head>
<style>
#WallPaper0 {
	position	:absolute;
	background	:url('http://javascript.ru/forum/images/ca_serenity/misc/logo.gif');
	height		:128px;
	width		:128px;
}
#WallPaper1 {
	position	:absolute;
	background	:url('http://a.disquscdn.com/1489123367/images/noavatar92.png');
	height		:128px;
	width		:128px;
}
</style>
<script>
var	wallpaper = 0,
	wallslide = 0;
function fader() {
	setTimeout(fader, 25);
	document.getElementById("WallPaper" + wallpaper).style.opacity = 1.0 - Math.abs(100 - wallslide) / 100;
	wallslide -= 5;
	if(wallslide < 0) {
		wallslide = (wallslide + 200) % 200;
		wallpaper ++;
		if(!document.getElementById("WallPaper" + wallpaper))
			wallpaper = 0;
	}
}
</script>
</head>
<body onload='fader()'>
<span id=WallPaper0>para</span>
<span id=WallPaper1>head</span>
</body>

e-partner 14.03.2017 20:35

Спасибо, Paduo...ваш вариант совсем другой. В принципе, для "сердито" подойдет))),
только хочется, чтобы одна картинка накладывалась на другую, и между ними чтобы не было белого фона страницы. :-?

Я вот что нашел еще:

<head>
<script type="text/javascript">
  var total_pics_num = 4; // колличество изображений
  var interval = 5000;    // задержка между изображениями
  var time_out = 1;       // задержка смены изображений
  var i = 0;
  var timeout;
  var opacity = 100;
  function fade_to_next() {
    opacity--;
    var k = i + 1;
    var image_now = 'image_' + i;
    if (i == total_pics_num) k = 1;
    var image_next = 'image_' + k;
    document.getElementById(image_now).style.opacity = opacity/100;
    document.getElementById(image_now).style.filter = 'alpha(opacity='+ opacity +')';
    document.getElementById(image_next).style.opacity = (100-opacity)/100;
    document.getElementById(image_next).style.filter = 'alpha(opacity='+ (100-opacity) +')';
    timeout = setTimeout("fade_to_next()",time_out);
    if (opacity==1) {
      opacity = 100;
      clearTimeout(timeout);
    }
  }
  setInterval (
    function() {
      i++;
      if (i > total_pics_num) i=1;
      fade_to_next();
    }, interval
  );
</script>
</head>

/*---------------

<body>
<div>
  <img src='slide_1.jpg' id="image_1" style="position: absolute;" />
  <img src='slide_2.jpg' id="image_2" style="opacity: 0; filter: alpha(opacity=0); position: absolute;" />
  <img src='slide_3.jpg' id="image_3" style="opacity: 0; filter: alpha(opacity=0); position: absolute;" />
  <img src='slide_4.jpg' id="image_4" style="opacity: 0; filter: alpha(opacity=0); position: absolute;" />
</div>
</body>


У меня была мысль как-то перенести параметр :write: :
document.getElementById(' ... ').style.opacity в исходный текст кода у ТС (который у Deff во втором сообщении) таким образом, чтобы было как бы выплывание фоновой картинки из другой, а не обесцвечивание до фона страницы и переключение на другую. Это возможно?

рони 14.03.2017 20:52

e-partner,
слайдер блоками с opacity

e-partner 14.03.2017 21:10

Цитата:

Сообщение от рони (Сообщение 447393)

Спасибо за такой вариант, рони, рассмотрю его для сайта,
но пока что хочется, чтобы одна картинка выплывала из другой, при этом хочется без подключения библиотек JQuary, чтобы все работало быстро, без проблем у некоторых юзеров и у меня.

А еще, рони, как у вас сделать, чтобы слайдер работал только в одну сторону? (вправо скажем)

рони 14.03.2017 21:44

Цитата:

Сообщение от e-partner
вправо скажем

function q(a, n) {
        //(r ^= 1) && a.reverse();
        $.when.apply(null, a.map(function(k, c) {
            var b = (n/a.length) * c;
            return k.css({
                "z-index": 100
            }).delay(b).animate({
                opacity: 0
            }, {
                easing: "easeOutCirc",
                duration: 300
            })
        })).done(function() {
            a.forEach(function(a) {
                a.remove()
            });
            setTimeout(m, 1E3)
        })
    }
        var op = [100,1];//!!!
    function m() {
        //Math.random() < .2 && op.reverse();
        var e = n(a[1].src, a[0].src, op[0], op[1]);
        q(e,1200);
        a.push(a.shift())
    }

Paguo-86PK 14.03.2017 23:25

Цитата:

Сообщение от e-partner (Сообщение 447392)
Спасибо, Paduo...

Нa моей аватарке достаточно информации о корректности чтения моего ника:yes:
P.S.: Чем и оправдывается сложность анимации в ней…
P.P.S.: И является тестом: Являетесь ли Вы читателем самого популярного журнала и компьютера нашего поколения…

e-partner 15.03.2017 08:42

Цитата:

Сообщение от Paguo-86PK (Сообщение 447403)
Нa моей аватарке достаточно информации о корректности чтения моего ника:yes:
P.S.: Чем и оправдывается сложность анимации в ней…
P.P.S.: И является тестом: Являетесь ли Вы читателем самого популярного журнала и компьютера нашего поколения…

Простите, Paguo-86PK, что не до конца написал ваш сложный ник. Я исправился! :victory:

P.S. Плавную смену картинок - другим на заметку - я додумался сам как сделать: беру дополнительный див, приклепляю к нему фон. А второй див сверху по скрипту Paguo-86PK - и фон то появляется, то исчезает, меняя свои картинки.
В итоге получилось примерно что хотелось: фоновые картинки плавно появляются и исчезают.
Единственное, хочется, чтобы была пауза когда картинка уже появилась, а не была непрерывная смена картинок.

Paguo-86PK 15.03.2017 16:54

Более аккуратный вариант
 
<style>
.ghost_thumb {
	height		:120px;
}
.ghost_thumb img {
	position	:absolute;
}
</style>
<script>
var	Ghosting = function(ghosts) {
	var	Thumbs	= [];
	function Slider() {
		Thumbs.forEach(function(thumb) {
			var	gap = thumb.pause + thumb.fading;
			thumb.phase = (thumb.phase + 1) % (gap * thumb.slides.length);
			var	phase = thumb.phase % gap;
			var	index = (thumb.phase - phase) / gap;
			var	next = (index + 1) % thumb.slides.length;
			if(phase >= thumb.pause)
				thumb.slides[index].style.opacity = 1.0 - (phase - thumb.pause) / thumb.fading,
				thumb.slides[next].style.opacity = 0.0 + (phase - thumb.pause) / thumb.fading;
		});
		setTimeout(Slider.bind(this), 10);
	}
	ghosts.forEach(function(thumb) {
		var	props = thumb.split(/\s+/);
		var	el = document.getElementById(props[0]);
		if(el) {
			var	imgs = el.getElementsByTagName("img");
			if(imgs.length) {
				Thumbs.push({
					frame	: el,
					slides	: imgs,
					fading	: props[1],
					pause	: props[2],
					phase	: 0
				});
				for(var i = 0; i < imgs.length; ++ i)
					imgs[i].style.opacity = 0;
			}
		}
		Slider();
	});
	
}
</script>
<body onload='Ghosting(["Gallery_two 25 3","Gallery_three 15 9"])'>
<p>Плавность - 25, Пауза - 3</p>
<div id=Gallery_two class=ghost_thumb>
<img src='http://javascript.ru/forum/images/ca_serenity/misc/logo.gif' />
<img src='http://a.disquscdn.com/1489123367/images/noavatar92.png' />
</div>
<p>Плавность - 15, Пауза - 9</p>
<div id=Gallery_three class=ghost_thumb>
<img src='http://javascript.ru/forum/images/ca_serenity/misc/logo.gif' />
<img src='http://a.disquscdn.com/1489123367/images/noavatar92.png' />
<img src='http://javascript.ru/forum/image.php?u=3602&dateline=1489262044' />
</div>
</body>

рони 15.03.2017 17:56

смена картинок с opacity эффектом
 
:write:
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  .carousel{
    width: 350px;
    height: 170px;
    position: relative;
  }
  .carousel img{
     position: absolute;
     width: 100%;
     height: 100%;
     opacity: 0;
     border-radius: 8px;
     box-sizing: border-box;
     border: #8B4513 2px solid;
     transition: opacity .8s ease-in;
  }
  .carousel img.show{
    opacity: 1;
  }
   .carousel.vertical{
    width: 170px;
    height: 350px;
   }

  </style>

  <script>
  window.addEventListener("DOMContentLoaded", function() {
    [].forEach.call(document.querySelectorAll(".carousel"), function(el) {
        var img = el.querySelectorAll("img"),
            len = img.length,
            i = len - 1,
            p = el.dataset.pause || 5E3;
        !function g() {
            img[i].classList.remove("show");
            i = ++i % len;
            img[i].classList.add("show");
            window.setTimeout(g, p)
        }()
    })
});
  </script>
</head>

<body>
<div class="carousel" data-pause="3000">
  <img src="http://sport-magazindom.ru/wp-content/uploads/2016/05/1cbe44f2ac36cff2da2bbf7356b4a004.jpg" alt="">
  <img src="http://img-fotki.yandex.ru/get/5640/35900228.10c/0_7388e_3ab59b4a_XL.jpeg.jpg" alt="">
  <img src="http://1.bp.blogspot.com/-aleHkBUuqOI/VY0HrCytsXI/AAAAAAAAq1g/f2emGtdqdWo/s640/2015-06-05_0145.jpg" alt="">
  <img src="http://www.fotki.ykt.ru/albums/userpics/2013/11-18/1384739526_image.jpg" alt="">
</div>
<div class="carousel vertical" data-pause="1000">
  <img src="https://im0-tub-ru.yandex.net/i?id=164eda9533e043b61c9abb3e9fb9ecc6-l&n=13" alt="">
  <img src="http://static.mnogonado.net/images/img.php?w=250&l=%2Fstore%2Fimage%2F800x600_qdv_57108c999ba0b1775c4bfe263023fb6a_1474795-404.png" alt="">
  <img src="http://rugirlz.com/pics/hv_dp20088034.jpg" alt="">
  <img src="https://im1-tub-ru.yandex.net/i?id=34d38102784fbb45657d73def5d2178f-l&n=13" alt="">
</div>
</body>
</html>

e-partner 15.03.2017 21:07

Спасибо, Рони и Радио-86РК, вам уже плюсики сайт не дает ставить. Другие за меня поставят! :) )))

Вы немного отклонились от темы и от моего задания: менять нужно именно фоновые картинки. Я по этой поисковой фразе из Гугла сюда и пришел. Хороший скрипт по смене картинок у меня есть, а вот к фоновым картинкам он не подошел...потому и начал искать))).
В любом случае всем спасибо за помощь, по другим вопросам я сам также "за лайки" помогал людям на форумах! )))

P.S. Как я понимаю, в последний двух постах с кодом нужно добавить "document.getElementById(" там где надо, чтобы была именно фоновая картинка, а не img. А где это надо - кому надо найдет)))

рони 15.03.2017 21:46

смена фона с opacity эффектом
 
e-partner,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  .carousel{
    width: 350px;
    height: 170px;
    position: relative;
    opacity: 0;
     border-radius: 8px;
     box-sizing: border-box;
     border: #8B4513 2px solid;
     transition: opacity .8s ease-in;
     background-size: 350px 170px;
  }
  .carousel.show{
    opacity: 1;
  }
   .carousel.vertical{
    width: 170px;
    height: 350px;
    background-size: 170px 350px;
   }

  </style>

  <script>
 window.addEventListener("DOMContentLoaded", function() {
    [].forEach.call(document.querySelectorAll(".carousel"), function(el) {
        var img = JSON.parse(el.dataset.src),
            len = img.length,
            i = len - 1,
            p = el.dataset.pause || 5E3;

        function g() {
            i = ++i % len;
            el.style.backgroundImage = "url(" + img[i] + ")";
            el.classList.add("show");
            window.setTimeout(k, p)
        }
        g();

        function k() {
            el.classList.remove("show");
            window.setTimeout(g, 800)
        }
    })
});
  </script>
</head>

<body>
<div class="carousel" data-pause="3000"
data-src='["http://sport-magazindom.ru/wp-content/uploads/2016/05/1cbe44f2ac36cff2da2bbf7356b4a004.jpg",
"http://img-fotki.yandex.ru/get/5640/35900228.10c/0_7388e_3ab59b4a_XL.jpeg.jpg",
"http://1.bp.blogspot.com/-aleHkBUuqOI/VY0HrCytsXI/AAAAAAAAq1g/f2emGtdqdWo/s640/2015-06-05_0145.jpg",
"http://www.fotki.ykt.ru/albums/userpics/2013/11-18/1384739526_image.jpg"]'>

</div>
<div class="carousel vertical" data-pause="5000" data-src='[
  "https://im0-tub-ru.yandex.net/i?id=164eda9533e043b61c9abb3e9fb9ecc6-l&n=13",
  "http://static.mnogonado.net/images/img.php?w=250&l=%2Fstore%2Fimage%2F800x600_qdv_57108c999ba0b1775c4bfe263023fb6a_1474795-404.png",
  "http://rugirlz.com/pics/hv_dp20088034.jpg",
  "https://im1-tub-ru.yandex.net/i?id=34d38102784fbb45657d73def5d2178f-l&n=13"]'>
</div>
</body>
</html>

Paguo-86PK 15.03.2017 22:54

Цитата:

Сообщение от рони
смена фона с opacity эффектом

Сдaюсь!:lol:
Использовали css3-трюки, с которыми я вообще поленился некогда разбираться ещё при начале распространения html5 и svg.;)
P.S.: Сейчас нужно разобраться с собственным DVR-плагином. А то преждний писал впопыхах, тяп-ляп и как попало, чтобы попрактиваться со Squirrel на досуге…:blink:
Теперь расплачиваюсь и пишу всё заново:write:
И спотыкаюсь всюду. Ползу медленнее черепахи:D


Часовой пояс GMT +3, время: 03:30.