Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Скрипт плавной смены background-image в div (https://javascript.ru/forum/dom-window/50350-skript-plavnojj-smeny-background-image-v-div.html)

macik 20.04.2017 15:11

нет это какой-то глюк, все вроде поправил и теперь работает как надо.
#foto_index{
	transition:all 3s ease;
	 -webkit-transition:all 3s ease;
	 -moz-transition:all 3s ease;
	 -o-transition:all 3s ease;
	opacity: 1;
	background: url("/images/new/foto_index/01.jpg") no-repeat center;
	z-index: -2;
	min-height: 600px;	
	margin-top: -50px;
	margin-right: 0;
	margin-left: 0;
	-moz-background-size: 100%; /* Firefox 3.6+ */
    -webkit-background-size: 100%; /* Safari 3.1+ и Chrome 4.0+ */
    -o-background-size: 100%; /* Opera 9.6+ */
    background-size: 100%; /* Современные браузеры */
    background-size:cover;
}

var mas = [
			'/images/new/foto_index/01.jpg',
			'/images/new/foto_index/IMG_0875.jpg',
			'/images/new/foto_index/IMG_1043.jpg',
			'/images/new/foto_index/IMG_1109.jpg',
			'/images/new/foto_index/IMG_1077.jpg',
			'/images/new/foto_index/IMG_0985.jpg'
		], i=1;
function csaHead(){
	if(i > (mas.length-1)){
		document.getElementById('foto_index').style.backgroundImage="url('"+mas[0]+"')";
		i=0;
 	}else{
 		document.getElementById('foto_index').style.backgroundImage="url('"+mas[i]+"')";
 		i++;
 	} 	
}
var intervalCsaHead = setInterval(csaHead,5000);

Dilettante_Pro 20.04.2017 15:12

macik,
Последний вариант вашего скрипта можно упростить
var mas = [
			'/images/new/foto_index/01.jpg',
			'/images/new/foto_index/IMG_0875.jpg',
			'/images/new/foto_index/IMG_1043.jpg',
			'/images/new/foto_index/IMG_1109.jpg',
			'/images/new/foto_index/IMG_1077.jpg',
			'/images/new/foto_index/IMG_0985.jpg'
		], i=1;
function csaHead(){
	if(i > (mas.length-1)){
		i=0;
 	}
 	document.getElementById('foto_index').style.backgroundImage="url('"+mas[i]+"')";
 	i++; 	 	
}
var intervalCsaHead = setInterval(csaHead,5000);


А насчет появления картинок - можно сделать первую прокрутку втемную и с нулевой задержкой.

macik 20.04.2017 15:45

Цитата:

Сообщение от Dilettante_Pro (Сообщение 450426)
macik,
Последний вариант вашего скрипта можно упростить
var mas = [
			'/images/new/foto_index/01.jpg',
			'/images/new/foto_index/IMG_0875.jpg',
			'/images/new/foto_index/IMG_1043.jpg',
			'/images/new/foto_index/IMG_1109.jpg',
			'/images/new/foto_index/IMG_1077.jpg',
			'/images/new/foto_index/IMG_0985.jpg'
		], i=1;
function csaHead(){
	if(i > (mas.length-1)){
		i=0;
 	}
 	document.getElementById('foto_index').style.backgroundImage="url('"+mas[i]+"')";
 	i++; 	 	
}
var intervalCsaHead = setInterval(csaHead,5000);


А насчет появления картинок - можно сделать первую прокрутку втемную и с нулевой задержкой.

Спасибо ! Но есть какой-то глюк. Я думал что это картинка не успевает загружайся ... А нет. если окно долгое время на заднем плане или свернуто, то потом картинка не переходит плавно, а тупо с пустого в картинку прыгает ... Пока скрипт весь цикл не пройдет будет так рвать ...
Вот тут http://d-fitness.com.ua/new/start я это гоняю ...

рони 20.04.2017 15:50

Цитата:

Сообщение от macik
Пока скрипт весь цикл не пройдет будет так рвать ...

:yes: ещё один аргумент, чтобы никогда не использовать setInterval

macik 20.04.2017 15:52

Цитата:

Сообщение от рони (Сообщение 450430)
:yes: ещё один аргумент, чтобы никогда не использовать setInterval

А что использовать ?

