2014-09-17 5 views
3

У меня есть элемент Я применяю некоторые базовые переходы на основе положения прокрутки. Он работает плавно, как и ожидалось в Safari и Firefox, но прокрутка в Chrome очень изменчив.JQuery scrollTop анимация изменчивая в Chrome

$(document).ready(function($) { 
    var divUp = $('.fade'); 
    var divDown = $('.fade-down'); 
    $(window).on('scroll', function() { 
    var st = $(this).scrollTop(); 
    divUp.css({ 
     'top'  : -(st/6)+"px", 
     'opacity' : 1 - st/400 
    }); 
    divDown.css({ 
     'opacity' : 1 - st/400 
    }); 
    }); 
}); 

Я комментировал каждую CSS свойства индивидуально, но Chrome рывков так или иначе. Свойство top перемещает относительно позиционированный элемент.

Как я могу достичь желаемого эффекта, пока все еще радует JS-двигатель Chrome? Заранее благодарим за любые отзывы.

+0

Я не уверен, что 'st' переменная содержит именно то, что вы хотите. –

+0

@GoogleHireMe это достижение именно того, что я хочу - одновременно затухания и элемента и перемещения его положения на свитке. Проблема в том, что в Google Chrome просто некоторая ошибка. – SGLVEGAS

+0

@GoogleHireMe Уже нанял вас Google? –

ответ

16

Вы испытываете layout thrashing.

Изменение свойства элемента top элемента аннулирует текущий layout. Обычно это побуждает браузер повторно вычислять макет асинхронно (т. Е. Не сразу).

Однако, позвонив по телефону scrollTopforces the browser to re-layout synchronously. Поскольку вы вызываете его в обработчике событий прокрутки, это происходит неоднократно за очень короткий промежуток времени. Эта последовательность чтения DOM-записи является известной причиной jank.

Для повышения производительности вам необходимо предотвратить разметку макета. Изменение свойств CSS transformopacity) does not invalidate the browser's layout - им требуется только composite, что намного быстрее.

Если вы анимировать transform: translateY вместо top браузер не нужно вычислять дорогостоящие расчеты по каждой кадр анимации:

divUp.css({ 
    'transform': 'translateY(' + (-(st/6)) + 'px)', 
    'opacity': 1 - st/400 
}); 

Вы можете помочь оптимизировать браузер для перехода, установив CSS will-change свойство:

.your-div { 
    will-change: transform; 
} 

Дальнейшее чтение:

  • Jank free - Статьи по повышению производительности веб-приложений
  • CSS Triggers - списки шагов, которые браузеры должны принимать, когда каждое свойство CSS изменяется
+0

Какой фантастический ответ, так информативный - спасибо! Однако использование свойства 'transform', безусловно, улучшило производительность, Safari больше не переходит к элементу. Я попытался использовать префикс поставщика '-webkit', но это тоже не сработало. Какие-нибудь предложения о том, что это может быть? В очередной раз благодарим за помощь! – SGLVEGAS

+0

Работает ли он в других браузерах? Согласно [caniuse.com] (http://caniuse.com/#search=transform), Safari всегда поддерживал '-webkit-transform', хотя он еще не поддерживается без префикса. Кроме того, кажется, что [jQuery автоматически добавляет префиксы] (http://stackoverflow.com/questions/17487716/does-css-automatically-add-vendor-prefixes), поэтому это не должно быть проблемой. Можете ли вы сделать JSFiddle с упрощенной версией? – joews

+0

Хорошо, я создал сырую скрипку, чтобы воспроизвести проблему. Http: // jsfiddle.net/7uusvfwp/ – SGLVEGAS