Як запобігти зміні тексту в Webkit під час переходу CSS


81

Я використовую переходи CSS для переходу між перетвореними станами CSS (в основному переходячи за масштабом елемента). Я помічаю, що коли елемент переходить, решта тексту на сторінці (у Webkit) має тенденцію трохи змінювати його візуалізацію, поки перехід не буде зроблений.

Скрипка: http://jsfiddle.net/russelluresti/UeNFK/

Я також помітив, що це не відбувається в моїх заголовках, на яких є -webkit-font-smoothing: antialiasedпара властивість / значення. Отже, мені цікаво, чи є спосіб зберегти текст за замовчуванням ("авто" значення для згладжування шрифтів) і не змінювати візуалізацію під час переходу.

Я спробував явно встановити для тексту значення "auto", але це нічого не робить. Слід також зазначити, що встановлення для згладжування шрифтів значення "немає" також запобігає блимання візуалізації під час переходу.

Будь-яка допомога вдячна.

Редагувати 1

Слід зазначити, що я працюю в OS X. Переглядаючи мій тест у Chrome на Parallels, я не бачив, як два різні абзаци поводяться по-різному, тому це може бути проблемою, яка стосується лише Mac.


21. А версія Safari - 6. Це трапляється в обох браузерах, що змушує мене думати, що це Webkit, а не браузер.
RussellUresti

як абзаци зі згладжуванням, так і псевдоніми демонструють однакову поведінку. хром Версія 23.0.1270.0 канарейка | 21.0.1180.89 м | 5,17 сафарі

Я здогадуюсь, ви перебуваєте у розробницькій версії Chrome. Хоча ОС може відігравати в цьому певну роль. Я відредагую запитання, щоб зазначити, що я використовую OSX.
RussellUresti

1
Я абсолютно не уявляю, чому це працює, але додаючи '-webkit-transform: translateZ (0);' to '.antialiased {}, здається, це виправляє. Це навіть працює, якщо ви додасте його до 'p {}'. Оскільки я не можу пояснити, чому це працює, не було правильним надати це як відповідь. Сподіваюся, це допоможе!
Крістофер Віландер,

@Christofer Це робить їх послідовними - але це змушує їх виглядати згладженими (вони всі тонший текст). Я намагаюся зробити так, щоб текст, що не згладжується (перший абзац), залишався у стилі за замовчуванням (який виглядає дещо сміливішим, ніж згладжений текст).
RussellUresti

Відповіді:


83

Думаю, я знайшов рішення:

-webkit-transform: translateZ(0px);

Примусове апаратне прискорення батьківського елементу, здається, вирішує проблему ...

РЕДАКТУВАТИ Як коментували, цей хак відключає згладжування шрифтів і може погіршити візуалізацію тексту залежно від ваших шрифтів, браузера та ОС!


Спробував згладити шрифт, і це не спрацювало. Спробував це, це спрацювало чудово
locrizak

Це не дало мені бажаного результату для зазначеної проблеми, але це допомогло вирішити інші проблеми переходу CSS, які у мене були (наприклад, дивний блимаючий текст при приховуванні / показу вмісту в елементі переходу).
RussellUresti

3
Не працює для мене, тоді як -webkit-font-Smoothing: antialiased; та -webkit-backface-visibility: прихований; робіт. Кредити йдуть тут stackoverflow.com/questions/11589985 / ...
F Lekschas

+1 чудово, це єдиний метод, який спрацював для ситуації, в якій я опинився
Ларрі

4
Це вимикає згладжування шрифтів. Отже, у вас немає згладжування шрифтів на початку переходу, згладжування шрифтів під час переходу та згладжування шрифтів в кінці. Тож ніяких змін згладжування шрифтів, а також взагалі не згладжування шрифтів.
yunzen

45

ОНОВЛЕННЯ Серпень 2020

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

Однак , хоча за замовчуванням воно використовує субпіксельне згладжування шрифту, мазь у згладжуванні шрифту Chrome має значну кількість для тих, хто шукає послідовний рендеринг тексту .

  1. Це візуалізація Chrome світлим текстом на темному тлі світло на темряві
  2. Це візуалізація темного тексту Chrome на світлому фоні темний на світлі

Подивіться на розмір цілого в букві е вище. Світлий текст на темному тлі відтворюється з помітно більшою вагою, ніж темний текст на світлому фоні (з однаковим стилем css шрифту).

Одним із рішень для сайтів, які поважають налаштування темної / світлої теми користувача, є націлювання Chrome за допомогою медіа-запиту, обмеженого темним режимом, і переключення його на несубпіксельне згладжування приблизно так:

@media screen
and (-webkit-min-device-pixel-ratio: 0)
and (min-resolution: 0.001dpcm)
and (prefers-color-scheme: dark) {
  body {
    -webkit-font-smoothing: antialiased;
  }
}

Результат :

темний на світлісвітло на темному згладжене

Набагато більш послідовна вага тексту незалежно від того, чи відображати світло на темному чи темне на світлі.

Перегляньте паралельне порівняння до і після: світло на темрявісвітло на темному згладжене

-

ОНОВИТИ Травень 2018

-webkit-font-smoothing: subpixel-antialiasedзараз не має ефекту в Chrome, але в Safari все ще значно покращує ситуацію, АЛЕ ТІЛЬКИ НА RETINA. Без нього в Safari на сітківках сітківки текст тонкий і безглуздий, тоді як разом з ним текст має належну вагу. Але якщо ви використовуєте це на дисплеях Safari без сітківки, (особливо при незначних значеннях) текст - катастрофа. Настійно рекомендую використовувати медіа-запит:

@media screen and (-webkit-min-device-pixel-ratio: 2) {
  body {
    -webkit-font-smoothing: subpixel-antialiased;
  }
}

Явне налаштування -webkit-font-smoothing: subpixel-antialiasedє найкращим поточним рішенням, якщо ви хочете хоча б частково уникати більш тонкого згладженого тексту.

--tl; dr--

І в Safari, і в Chrome, де за замовчуванням для рендерингу шрифтів використовується субпіксельне згладжування, будь-який CSS, який змушує рендерінг на основі графічного процесора, як, наприклад, наведені вище пропозиції щодо використання перетворення з використанням translateZ або навіть просто переходу в масштабі, призведе до того, що Safari та Chrome автоматично "відмовляться" "для згладжування субпіксельних згладжених шрифтів і замість цього перейдіть до просто згладженого тексту, який виглядає набагато легшим і тоншим, особливо в Safari.

Інші відповіді зосереджувались на підтримці постійного рендерингу, просто встановлюючи або примушуючи згладжувати шрифт до тоншого згладженого тексту. На мій погляд, використання translateZ або прихованого тла значно погіршує якість відтворення тексту, і найкраще рішення, якщо ви хочете, щоб текст залишався незмінним, і з вами все в порядку, якщо тонший текст просто використовується -webkit-font-smoothing: antialiased. Однак явне налаштування -webkit-font-smoothing: subpixel-antialiasedнасправді має певний ефект - текст все ще незначно змінюється і майже помітно тонший під час переходів, відтворених на графічному процесорі, але не такий тонкий, як це відбувається без цього налаштування. Отже, схоже, це принаймні частково перешкоджає переходу до прямого згладженого тексту.


2
Дякуємо за чудовий запис!
Денис Горбачов

2
Це найкраще рішення. Усі інші погіршують візуалізацію тексту, чого ОП спеціально просив уникати
fregante

Рятувальник для мене! Дякую. Уникає різкого переходу на рендеринг пікселів після переходу css. Принаймні, при переході непрозорості це утримує шрифт (теоретично завжди за замовчуванням) підпіксельного візуалізації навіть під час переходу. Чудово!
Гаравані

найкраще рішення для нас! Дякую
ядро

Дякую, я зіткнувся з цим більше року тому і забув про все. Це єдине рішення, яке вирішило описану проблему для мене.
Іен Коллінз

20

Я помітив, що майже кожного разу, коли у мене виникають проблеми з графікою (мерехтіння / заїкання / непостійність / тощо) через перехід, використовуючи -webkit-backface-visibility: hidden; на елементи, які діють вгору, прагне вирішити проблему.


3
Це (на даний момент) правильна відповідь. Наскільки мені відомо, webkit-font-Smoothing було видалено деякий час тому, його слід було додати ще раз, але наразі у мене не працює в останній версії Chrome. Здається, трюк translateZ теж вже не працює. Я думаю, це може змінитись у будь-який час. : /
Мантріур

3
Це спричинило розмиття тексту для мене.
Джон