рони 20.04.2017 15:54

Цитата:

Сообщение от macik
Но есть какой-то глюк.

http://javascript.ru/forum/events/68...tml#post450014

рони 20.04.2017 15:57

Цитата:

Сообщение от macik
А что использовать ?

проще setTimeout, а лучше на данный момент requestAnimationFrame

рони 20.04.2017 15:59

macik,
var mas = [
      '/images/new/foto_index/01.jpg',
      '/images/new/foto_index/IMG_0875.jpg',
      '/images/new/foto_index/IMG_1043.jpg',
      '/images/new/foto_index/IMG_1109.jpg',
      '/images/new/foto_index/IMG_1077.jpg',
      '/images/new/foto_index/IMG_0985.jpg'
    ], i=1;
function csaHead(){
  if(i > (mas.length-1)){
    i=0;
 	}
 	document.getElementById('foto_index').style.backgroundImage="url('"+mas[i]+"')";
 	i++;
  setTimeout(csaHead,5000)
}
csaHead()

macik 20.04.2017 16:02

Я почитала и выходит что requestAnimationFrame(); самое оно! все остальное крутит loop и в фоновом режиме ... только хром умеет замедлять анимация если вкладка не активна.

macik 20.04.2017 16:16

Цитата:

Сообщение от рони (Сообщение 450430)
:yes: ещё один аргумент, чтобы никогда не использовать setInterval

Цитата:

Сообщение от рони (Сообщение 450435)
macik,
var mas = [
      '/images/new/foto_index/01.jpg',
      '/images/new/foto_index/IMG_0875.jpg',
      '/images/new/foto_index/IMG_1043.jpg',
      '/images/new/foto_index/IMG_1109.jpg',
      '/images/new/foto_index/IMG_1077.jpg',
      '/images/new/foto_index/IMG_0985.jpg'
    ], i=1;
function csaHead(){
  if(i > (mas.length-1)){
    i=0;
 	}
 	document.getElementById('foto_index').style.backgroundImage="url('"+mas[i]+"')";
 	i++;
  setTimeout(csaHead,5000)
}
csaHead()

Что то не работает этот вариант.

рони 20.04.2017 16:21

Цитата:

Сообщение от macik
Что то не работает этот вариант.

возможно вы не учли загрузку страницы. скрипт вниз страницы или DOMContentLoaded

Dilettante_Pro 20.04.2017 16:50

Работает последний вариант
<style>
#foto_index{
	transition:all 3s ease;
	 -webkit-transition:all 3s ease;
	 -moz-transition:all 3s ease;
	 -o-transition:all 3s ease;
	opacity: 1;
	background: url("http://javascript.ru/cat/list/mobile.jpg") no-repeat center;
	z-index: -2;
	min-height: 600px;	
	margin-top: -50px;
	margin-right: 0;
	margin-left: 0;
	-moz-background-size: 100%; /* Firefox 3.6+ */
    -webkit-background-size: 100%; /* Safari 3.1+ и Chrome 4.0+ */
    -o-background-size: 100%; /* Opera 9.6+ */
    background-size: 100%; /* Современные браузеры */
    background-size:cover;
}
</style>
<div id='foto_index'></div>
<script>
var mas = [
			'http://javascript.ru/cat/list/donkey.gif',
			'http://javascript.ru/cat/list/js.gif',
			'http://javascript.ru/cat/list/project.jpg',
			'http://javascript.ru/cat/list/appscript.png'
    ], i=1;
function csaHead(){
  if(i > (mas.length-1)){
    i=0;
 	}
 	document.getElementById('foto_index').style.backgroundImage="url('"+mas[i]+"')";
 	i++;
  setTimeout(csaHead,5000)
}
csaHead()
</script>

macik 20.04.2017 17:10

Вроде работает, но у меня глючит время от времени ... пустой фон и весе
http://d-fitness.com.ua/new/start

macik 20.04.2017 17:21

пробовал safari, faer, chrom ( mac os ) везде глюк. с первого разо пустые места. windows Chrom, глючит. IE11 Это вообще ШОК!

рони 20.04.2017 17:23

macik,
возможно ошибка вроде этой
https://laravel.ru/forum/viewtopic.php?id=147

рони 20.04.2017 17:26

Цитата:

Сообщение от macik
с первого разо пустые места

