Отменить замедление с помощью CSS через Javascript в браузерах webkit - программирование
Подтвердить что ты не робот

Отменить замедление с помощью CSS через Javascript в браузерах webkit

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

По той или иной причине существует большая задержка с использованием jQuery CSS до и после перехода на большие слайд-шоу. Например, слайд-шоу в приведенной ниже ссылке имеет ширину около 9900 пикселей (ширина контейнера, большая часть которой скрыта). Контейнер маневрирует, чтобы отобразить соответствующий слайд, используя переход CSS3 и свойства преобразования. Задержка происходит с использованием CSS между строками 75 - 82 в пасте ниже. В частности, применение "переходного" CSS вызывает проблему. Добавьте "переход" CSS в таблицу стилей (вместо того, чтобы применять его с JS), и задержка исчезнет. Однако это не совсем решение, потому что мы хотим использовать переходы CSS3 только для определенных свойств, которые могут меняться (использование "все" в таблице стилей приведет к переходу на некоторый CSS, который мы не хотим оживлять, но регулярно меняем).

Функция анимации: http://pastebin.com/9wumQvrP

Демонстрация слайд-шоу: http://www.matthewruddy.com/demo/?p=2431

Реальная проблема с iOS, когда слайд-шоу (и даже браузер иногда) становится полностью непригодным для использования. Я не могу точно определить какие-либо ошибки и действительно исчерпал свои знания по отладке JS. Я уверен, что это связано с этим разделом функции после игры немного, а отключение поддержки CSS3 внутри плагина полностью устраняет проблему полностью.

Я полностью застрял и очень ценю любую помощь, которую любой может дать.

--- Редактировать ---

Я пробовал применять CSS с собственной Javascript, а не функцией jQuery.css. Те же результаты, не лучшие результаты. Также стоит отметить, что это вообще не происходит в Firefox, и, похоже, это проблема только с браузерами Webkit.

Любой, у кого есть решение, с удовольствием сделает пожертвование на несколько сортов пива! Я действительно не могу понять это!

--- Второе редактирование ---

Хорошо, поэтому была отладка, и я вижу, что замедление вызвано циклом перерисовки браузера, который занимает очень много времени. Есть ли лучший способ справиться с этим так, как он это делает? Позиционирование элемента абсолютно - это известный способ сокращения ретрансляции, но это не работает, потому что слайд-шоу является отзывчивым. Абсолютное позиционирование слайд-изображений или самих слайдов вызывает его сбой.

--- Третий Редактировать ---

Через день, и я добился определенного прогресса. Добавление "перехода: все 0s легкость" в таблицу стилей элементов CSS избавился от перерисовки, вызванной добавлением встроенного свойства перехода CSS с помощью пользовательской функции анимации, упомянутой в исходном сообщении. Это приводит к значительному увеличению производительности, особенно при удалении встроенного свойства перехода CSS при завершении самого перехода.

Хороший материал! Тем не менее, теперь по-прежнему наблюдается замедление при удалении встроенного CSS-перевода (который использовался для создания самого ускоренного переходного эффекта аппаратного обеспечения) после перехода, и применяется левое позиционирование. Когда они происходят вместе, происходит замедление.

Разбирая их на две отдельные задачи (перевод удаляется, а левая позиция добавляется в setTimeout без определенного времени), снова избавляется от коэффициента repaints = performance gain и выглядит, как проблема решена. Но иногда свойство перехода CSS не сбрасывается достаточно быстро, и удаление перевода становится анимированным. Нехорошо, и не знаю, где искать рядом с ним.

4b9b3361

Ответ 1

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

Абсолютное позиционирование контейнера слайдов устраняет проблему, возникающую со скоростью перерисовки после перехода (при применении свойств CSS). Очевидно, что их вывод из DOM сделал трюк, позволяя живописи проходить гораздо эффективнее.

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

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

К счастью, я наткнулся на аккуратный маленький трюк настройки "padding-top" окна просмотра слайд-шоу на процентное значение, динамически рассчитанное (желаемая высота слайд-шоу, установленная на панели настроек для этого script, деленная на желаемый ширина). Поскольку проценты отступающих вершин относятся к ширине элемента, это отлично справлялось с тем, чтобы обеспечить отзывчивую высоту и снова корректировать окно просмотра (больше не выглядят свернутыми).

Вот некоторая информация об использовании padding-top для чувствительных элементов, поддерживающих соотношение сторон. Большой трюк: http://f6design.com/projects/responsive-aspect-ratio/

Теперь все хорошо, и все хорошо работает в браузерах iOS и webkit. Все очень быстро и работает так, как должно. Четыре дня спустя, и это, наконец, выяснено. Не радует необходимость прибегать к JS для изменения размера, но я думаю, что это всегда происходило из-за процентных несоответствий между браузерами. Множество десятичных знаков = нехорошо!

Спасибо всем, кто пытался указать мне в правильном направлении. Определенно, я подумал и научился многим навыкам отладки, которые я могу использовать снова, чтобы убедиться, что переходы хорошо работают. Еще раз спасибо!

Ответ 2

Я думаю, проблема в том, что вы загружаете HUGE-изображения:)

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

Попробуйте изменить размер.

Ответ 3

Прежде всего поздравляю вас с отладкой! В последнее время я работал над одним и тем же материалом и узнал, что устройства ios не поддерживают большое количество изображений, размещенных на одной странице. Это приводит к сбоям, и единственным решением, которое я нашел, является удаление элементов, а не просто их скрытие. Недостатком является то, что удаление и добавление элементов приводит к задержкам, поэтому вы должны делать это умно, когда ваши переходы выполняются. Я думал, что лучший способ - сохранить 3 или 5 изображений в DOM и заменить остальных эскизами изображений, изменив их размер, чтобы они соответствовали оригиналу. Когда переходы выполняются, я просто вернул большие изображения на место... Надеюсь, это поможет вам немного решить проблему ios...

Ответ 4

Проведя некоторое время, анализируя ваш код TimeLine с помощью инструментов Chrome Dev, я считаю, что есть какая-то оптимизация, которую вы могли бы сделать.

Насколько я могу судить, каждое одно из ваших 16 изображений полностью перекрашивается каждый раз, когда запрашивается анимация. Это кажется мне совершенно очевидным, так как в вашем примере есть 16 изображений, и Chrome Dev Tools сообщает о 16 длинных исполнениях "Paint" каждый раз при нажатии "Далее".

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

Еще одна вещь, использующая уменьшенные изображения, вероятно, делает циклы краски еще более длинными. Избегайте их, когда можете.

Ответ 5

Не уверен, что это помогает или нет, но я заметил, что вы используете 3D-перевод. Я бы подумал, что простого перевода 2d будет достаточно, потому что ваш третий параметр равен 0 и может ускорить проблему, а также пойти с меньшим количеством изображений в качестве Armel L. предположительно, не имеют iphone для тестирования, хотя... в качестве альтернативы это решение, которое я использовал до css3, но все равно должен работать, перемещая элемент, содержащий изображения, используя javascript, изменяя left (? и top - демо перемещается только слева и правда, без эффектов перехода), и таким образом вы можете точно настроить частоту обновления, которая, как я думаю, может повлиять на замедление... вы можете опуститься до 18 кадров в секунду без каких-либо замечаний, возможно, даже будет достаточно хорошо, только с 16 кадрами в секунду

Ответ 6

У меня было это, когда я впервые разрабатывал устройство страницы в стиле карусели в журнале.

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

То, что я нашел, работает, "скрывает" их... Но убедитесь, что они занимают необходимое физическое пространство.

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

В моей собственной системе я пропустил "лоток", удерживая изображения e, и имел их только при ширине -100%, ширине 100%, а текущей - 0.

Мне никогда не везло с типичной карусели с длинными лотками с крупномасштабными фоновыми изображениями... Особенно с ускорением css3.