8

Щоб запобігти змінам візуалізації тексту через апаратне прискорення, ви можете:

  1. Встановіть для всього тексту параметр -webkit-font-Smoothing: antialiased. Це означає, що текст тонший і не згладжений підпікселями.

  2. Якщо ви хочете, щоб текст, на який впливає апаратне прискорення, був згладжений пікселями (тип згладжування шрифтів за замовчуванням), тоді розміщення цього тексту всередині введення, без меж та вимкнення, збереже цей піксель згладженим (принаймні у Chrome на Mac OS X). Я не тестував цього на інших платформах, але якщо згладжування субпікселів важливо, ви можете принаймні скористатися цим фокусом.


Я протестував варіант 2 (фокус з елементом введення) на Win8.1 та Chrome 47, і він не працює.
Пайя


3

Це те, що мені вдалося. Сподіваюся, це допоможе. Знайдено в іншій публікації stackoverflow.

-webkit-font-smoothing:antialiased;
-webkit-backface-visibility:hidden;

1

Щоб запобігти зміні візуалізації, потрібно встановити font-smoothing: antialiased(або none).

Вимкнення візуалізації субпіксельних шрифтів браузером, ймовірно, є побічним ефектом апаратного прискорення. Коли фон, на якому ви здійснюєте рендеринг, постійно зміщується, текст неможливо відтворити на окремому шарі, оскільки кожен кадр потрібно перевірити на всіх фонових шарах. Це може серйозно погіршити продуктивність.

Apple , часто відключають підсвічений шрифту згладжує на своїх власних сайтах.


Проблема встановлення згладжування шрифтів на згладжене полягає в тому, що текст виглядає не так, як я хочу. Я хочу, щоб візуальний ефект встановив для згладжування шрифтів значення "авто" (сміливіший вигляд) - але коли ви це зробите, текст буде зміщуватися під час будь-якого переходу. Отже, моя мета - просто постійно підтримувати сміливий вигляд «авто».
RussellUresti

1
Ви можете обійти це, не використовуючи апаратне прискорення. Використовуйте таймер у jQuery і виконуйте перехід вручну (без переходу CSS). Я не впевнений, що рекомендую його, оскільки продуктивність та плавність будуть гіршими.
Генрік

Правда, я міг би просто використовувати jQuery для його анімації ... Це може бути єдиним рішенням, якщо іншого рішення немає.
RussellUresti

1

На додаток до вищезазначених рішень ( -webkit-transform: translateZ(0px)на елементі та -webkit-font-smoothing: antialiasedна сторінці) деякі елементи все ще можуть поводитися погано. Для мене це був текст-заповнювач у вхідному елементі: Для цього використовуйтеposition:relative


-1

У мене була та сама проблема. Уважно прочитайте:

Я помічаю, що коли елемент переходить, решта тексту на сторінці (у Webkit) має тенденцію трохи змінювати його візуалізацію, поки перехід не буде зроблений.

здається, жодне з наведених вище рішень не спрацювало. Однак налаштування (подібні речі)

#myanimation { -webkit-transform: translateZ(0px); }

на елементі, який має анімацію , спрацював.

Виводячи анімований елемент на рівень графічного процесора, ви виводите його із звичайного потоку візуалізації сторінки (наприклад, такі речі, як z-index, теж більше не працюватимуть). Як побічний ефект, анімація та решта сторінки більше не впливатимуть один на одного.

Якщо це впливає на візуалізацію шрифту, це робиться лише для анімованого елемента, звичайно. Я не бачу різниці в своєму Chrome.


Я стою виправлений. Я бачу зміни в отриманні шрифтів на решті сторінки, також у місцях, де не застосовується translateZ (0).
commonpike

Це єдине, що працювало у мене, коли у мене були значки шрифтів, які ставали розмитими. Застосував перетворення до анімованих розділів, і це вирішило проблему.
Білл

Чувак, на це вже відповіли 2 роки тому. Прямо вгорі ... Точно така ж відповідь / код.
NiCk Newman

так, єдиним моїм підсумком було те, що вам потрібно поставити -webkit-transformна елемент, який має анімацію , щоб запобігти рендерингу змін на інших елементах на сторінці . але, як коментували, він деякий час працював і перестав працювати, коли пізніше я змінив біти сторінки.
commonpike
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.