Сглаживание параллаксной прокрутки фонового изображения

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

к сожалению, это немного отрывистая.

вот базовая компоновка HMTL:

<body>
    <section>
        Site content goes here.
    </section>
</body>

вот CSS:

body {
    background-image: url('../images/bg.png');
    background-repeat: repeat-y;
    background-position: 50% 0;    
}

здесь JS:

$(window).scroll(function () {
    $("body").css("background-position","50% " + ($(this).scrollTop() / 2) + "px");
});

https://jsfiddle.net/JohnnyWalkerDesign/ksw5a0Lp/

довольно просто, но моя проблема в том, что это немного отрывисто, когда вы прокручиваете, даже на мощном компьютере.

есть ли способ сделать фон анимации параллакса гладко?

6 ответов


добавьте свойство transition в свой CSS, чтобы он мог быть ускорен GPU следующим образом:

body {
    background-image: url('../images/bg.png');
    background-repeat: repeat-y;
    background-position: 50% 0;    
    transition: 0s linear;
    transition-property: background-position;
}

попробуйте анимировать свойство, которое может быть аппаратно ускорено в браузерах, поддерживающих его. Вместо того, чтобы изменить background-position свойство, используйте абсолютно расположенный img и затем изменить свою позицию с помощью CSS преобразований.

посмотри звездная.js. Этот плагин дает вам возможность анимации с помощью CSS-преобразований в способных браузерах (stellar.js позволит вам анимировать фоновые изображения с оговоркой, что он не будет работать так гладко на мобильных устройствах). Он также использует requestAnimationFrame, что означает меньше использования процессора, GPU и памяти.

Если вы считаете плагин перебор, вы можете по крайней мере проверить подход и адаптировать его к вашим потребностям.


иногда мы не можем использовать <img> элемент внутри div по некоторым причинам, таким как border-radius может перестать работать или width больше, чем родителей. Я столкнулся со всеми этими проблемами, и лучшим решением, которое я нашел, было использовать:

transition: 0.5s ease;
transform: translate3d(0, 0, 0);

Я получил очень хороший и плавный эффект параллакса с помощью GPU.


установите css тела, как показано ниже:

body {
  background-image: url(images/bg.jpg); 
  background-repeat: no-repeat;
  background-attachment: fixed;
  background-position: 0 0;
 }

затем, используя Javascript, просто получите pageYOffset при прокрутке страницы и установите его в фоновое положение фонового изображения тела, как показано ниже:

window.addEventListener('scroll', doParallax);
function doParallax(){
   var positionY = window.pageYOffset/2;
   document.body.style.backgroundPosition = "0 -" + positionY + "px";
}

просто проверьте мой пост здесь: http://learnjavascripteasily.blogspot.in/


чтобы сделать его гладким, поместите изображение на отдельный div и переместите весь элемент с помощью transform: translate - тогда вы получите действительно гладкие результаты.

вот небольшой пример, делающий что-то немного другое, но с помощью translate, чтобы дать вам идею:

HTML-код:

<div id="wrapper">
     <div id="content">Foreground content</div>
</div>

CSS:

@-webkit-keyframes MOVE-BG {
    0% {
        transform: translate(0%, 0%);
        -webkit-transform: translate(0%, 0%);
    }
    50% { 
        transform: translate(-250px, 0%);
        -webkit-transform: translate(-250px, 0%);
    }
    100% {
        transform: translate(0%, 0%);
        -webkit-transform: translate(0%, 0%);
    }
}

#wrapper {
    width: 300px;
    height: 368px;
    overflow: hidden;  
}
#content {
    width: 550px;
    height: 368px;
    background: url(http://www.gstatic.com/webp/gallery/1.jpg) 0% 0% repeat;
    text-align: center;
    font-size: 26px;
    color: #000;

    -webkit-animation-name: MOVE-BG;
    -webkit-animation-duration: 10s;
    -webkit-animation-timing-function: linear;
    -webkit-animation-iteration-count: infinite;
}

и скрипка:http://jsfiddle.net/piotku/kbqsLjfL/

изнутри javascript (используя jQuery) вы бы должны использовать что-то вроде:

$(".element").css("transform", 'translateY(' + ($(this).scrollTop() / 2) + 'px)');

или в vanillaJS:

backgroundElement.style.transform = 'translateY(' + ($(this).scrollTop() / 2) + 'px)';

попробуйте изменить .css to .animate. поэтому вместо установки CSS на жесткие значения вы можете анимировать его.

$(window).scroll(function () {
    $("body").animate({"background-position":"50% " + ($(this).scrollTop() / 2) + "px"},{queue:false, duration:500});
});

NB: добавить скрипт http://snook.ca/technical/jquery-bg/jquery.bgpos.js

пожалуйста, имейте в виду, что я не тестировал его, дайте мне знать, если он работает.

анимировать фоновые изображения:http://snook.ca/archives/javascript/jquery-bg-image-animations

демо: http://snook.ca/technical/jquery-bg/