Подтвердить что ты не робот

CSS Transform вызывает мерцание в Safari, но только при ширине браузерa >= 2000 пикселей

Вы читаете это правильно. Протестировано на нескольких машинах в офисе, и единственная разница между сценариями была размером браузера. Сотрудник сузил его до 2000px сладкое пятно. Lo-and-behold, когда мы каждый изменяем размеры наших браузеров, чтобы быть >= 2000px широко и мыши над элементом с анимацией трансляции, различные элементы на странице - в частности, любой элемент с фоном градиента CSS - мерцает. И наоборот, если вы измените размер браузера, чтобы быть < 2000px широкий и мышь над этим же элементом не мерцает.

Кто-нибудь еще видел это странное поведение? Почему 2000px - волшебное число, и что именно происходит при 2000px?

ПРИМЕЧАНИЕ. Я не могу по-настоящему поделиться снимками экрана/видео/ссылками, поскольку этот сайт еще не открыт, а код относительно не нужен, поскольку, похоже, это больше проблема браузера, чем что-либо.

ПРИМЕЧАНИЕ 2. Мой вопрос здесь действительно о том, что именно происходит в Safari в 2000px, не обязательно, как исправить мерцание с помощью backface-visibility или translateZ или тому подобного. Причина состоит в том, что мы используем -webkit-font-smoothing: subpixel-antialiased; либерально на всем сайте и используем любой из этих трюков, которые превосходят это свойство для всей страницы, включив антиалиасинг/оттенки серого для всего текста.

EDIT - Хорошо, извините, что раньше этого не делали. Вот немного кода в jsFiddle, который должен воспроизвести проблему: http://jsfiddle.net/brandondurham/ujPMK/embedded/result/

Помните, что для этого Safari должен быть установлен как минимум на 2000 пикселей.

4b9b3361

Ответ 1

Разочарование да?

См. EDIT4 для ответа на вопрос, почему 2000px является магическим числом.

Есть несколько вещей, которые вы можете попробовать.

  • Добавьте -webkit-transform-style: preserve-3d; к элементам, которые мерцающий.

  • добавить -webkit-backface-visibility: hidden; к элементам, которые мерцающий.

  • перемещать анимационный элемент вне родителя мерцающий элементы находятся внутри.

EDIT - Уэсли Хейлз, сказал здесь   "Я столкнулся с глючным поведением при применении аппаратного ускорения к частям страницы, которые уже были ускорены"

Сложно помочь вам отладить это без какого-либо кода. Но для начала я предлагаю вам включить режим отладки в сафари. Write 'defaults write com.apple.Safari IncludeInternalDebugMenu -bool true' в терминале.

После этого появится меню Debug. Выберите флаги Рисование/Композиция > Показать границы композиций.

Это поможет вам понять, что отображается, и тем самым выбрать, что вводить в аппаратное ускорение и что не учитывать.

EDIT2 - Это стоит проверить также: fast-animation-with-ios-webkit

Это касается iOs, но я испытал это - в некоторых случаях решения, работающие на iOs, также работают на osx.

EDIT3 - Если вы просто спрашиваете, что происходит, когда он превышает 2000 пикселей, я могу точно сказать вам, что на iPhone'е WebKit создает текстуры размером не более 1024 на 1024, и если ваш элемент больше этого, он должен создавать несколько текстур.

Документация по ограничениям текстуры

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

Не знаю, это твой случай. Невозможно сказать без какого-либо кода.

EDIT4 - "Реализация в TextureMapperTiledBackingStore довольно проста и используется только для работы с ограничением размера текстуры 2000x2000 в OpenGL".

Итак, если ваш элемент больше 2000x2000, он должен создавать несколько текстур.

http://trac.webkit.org/wiki/CoordinatedGraphicsSystem

Ответ 3

Если шрифты мерцают, используйте следующий CSS:

html,body {
    -webkit-font-smoothing: antialiased;    
}

Ответ 4

Я заметил, что после применения CSS3 элементы преобразования в Chrome выглядят немного "хрустящими" и неровными. Решения в ответе Матиаса не влияют на это. Но вот странно - после того, как я применил фильтры webkit (т.е. -webkit-filter: opacity(0.99999);), элементы, обработанные должным образом, и буквы в тексте выровнены. Но после этого эти элементы немного размываются. Возможно, это влияет на ваше мерцание.

Ответ 5

Прежде всего, благодаря отличным решениям, предлагаемым здесь. Я всегда думал, что в прошлом, должно быть, что-то не так с моим кодом. Это не было. Я также объяснил, что граница 2000px для анимаций не работает гладко. Спасибо вам, ребята, я теперь добавляю

/*keep animation smooth in Safari above 2000px*/
@media ( min-width: 2000px ) {
    .boxContent {
        -webkit-backface-visibility: hidden;
    }
}  

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

/*keep animation smooth in Safari above 2000px*/
.twothousand {
    -webkit-backface-visibility: hidden;
}  

и добавил и удалил дополнительный класс через JQuery. Таким образом, переходы гладкие и рендеринга после завершения (снова удаление класса) Немного сложный, но он отлично подходит для меня и, наконец, делает анимацию в Safari выше 2000 пикселей ровной. Отличная работа, ребята!!

Ответ 6

Простым решением, которое разрешило все мои проблемы, было следующее:

.app * {
  transform-style: preserve-3d;
}