возможно не успевает загрузиться картинка/картинки

macik 20.04.2017 17:48

подчистил пробелы и уменьшил количество картинок. Вроде заработало
Больше всего мне кажется виноват
transition:all 1s ease;

Как только я увеличиваю время перехода, сразу начинаются глюки.

macik 20.04.2017 18:06

глюк с не активным окном все равно присутствует ...
Кто подскажет код на основе
requestAnimationFrame

Я то у меня не получается ...

рони 20.04.2017 18:27

macik,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style>
#foto_index{
  transition:all 3s ease;
   -webkit-transition:all 3s ease;
   -moz-transition:all 3s ease;
   -o-transition:all 3s ease;
  opacity: 1;
  background: url("http://img-fotki.yandex.ru/get/5640/35900228.10c/0_7388e_3ab59b4a_XL.jpeg.jpg") no-repeat center;
  z-index: -2;
  min-height: 600px;
  margin-top: -50px;
  margin-right: 0;
  margin-left: 0;
  -moz-background-size: 100%; /* Firefox 3.6+ */
    -webkit-background-size: 100%; /* Safari 3.1+ и Chrome 4.0+ */
    -o-background-size: 100%; /* Opera 9.6+ */
    background-size: 100%; /* Современные браузеры */
    background-size:cover;
}
</style>
<script>
window.addEventListener('DOMContentLoaded', function() {
var mas = [
      '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'
    ], i=0, a = performance.now();
function csaHead(b){
   if(b - a > 5000) {
    a = b;
    document.getElementById('foto_index').style.backgroundImage="url('"+mas[i]+"')";
 	i = ++i % mas.length;
  }

  requestAnimationFrame(csaHead)
}
csaHead()
});
</script>
</head>

<body>

<div id='foto_index'></div>



</body>
</html>

macik 20.04.2017 20:30

Спасибо. Этот вариант лучше работает при возврате с фоновой работы ...
Но старт на холодную тоже плох. первый показ рваный без плавного перехода.

macik 20.04.2017 20:49

Вообще как они сделали на сайте такой плавный переход ... http://ironfit.ancorathemes.com

Все что я тут попробовал имеет глюки ... только animate дает правильную анимацию но при этом не применим для div с перетеканием картинки в картинку ...
Кто то знает как это реализовано в ironfit.ancorathemes.com ?

macik 20.04.2017 22:49

Цитата:

Сообщение от Rise (Сообщение 450499)
macik, особо в тему не вникал, но прогрузить (последовательно) картинки в кэш до старта галереи можно просто:
function preload(images, callback) {
	if (images.length) {
		var image = new Image();
		image.onload = image.onerror = function() {
			preload(images, callback);
		}
		image.src = images.pop();
	} else {
		callback();
	}
}
preload(['image3.jpg', 'image2.jpg', 'image1.jpg'], function(){ alert('galleryStart') });
пока идет фоновая прогрузка, пользователю, чтобы не скучал, можно что-то показать что идет процесс.

Может совсем не в тему, но также существуют всякие оптимизации (progressive/interlaced) самих картинок, что может дать более быстрое их отображение, типа как может видел когда при загрузке картинка сперва вроде мутная, а потом четкость догружается.

спасибо.
Ноту проблема не в этом. Сейчас мне не нравится поведение всей скрипт на основании requestAnimationFrame, setTimeout и т. д. то поведение этой анимации не подходит. Она то играет то обрывает ... то еще как то ...

рони 20.04.2017 22:55

requestAnimationFrame and preload images
 
macik,
вариант с предзагрузчиком от Rise,

