Оптимизация прокрутки параллакса в javascript / coffeescript - PullRequest
1 голос
/ 08 марта 2012

У нас есть параллакс-прокрутка на нашем сайте.
Это достаточно просто, по 4 слоя на каждой стороне, которые прокручиваются в разных темпах в соответствии с линейной функцией.

Однако, это не так гладко, как я хочуособенно если у меня открыто несколько вкладок.
Вы заметили небольшую задержку между прокруткой и обновлением изображений параллакса, а также уменьшенную частоту кадров.

Частота кадров намного лучше на небольшомэкран (я работаю на 27 "экране), но я хотел бы добиться максимальной производительности на всех экранах.

Вот код для настройки прокрутки:

win = $(window)
footerHeight = $('footer').height()
win.scroll ->
  scroll = win.scrollTop()
  baseTop = 183 - scroll - 6*scroll/footerHeight
  for layer in [0..7]
    el = parallaxLayers[layer].element
    top = parseInt(baseTop - scroll * (10 + layer % 4 * 30)/footerHeight)
    left = parallaxLayers[layer].left
    el.style.backgroundPosition = "#{left}px #{top}px"

Это CoffeeScript, но я надеюсь, что он достаточно прост для понимания большинством JS-разработчиков.

То, что я уже делаю:

  • Предварительная выборка всех элементов, чтобы к ним можно было мгновенно получить доступ в функции.
  • Предварительная выборка background-position-x, чтобы ее не нужно было извлекать при каждой итерации.
  • Не используйте jQuery для установки стиля из-за увеличения служебных данных.
  • Calculaвсе как можно меньше раз (следовательно, baseTop)

Каждый слой расположен статически, чтобы он не дрожал, и я обязательно изменю положение фона, чтобы не вызыватьперекомпоновка страницы.

Могу ли я попробовать еще что-нибудь?


Поскольку производительность зависит от размера экрана, я считаю, что это проблема рендеринга больше, чем проблема JS.Может быть, какой-нибудь причудливый CSS3 может помочь?

1 Ответ

3 голосов
/ 08 марта 2012

Вместо этого я использовал холст.Это дает намного более гладкое чувство.

...