Данный скрипт не требует никакие библиотеки и занимает всего 6 строчек.

Пример:

HTML:

CSS:

JS:

Если на странице присутствует несколько секций с таким параллаксом, то JS будет таким:

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

По аналогии с этим примером, можно двигать несколько наложенных друг на друга фонов (при условии частичной их прозрачности), задавая им разное смещение, например:

Смотрите также:

Небольшой JavaScript, создающий белый шум в канвасе

Простой пример движения графического фона блока средствами CSS

Анимированные волнистые линии с использованием SVG и CSS

Добавить комментарий:

Ваш комментарий отправлен!

Комментарии:

  • SOME:

    у меня тут появился вопрос:
    у меня на объекте стоит position:fixed
    ну так вот на этом объекте параллакс не работает.
    Есть ли какое-то решение если мне нужно чтобы всё это при листании оставалось фиксированным?
    НУ уж ОЧЕНЬ нравится эта идея с параллаксам.
    вот если что ссылка на [url="https://codepen.io/some_0129/pen/wBvxKjj"]code pen[/url]

    Ответить
    • Alexander:

      Он работает, только у вас его сбивает анимация [b]@keyframes wH1te_HEAD[/b]

      Ответить
  • Alex13:

    Простое и понятное решение, но, есть недостаток:
    Если использовать в двигаемом блоке transition: all 0.1s ease, то в браузерах на движке хромиум при открытых инструментах разработчика анимация тормозит, в Firefox тормозит и без devtools.
    А если убрать эту строку, то нет плавности при переходе курсора в рабочую область, например с панели закладок.
    Есть у кого-то идеи как это победить?

    Ответить
    • Alex13:

      Нашел решение проблемы, вдруг кому-то пригодится. Я предположил, что 'mousemove' срабатывает слишком часто для корректной работы со свойством transition, поэтому нужно его искусственно ограничить, немного усложняем JS:

      [code]const bg = document.querySelector('.mouse-parallax-bg');
      let stopEvent = false;

      window.addEventListener('mousemove', function(e) {
      if (!wait) {
      const x = e.clientX / window.innerWidth;
      const y = e.clientY / window.innerHeight;

      bg.style.transform = 'translate(-' + x * 50 + 'px, -' + y * 50 + 'px)';

      stopEvent = true;
      setTimeout(function () {
      wait = false;
      }, 33);
      }
      });[/code]

      Теперь все работает плавно во всех браузерах. Более того, увеличив значение transition например до 0.5s, а задержку до 100 - 200 мы получаем некоторую "инерционность" движения.

      Ответить
      • Alex13:

        [code]if (!stopEvent) {[/code]
        Забыл тут переменную исправить.

        Ответить
  • Sergey:

    Гениально! Попробовал разные решения, ваше - лучшее!
    Скажите, а можно как-то доработать код, что бы ещё и на мобильниках/планшетах работало, где вместо мыши по сенсору пальцем водишь и оно так же двигается?)
    Заранее спасибо!

    Ответить
    • Alexander:

      Примерное решение тут: [url="https://atuin.ru/blog/smena-slajdov-myshkoj-ili-palcem-na-bootstrap-3/"]Смена слайдов мышкой или пальцем[/url], а именно принцип нажатия и движения по сенсору
      Но по моему это лишнее, т.к. задача тут немного другая.

      Ответить
  • Олег:

    а как сделать такой эффект в пределах блока, а не когда ты водишь по всему бади и картинка двигается

    Ответить
    • Alexander:

      [code]window.addEventListener('mousemove', function(e) {[/code]
      заменить на
      [code]bg.addEventListener('mousemove', function(e) {[/code]
      или, если используется вариант для нескольких секций
      [code]bg[i].addEventListener('mousemove', function(e) { [/code]

      Ответить
  • Евгений:

    Эх этот код бы на React'е еще )))

    Ответить
    • Серега:

      Евгений: Если вы не можете написать данный код на react, значит вы не знаете react, возможно слабые знание и в js, очень слабые ибо переписать этот код на react от силы пару минут.

      Ловите ref и вешаете событие, по сути все, остальное проблема верстки.

      Автору спасибо, простой и классный код, прям от души.

      Ответить
  • Миша:

    Огромное спасибо! Очень интересное решение, да ещё и с таким крохотным кодом. :)))

    Ответить
  • Иван:

    Спасибо огромное.
    Встроил данное решение в вордпресс. Работает!
    Появился вопрос: а возможно ли на адаптиве заменить данный параллакс картинкой?
    Использую эффект в шапке страницы. На адаптиве выглядит ... никак не выглядит :о) Подумал, вдруг есть простое решение заменить данный скрипт просто изображением?
    Заранее спасибо.

    Ответить
    • Alexander:

      Поставить проверку на ширину экрана, и если она больше нужной, запускать этот скрипт, например:
      [code]if (screen.width > 768) {
      // тут код
      }[/code]
      Или мобильник определять, например:
      [code]isMobile = navigator.userAgent.match(/(iPhone|iPod|Android|BlackBerry|iPad|IEMobile|Opera Mini)/);
      if (!isMobile) {
      // тут код
      }[/code]

      Ответить
      • Иван:

        Спасибо огромное.

        Ответить
  • Андрей:

    Отличный параллакс. Спасибо. А подскажите, как сделать чтобы данный скрипт применялся только к одной секции?? В моем случае section id="stages"

    Ответить
    • Alexander:

      Оно и должно применяться к одной секции так то.
      Задайте для ее фона ([i]mouse-parallax-bg[/i]) класс, который потом используется в скрипте, и стили все переписать под это.

      Ответить
  • Елена:

    Всё отлично, всё работает, только не знаю как подключить несколько изображений к этому эффекту... Может подскажете?)

    Ответить
    • Alexander:

      Добавил пару вариантов для разных секций и для нескольких фонов.

      Ответить
  • Катя:

    Как избежать странных подергиваний в Internet Explorer?

    Ответить
    • Alexander:

      Если честно, не знаю и проверить не могу...
      А IE разве еще пользуются?
      Я наверное, лет 10 назад уже забыл как он выглядит 🙂

      Ответить
  • Евгений:

    Шикарно. Все сразу же заработало)) Огромное спасибо автору.

    Ответить
  • Вадим:

    До этого имел в арсенале кусок на jQ в раза 3-4 больше! этот отработал на ура, спасибо!

    Ответить
  • Евгений:

    Просто и гениально, спасибо! 🙂

    Ответить