<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style>
#foto_index{
  transition:all 3s ease;
   -webkit-transition:all 3s ease;
   -moz-transition:all 3s ease;
   -o-transition:all 3s ease;
  opacity: 1;
  background: url("http://img-fotki.yandex.ru/get/5640/35900228.10c/0_7388e_3ab59b4a_XL.jpeg.jpg") no-repeat center;
  z-index: -2;
  min-height: 600px;
  margin-top: -50px;
  margin-right: 0;
  margin-left: 0;
  -moz-background-size: 100%; /* Firefox 3.6+ */
    -webkit-background-size: 100%; /* Safari 3.1+ и Chrome 4.0+ */
    -o-background-size: 100%; /* Opera 9.6+ */
    background-size: 100%; /* Современные браузеры */
    background-size:cover;
}
</style>
<script>
window.addEventListener('DOMContentLoaded', function() {
var mas = [
      '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'
    ], i=1, a = performance.now();
function csaHead(b){
   if(b - a > 5000) {
    a = b;
    document.getElementById('foto_index').style.backgroundImage="url('"+mas[i]+"')";
 	i = ++i % mas.length;
  }

  requestAnimationFrame(csaHead)
}
function preload(images, callback) {
	if (images.length) {
		var image = new Image();
		image.onload = image.onerror = function() {
			preload(images, callback);
		}
		image.src = images.pop();
	} else {
		callback();
	}
}
preload(mas.slice(0), function(){ requestAnimationFrame(csaHead)});

});
</script>
</head>

<body>

<div id='foto_index'></div>



</body>
</html>

macik 20.04.2017 23:03

Рони, я сейчас тестирую ... Вроде лучше.
UP
Ну в Crom все работает отлично
в Firefox анимации нет, только редкий перебор.
в Safari старт работает хорошо, после ухода в фон, первый проход рвет потом опять все плавно.
Есть идея что надо останавливать анимацию когда окно не активно. Можно это как то сделать?

рони 20.04.2017 23:20

macik,
css анимация background - работает нормально только в хроме или фон можно анимировать нормально только в хроме.
в остальных только сменой картинок.

macik 20.04.2017 23:22

Цитата:

Сообщение от рони (Сообщение 450503)
macik,
css анимация background - работает нормально только в хроме или фон можно анимировать нормально только в хроме.
в остальных только сменой картинок.

Но а как у http://ironfit.ancorathemes.com работает везде?

рони 20.04.2017 23:33

macik,
там один блок заменяет другой --- но алгоритм тотже что тут в посте №35 только вместо картинок блоки

macik 20.04.2017 23:38

А можете подсказать как это сделать на блоках?

рони 20.04.2017 23:46

смена блоков с разным фоном с opacity
 
macik,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  .foto_index .bg{
     position: absolute;
     width: 100%;
     height:  100%;
     opacity: 0;
    -moz-background-size: 100%; /* Firefox 3.6+ */
    -webkit-background-size: 100%; /* Safari 3.1+ и Chrome 4.0+ */
    -o-background-size: 100%; /* Opera 9.6+ */
    background-size: 100%; /* Современные браузеры */
    background-size:cover;
    box-sizing: border-box;
    transition: opacity .8s ease-in;
  }
  .foto_index .bg.show{
    opacity: 1;
  }

 .foto_index{
  width: 100%;
  position: relative;
  z-index: -2;
  min-height: 600px;
  margin-top: -50px;
  margin-right: 0;
  margin-left: 0;

}
  </style>

  <script>
  window.addEventListener("DOMContentLoaded", function() {
    [].forEach.call(document.querySelectorAll(".foto_index"), function(el) {
        var img = el.querySelectorAll(".bg"),
            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="foto_index" data-pause="3000">
  <div class="bg" style="background-image: url(http://img-fotki.yandex.ru/get/5640/35900228.10c/0_7388e_3ab59b4a_XL.jpeg.jpg)"></div>
  <div class="bg" style="background-image: url(http://1.bp.blogspot.com/-aleHkBUuqOI/VY0HrCytsXI/AAAAAAAAq1g/f2emGtdqdWo/s640/2015-06-05_0145.jpg)"></div>
  <div class="bg" style="background-image: url(http://www.fotki.ykt.ru/albums/userpics/2013/11-18/1384739526_image.jpg"></div>
</div>
</body>
</html>

macik 21.04.2017 00:13

Спасибо!
Как же это у вас лихо получается!!! Вы просто супер!
Я восхищаюсь такими, как Вы!
PS
поставил на тест, 5 минут теста в фоне, все ОК.

macik 21.04.2017 00:28

шрифты почему-то при старте анимации становятся тонкими ... в сафари, хром и лис нормально ...
http://d-fitness.com.ua/new/start

рони 21.04.2017 00:57

macik,
ie шепчет:
Цитата:

Найден лишний тег "<body>". Должен быть только один тег "<body>" на документ.
у продвинутых браузеров привычка стойко переносить и исправлять причуды дизайнеров.


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