2015-06-04 1 views
13

У меня возникла эта странная проблема в Safari и Firefox (Mac/Yosemite), которая заставляет почти весь текст на странице мерцать при зависании над преобразующим элементом.CSS3 Трансформация, вызывающая изменение текста в Safari и Firefox Mac Yosemite

Пример GIF: (Firefox, Yosemite)

enter image description here

.usp { 
    //USP has an icon that is defined below 
    opacity: .4; 
    @include transition(all .3s ease-in-out); 


    &:hover { 
     opacity: 1; 
     @include transition(all .3s ease-in-out); 


     .icon { 
      @include transform(scale(1.1)); 
      @include transition(all 1.7s ease-in-out); 
     } 
    } // :hover 
} 

.usp .icon { 
    display: block; 
    height: 75px; 
    width: 75px; 
    // Insert background-image sprite (removed from this example) 
    @include transition(all .3s ease-in-out); 
    @include transform(scale(1.0)); 
} 

Я попытался следующие вещи:

Добавить все возможные комбинации этих стилей к телу, трансформирующий элемент и/или его родителей

-webkit-transform-style:preserve-3d; 
-webkit-backface-visibility: hidden; 
-moz-backface-visibility: hidden; 
-ms-backface-visibility: hidden; 
backface-visibility: hidden; 
-webkit-filter: opacity(.9999); 
-webkit-font-smoothing: antialiased; 
-webkit-transform: translate3d(0, 0, 0); 
-moz-transform: translate3d(0, 0, 0); 
-webkit-transform: translate3d(0, 0, 0); 
transform: translate3d(0, 0, 0); 
-webkit-font-smoothing: subpixel-antialiased; 
-webkit-text-stroke: 0.35px; 

Если (стили ниже) применяются к телу, проблема исправлена ​​в Safari, но не в Firefox, так как это не браузер веб-китов.

-webkit-transform: translate3d(0, 0, 0); 
-webkit-text-stroke: 0.35px; 

Я понятия не имею, что вызывает это и как я могу это исправить!

+0

фрагмент кода Добавить на http://jsfiddle.net пожалуйста. –

+0

Я попытался создать скрипку как можно лучше. (Потому что на всем сайте используется множество стилей, и я не мог просто скопировать/вставить что-то). Как-то эта скрипка работает в FF, а не в Safari. http://jsfiddle.net/Mr_recci/j04mayvb/2/ –

+0

@MrRecci, поскольку jsfiddle не поддерживает sass, я думаю, что некоторые из ваших стилей в этой скрипке отсутствуют. –

ответ

15

Хорошо!

После недели тестирования, удаления и добавления правил CSS я наконец нашел решение, которое устранило мою проблему. Первоначально у меня была эта проблема как в Firefox 39, так и в Safari 9, но Firefox загадочно фиксировал себя последним обновлением. Однако Safari этого не сделал. Проблема связана с 3D-рендерингом элементов на странице. Элемент, который я пытался масштабировать, должен был быть преобразован в 3D-контекст, мерцающие элементы на странице, переключаемые между 2D и 3D, как объяснил @ Woodrow-Barlow в других ответах.

Добавляя

-webkit-transform: translate3d(0, 0, 0); 

к элементам мерцающих, и, таким образом, делая их в 3D на странице загрузки, они больше не приходилось переключаться!

EDIT 1: Для людей, которые имеют эту проблему в других браузерах, посмотрите на CSS «воли изменить» свойство: https://dev.opera.com/articles/css-will-change-property/

+0

Идеально, исправлена ​​такая же проблема с переходом непрозрачности, который работал как в Firefox, так и в Chrome, но не в Safari. (Я думал, что Chrome будет демонстрировать подобное поведение, но нет.) – SexxLuthor

0
-webkit-transform: translate3d(0, 0, 0); 
-webkit-text-stroke: 0.35px; 

Эти коды предназначены для поддержки нескольких браузеров. попробовать это для Mozila

