Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Смена изображений при прокрутке (https://javascript.ru/forum/misc/57178-smena-izobrazhenijj-pri-prokrutke.html)

Иван Федорович 22.07.2015 23:39

Смена изображений при прокрутке
 
Помогите пожалуйста! Нужен блок div который будет менять фоновое изображение в обе стороны при прокрутке страницы с большой периодичностью чтобы создавался эффект видеою

EmperioAf 23.07.2015 00:15

при прокрутке блок div должен быть на одном месте на экране?
фоновое изображение должно меняться из-за прокрутки или с большой периодичностью ?

Иван Федорович 23.07.2015 11:27

Блок должен быть зафиксирован на одном месте. Изображение должно меняться при прокрутке.

Иван Федорович 23.07.2015 15:55

Просто нужна смена изображений при прокрутке, скажем, через каждых 20px

EmperioAf 23.07.2015 16:02

Цитата:

Сообщение от Иван Федорович (Сообщение 381119)
Просто нужна смена изображений при прокрутке, скажем, через каждых 20px

Просто непонятно в чём проблема задания. Нужно повесить на window.onscroll (https://learn.javascript.ru/onscroll) функцию, в которой будет смена изображений в зависимости от положения ползунка(window.pageYOffset).

Иван Федорович 23.07.2015 18:57

Цитата:

Сообщение от EmperioAf (Сообщение 381121)
Просто непонятно в чём проблема задания.

Нужно чтобы при прокрутке страницы вверх/вниз в фиксированном блоке div изображения меняются в строгом порядке. Например: при прокрутке вниз порядок изображений 1 2 3, при прокрутке вверх порядок 3 2 1. EmperioAf, я новичок в JavaScript, поэтому просьба объяснить на примере решения, с комментариями, пожалуйста. :help:

EmperioAf 24.07.2015 15:33

в общем задача для меня оказалась гораздо сложнее чем изначально думал.

<!DOCTYPE html>
<html>
<head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
 <title>Спойлеры</title>
 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<style>
.container{
    position: relative;
    width: 1000px;
    height: 3000px;
    border: 1px solid red;
}

.video {
    position: fixed;
    left: 100px;
    top: 10px;
    width: 400px;
    height: 250px;
    border: 1px solid green;
    background-image: url("http://360tv.ru/binfiles/images/20150424/ba10f44c.jpg");
    background-size: cover;
}
</style>
</head>
<body>
<div class="container">
     <div class="video"></div>
</div>
<input type="hidden" value="0">
<script>
    var images = ["http://360tv.ru/binfiles/images/20150424/ba10f44c.jpg","http://www.wallsbox.ru/images/original/dozhd-[1680x1050]-[3877171].jpg", "http://moimiri.ru/wp-content/gallery/2013year/2013_Sirost_90x80.jpg", "http://st.magazin-almaz-servis.ru/12/1531/460/syrost-v-kvartire-kak-izbavitsya-foto-2.jpg", "http://cs7002.vk.me/c7007/v7007062/8820/Snd9Gm9pv5k.jpg"];

window.onscroll = function(){
    var videoElem = document.querySelector('.video');
    var scrolled = window.pageYOffset || document.documentElement.scrollTop;
    var scrolledBefore = document.querySelector('input[type="hidden"]').value;
    document.querySelector('input[type="hidden"]').value = scrolled;
    var scrolledResult = scrolled - scrolledBefore;
    if (scrolledResult<0){
        var timeout = 200;
        for(var i = 4; i>=0; i--){
            setTimeout(
                (function(n){
                    return function(){
                    videoElem.style.backgroundImage = "url("+images[n]+")";
                    }
            })(i)
            ,timeout
            );
            timeout += 200;
        };
    }
    if (scrolledResult>0){
         timeout = 200;
        for(var i = 0; i < 5 ; i++){
            setTimeout(
                (function(n){
                    return function(){
                    videoElem.style.backgroundImage = "url("+images[n]+")";
                    }
            })(i)
            ,timeout
            );
            timeout += 200;
        };
    }
        
    }

</script>
</body>
</html>

рони 24.07.2015 15:50

EmperioAf,
вычислить максимальный скролл страницы - разделить на количество картинок - получили шаг - текущий скрол разделить на шаг - получить целое число - показать картинку под индексом == число - всё

EmperioAf 24.07.2015 15:55

Цитата:

Сообщение от рони (Сообщение 381365)
EmperioAf,
вычислить максимальный скролл страницы - разделить на количество картинок - получили шаг - текущий скрол разделить на шаг - получить целое число - показать картинку под индексом == число - всё

а если у него сайт огромный - такой как я и сделал .container{ height:3000px} ?

рони 24.07.2015 16:25

Цитата:

Сообщение от EmperioAf
а если у него сайт огромный - такой как я и сделал .container 3000px ?

а что это меняет? :-? или пусть ТС уточнит

EmperioAf 24.07.2015 16:40

Цитата:

Сообщение от рони (Сообщение 381371)
а что это меняет? :-? или пусть ТС уточнит

ТС написал:
Цитата:

при прокрутке страницы с большой периодичностью чтобы создавался эффект видеою
Я ориентировался на то, чтобы в итоге получилось видео.

Иван Федорович 24.07.2015 18:48

Спасибо большое. Всё классно :dance: , но смена изображений должна осуществляться в автоматичном режиме, а каждая картинка должна быть жестко привязана к величине px прокрутки станицы. Например: при прокрутке страницы вниз на 20px - картинка №1 сменяется картинкой №2, еще 20px вниз - картинка №2 сменяется картинкой №3 и т.д. При прокрутке страницы вверх - в обратном порядке №3 - №2 - №1. С надеждой... :help:

Иван Федорович 24.07.2015 19:24

*не в автоматическом режиме

рони 24.07.2015 19:46

смена картинок фона по scroll
 
Иван Федорович,
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
 <title>video</title>

<style>
body{
    height: 3000px;
}

.video {
    position: fixed;
    left: 100px;
    top: 10px;
    width: 400px;
    height: 250px;
    border: 1px solid green;
    background-image: url("http://360tv.ru/binfiles/images/20150424/ba10f44c.jpg");
    background-size: cover;
    background-repeat: no-repeat;
  }
</style>
</head>
<body>
<div class="video"></div>

<script>
window.onload = function() {
var images = ["http://360tv.ru/binfiles/images/20150424/ba10f44c.jpg","http://www.wallsbox.ru/images/original/dozhd-[1680x1050]-[3877171].jpg", "http://moimiri.ru/wp-content/gallery/2013year/2013_Sirost_90x80.jpg", "http://st.magazin-almaz-servis.ru/12/1531/460/syrost-v-kvartire-kak-izbavitsya-foto-2.jpg", "http://cs7002.vk.me/c7007/v7007062/8820/Snd9Gm9pv5k.jpg"],
    videoElem = document.querySelector('.video'),
    scrollHeight = document.documentElement.scrollHeight,
    clientHeight = document.documentElement.clientHeight,
    maxScroll = Math.max(scrollHeight, clientHeight) - clientHeight,
    len = images.length,
    step = maxScroll/len;
    for (var i=0; i<len; i++)  {
      var img = new Image();
          img.src = images[i]
    }

window.onscroll = function(){
    var scrolled = window.pageYOffset || document.documentElement.scrollTop;
    for (var i=0; i < len; i++)  {
      if (i * step + step >= scrolled) break
    }
    videoElem.style.backgroundImage = "url("+images[i]+")";
    }
}

</script>
</body>
</html>

Иван Федорович 24.07.2015 22:33

Еще один момент, при смене картинок происходит блик. От этого можно как-то избавится?

рони 24.07.2015 23:31

Иван Федорович,
вариант...
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
 <title>video</title>

<style>
body{
    height: 3000px;
}

.video {
    position: fixed;
    left: 100px;
    top: 10px;
    width: 400px;
    height: 250px;
    border: 1px solid green;
    background-image: url("http://360tv.ru/binfiles/images/20150424/ba10f44c.jpg");
    background-size: cover;
    background-repeat: no-repeat;
    -webkit-transition: opacity .3s ease-in-out;
    -moz-transition: opacity .3s ease-in-out;
    -o-transition: opacity .3s ease-in-out;
    transition: opacity .3s ease-in-out;
}</style>
</head>
<body>
<div class="video"></div>

<script>
window.onload = function() {
var images = ["http://360tv.ru/binfiles/images/20150424/ba10f44c.jpg","http://www.wallsbox.ru/images/original/dozhd-[1680x1050]-[3877171].jpg", "http://moimiri.ru/wp-content/gallery/2013year/2013_Sirost_90x80.jpg", "http://st.magazin-almaz-servis.ru/12/1531/460/syrost-v-kvartire-kak-izbavitsya-foto-2.jpg", "http://cs7002.vk.me/c7007/v7007062/8820/Snd9Gm9pv5k.jpg"],
    videoElem = document.querySelector('.video'),
    scrollHeight = document.documentElement.scrollHeight,
    clientHeight = document.documentElement.clientHeight,
    maxScroll = Math.max(scrollHeight, clientHeight) - clientHeight,
    len = images.length,
    step = maxScroll/len,
    timer, num = 0;
    for (var i=0; i<len; i++)  {
      var img = new Image();
          img.src = images[i]
    }

window.onscroll = function(){
    var scrolled = window.pageYOffset || document.documentElement.scrollTop;
    for (var i=0; i < len; i++)  {
      if (i * step + step >= scrolled) break
    }
    if (num == i) return;
    num = i;
    videoElem.style.opacity = 0;
    window.clearTimeout(timer);
    timer =  window.setTimeout(function() {
    videoElem.style.backgroundImage = "url("+images[i]+")";
    videoElem.style.opacity = 1;
},300)

    }
window.onscroll()
}
</script>
</body>
</html>

Иван Федорович 03.08.2015 10:40

Помогите пожалуйста. Нужен тот же скрипт по смене картинок, только без эффекта перехода. Картинки должны меняться незаметно, моментально. Возможно нужна предзагрузка изображений. Помогите.

EmperioAf 03.08.2015 12:07

Цитата:

Сообщение от Иван Федорович (Сообщение 382533)
Помогите пожалуйста. Нужен тот же скрипт по смене картинок, только без эффекта перехода. Картинки должны меняться незаметно, моментально. Возможно нужна предзагрузка изображений. Помогите.

попробуйте из css кода удалить все строчки в которых есть слово transition. После этого смена картинок должна происходить мгновенно

Иван Федорович 07.08.2015 09:29

Нужна просто моментальная смена картинок при прокрутке (без блика). Как убрать блик. Помогите.

рони 07.08.2015 13:15

Иван Федорович,
в каком браузере блик?

Иван Федорович 07.08.2015 13:54

Во всех. Может я ошибаюсь, но мне кажется это связано с большим количеством картинок.

Иван Федорович 07.08.2015 13:57

Картинок штук 20. При открытии сайта и при первых прокрутках, блик есть, спустя какое-то время блик при прокрутке исчезает.

Иван Федорович 07.08.2015 23:24

Помогите пожалуйста.

рони 08.08.2015 13:56

Иван Федорович,
сделайте предзагрузку изображений (в моём коде она есть строки 37 - 40 пост 14)

Иван Федорович 08.08.2015 17:52

Чем заменить строки 37 - 40. Просьба.

рони 08.08.2015 18:39

Иван Федорович,
а зачем? может только перенести до window.onload

Иван Федорович 08.08.2015 18:48

На 31 строку?

Иван Федорович 08.08.2015 18:54

Подскажите пожалуйста куда вставить 37-40 строку.

рони 08.08.2015 19:21

Иван Федорович,
танец с бубнами ... незнаю поможет ли он вам.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
 <title>video</title>

<style>
body{
    height: 3000px;
}

.video {
    position: fixed;
    left: 100px;
    top: 10px;
    width: 400px;
    height: 250px;
    border: 1px solid green;
    background-image: url("http://360tv.ru/binfiles/images/20150424/ba10f44c.jpg");
    background-size: cover;
    background-repeat: no-repeat;
  }
</style>
<script>
   var images = ["http://360tv.ru/binfiles/images/20150424/ba10f44c.jpg","http://www.wallsbox.ru/images/original/dozhd-[1680x1050]-[3877171].jpg", "http://moimiri.ru/wp-content/gallery/2013year/2013_Sirost_90x80.jpg", "http://st.magazin-almaz-servis.ru/12/1531/460/syrost-v-kvartire-kak-izbavitsya-foto-2.jpg", "http://cs7002.vk.me/c7007/v7007062/8820/Snd9Gm9pv5k.jpg"],
   len = images.length;
   for (var i=0; i<len; i++)  {
      var img = new Image();
          img.src = images[i]
    } ;
window.onload = function() {
    var videoElem = document.querySelector('.video'),
    scrollHeight = document.documentElement.scrollHeight,
    clientHeight = document.documentElement.clientHeight,
    maxScroll = Math.max(scrollHeight, clientHeight) - clientHeight,
    step = maxScroll/len;


window.onscroll = function(){
    var scrolled = window.pageYOffset || document.documentElement.scrollTop;
    for (var i=0; i < len; i++)  {
      if (i * step + step >= scrolled) break
    }
    videoElem.style.backgroundImage = "url("+images[i]+")";
    }
}

</script>
</head>
<body>
<div class="video"></div>
</body>
</html>

Иван Федорович 08.08.2015 19:48

Отдельно всё работает. Спасибо. Когда вставляю в код сайта снова появляется блик.

рони 08.08.2015 19:51

Иван Федорович,
смотрите ваше css


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