-moz-transform: translate3d(0, 0, 0); 
-moz-text-stroke: 0.35px; 
+0

Спасибо, я попытался добавить их в тело и преобразующий элемент. Все та же проблема. Текстовый ход не существует с префиксом -moz –

+0

Можете ли вы сделать фрагмент здесь, лучше узнать проблему. – Tuku

+0

Я попытался создать скрипку как можно лучше. (Потому что на всем сайте используется множество стилей, и я не мог просто скопировать/вставить что-то). Как-то эта скрипка работает в FF, а не в Safari. http://jsfiddle.net/Mr_recci/j04mayvb/2/ –

0

Я нашел это в основном происходит на элементах, которые были преобразованы (т.е. модальный, который скользит в). Есть ли какое-либо преобразование на любом из родительских элементов?

Существует множество исправлений в Интернете для веб-браузеров, но ничего для Firefox.

+0

Нет! Родители просто нормальные divs без какого-либо перевода или преобразования. Я тоже нашел (и попробовал) исправления, но они все вроде хаки. –

2

Ааа, но вы пробовали

.usp .icon { 
    -webkit-transform: translateZ(0); 
    transform: translateZ(0); 
} 

http://jsfiddle.net/j04mayvb/4/

enter image description here

Я честно не знаю, почему это работает, но я могу видеть его остановить мерцание на вашем Fiddle в Safari.

+0

Странно, это не работает для меня в Сафари. Я добавил другие префиксы, и он также не работает в Firefox. http://i.imgur.com/7wGUDFE.gifv –

+0

Можете ли вы посмотреть ссылку jsfiddle, которую я опубликовал? Или это тоже мерцает в Сафари? – MattDiamant

+1

@MrRecci вы пробовали включать в себя не префиксное преобразование в дополнение к webkit? –

7

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

В современных браузерах, работающих на компьютере с выделенным графическим процессором (процессор для рендеринга графики), браузер иногда переносит задачу рендеринга веб-страницы с вашего процессора («нормального» процессора) на GPU. У каждого процессора и графического процессора есть свои сильные и слабые стороны - природа графического процессора заключается в том, что он может эффективно обрабатывать трехмерные преобразования, но может не иметь возможности сделать чистый текст так же отчетливо, как это делает CPU.

Ваш эффект зависания использует преобразование, которое ваш браузер счел подходящим для рендеринга графического процессора с аппаратным ускорением (скорее всего, вызвано преобразованием scale(1.1)), и поэтому он временно переключил рендеринг на GPU, когда происходит анимация/переход наведения , После завершения анимации процессор снова берет на себя рендеринг. Из-за различных стратегий рендеринга, используемых различными аппаратными средствами, текст выглядит по-другому (менее четким), в то время как графический процессор отвечает за работу.

К сожалению, у нас пока нет четкого контроля аппаратного ускорения с помощью CSS - браузер устанавливает это, когда захочет. Однако мы можем установить некоторые свойства, которые подозревают, что поставит браузер в аппаратный ускоренный режим графического процессора. Теория здесь заключается в том, что мы будем держать браузер в режиме графического процессора даже тогда, когда анимация не происходит, так что мы не видим «мерцания».

Эта стратегия имеет некоторые недостатки: пользователи, посетившие ваш веб-сайт, будут немного увеличивать использование оперативной памяти, пока ваша страница будет открыта, а пользователи мобильных/ноутбуков будут испытывать немного повышенный разряд батареи. На устройствах, у которых нет выделенного графического процессора, аппаратное ускорение не будет запущено (но опять же, эти устройства не будут видеть «мерцание», которое вы видите в любом случае).

Похоже, вы уже пытались сделать это, добавив свойство scale(1.0) к незанятому элементу - моя лучшая догадка заключается в том, что ваш браузер (ы) получил «умный» и обнаружил, что это правило ничего не делает и проигнорировал это. Наиболее надежным способом запуска аппаратного ускорения обычно является преобразование на оси Z. Попробуйте изменить преобразование к следующему:

@include transform(scale(1.00001), translateZ(0.00001)); 

Вместо того чтобы использовать значение «1» и «0», я использую бесконечно близкие значения; надеюсь, это не позволит браузеру стать «умным» и игнорировать правило.

Я предполагаю, что ваш Sass включает в себя префикс поставщика. Дважды проверьте, что конечный вывод включает в себя не только -webkit-transform: и -moz-transform:, но также содержит синтаксис без предварительного кодирования transform:. Если вы хотите быть уверены (для целей отладки), просто введите их вручную:

.usp .icon { 
    transform: scale(1.00001), translateZ(0.00001); 
    -webkit-transform: scale(1.00001), translateZ(0.00001); 
    -moz-transform: scale(1.00001), translateZ(0.00001); 
} 

С моей стороны, я не испытывал никакого мерцания, чтобы начать с на вашей скрипке (я подозреваю, что мой браузер/OS/hardware конфигурация не считает, что для GPU подходит 2-мерная шкала), поэтому я не могу проверить этот код. Однако я использовал подобные методы для решения подобных проблем довольно часто.

+0

Спасибо! Объяснение об рендеринге было совершенным и дало мне несколько указаний на то, где искать ответ. Однако предлагаемые решения не помогли. Добавление -webkit-transform: translate3d (0, 0, 0) исправило это для меня. (См. Мой другой ответ) –

+0

странно. translate3d - это просто сокращенная версия, которая включает translateX, translateY и translateZ. в любом случае, рад, что вы его исправили. –

1

OK!

Итак, проблема, с которой я столкнулся, была в пользовательском всплывающем окне, где у меня был эффект колеса на крестике с использованием перехода css. Но это вызвало проблему фликкера во всплывающем окне.

После посещения различных интернет-порталы, я должен знать, что свойство перехода:

webkit-backface-visibility: hidden; 

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

webkit-transform: translate3d(0, 0, 0); 

но, как я использовал его в пользовательском всплывающем окне который уже был переведен -50% в направлении y, чтобы держать его в центре, я был ограничен, чтобы не использовать его.

После игры с свойствами CSS в течение нескольких дней и опробовать различные решения, я пришел к выводу, что общая высота компонента, в котором перемещенный элемент используется должен быть ДАЖЕ и в случае динамических данных, нам нужно настроить поля и прокладки таким образом, чтобы общая высота оставалась EVEN.

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

Надеюсь, это поможет любому, кто в этом нуждается. :)

0

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

В нашем случае проблема возникла из-за одного пикселя. Когда вы центрируете модальный, используя перевод -50% или, возможно, используете% размеров. Детальные элементы внутри этого контейнера могут иметь одно положение (в зависимости от ширины/высоты модального). В chrome вы можете просто проверить это на элементе на вычисленной вкладке. Если есть одна позиция, вы можете увидеть их «прыгать» при наведении на другой элемент, например, анимированную кнопку css.

Когда вы наводите курсор на кнопку css, это не только отображение самого элемента, но и других элементов на странице. Из-за одной позиции вы можете видеть, как элемент прыгает.

Масштаб В нашем случае мы имели вторую проблему, мы хотели уменьшаем полную страницу, когда пользователь посещает страницу с меньшим экраном. Сначала мы использовали «Перевести» (шкала). Шкала на родительском div также вызывает одно из поведений дочерних элементов. Скажем, ваш масштаб равен 0,8343493. В этом случае дочерние элементы пересчитываются и могут просто получить один. С анимацией css3 вы получаете ту же проблему, что и описанную выше.

После нескольких недель поиска ответа для Chrome было довольно просто, теперь мы используем более старый вариант zoom: 1.0 вместо translate: (scale 1.0). В результате у нас появилась четкая и не мерцающая страница.

Example end-result with scale & non-flickering buttons & transitions: