WebKit: Размытый текст с масштабированием css + translate3d

Я вижу проблему, из-за которой Chrome и другие браузеры WebKit массово размывают любой контент с масштабированием css, к которому также применяется translate3d.

Вот скрипт JS: http://jsfiddle.net/5f6Wg/. (Посмотреть в Chrome.)

.test {
  -webkit-transform: translate3d(0px, 100px, 0px);
}

.testInner
{
  /*-webkit-transform: scale(1.2);*/
  -webkit-transform: scale3d(1.2, 1.2, 1);
  text-align: center;
}
<div class="test">
  <div class="testInner">
    This is blurry in Chrome/WebKit when translate3d and scale or scale3d are applied.
  </div>
</div>

Существуют ли какие-либо известные обходные пути для этого? Я понимаю, что в приведенном выше простом примере я мог бы просто использовать translate, а не translate3d - смысл здесь в том, чтобы сократить код до самого необходимого.


person phil    schedule 05.11.2011    source источник
comment
я думаю, что это исправлено, мне не кажется размытым   -  person neaumusic    schedule 09.07.2015
comment
Небольшое дополнение: в последнем Chrome я столкнулся с проблемой, например, при использовании неокругленных значений для translate3d. Округление их исправило для меня все размытие.   -  person saroff    schedule 25.05.2017


Ответы (8)


Webkit обрабатывает преобразованные 3D-элементы как текстуры, а не векторы, чтобы обеспечить аппаратное ускорение 3D. Единственным решением этого было бы увеличить размер текста и уменьшить масштаб элемента, по сути, создавая текстуру с более высоким разрешением.

См. здесь: http://jsfiddle.net/SfKKv/

Обратите внимание, что сглаживание по-прежнему недостаточное (стебли теряются), поэтому я усиливаю текст небольшим количеством теней.

person methodofaction    schedule 07.11.2011
comment
тогда это будет намного медленнее на мобильных вебкитах? - person Alex K; 28.03.2013
comment
Отличное решение, немного похожее на решение для сетчатки, но только для десктопов. Идея понравилась, реализую прямо сейчас, супер-реквизит. - person ReSpawN; 13.08.2013
comment
Выглядит довольно ужасно для меня в версии Chrome 54.0.2840.71 m (64-разрядная версия) - person Amethi; 29.10.2016

Я обнаружил, что с помощью:

-webkit-perspective: 1000;

на контейнере вашего шрифта или набора значков сохранял четкость для меня после эксперимента с проблемой на Android nexus 4.2 в течение некоторого времени.

person hallodom    schedule 27.06.2013
comment
Дэн, это сделало это! Вместе с -webkit-transform: translate3d(0,0,0). Формы букв странным образом вставали на место в конце шкалы, и это исправило ситуацию. Пробовал все остальное под солнцем. - person jwinn; 21.11.2013
comment
Предположим, это связано с тем, что эти свойства запускают ускорение графического процессора, а также повышают производительность переходов по этим элементам! :) - person hallodom; 08.01.2014
comment
@SergeiBasharov Я не думаю, что ОП хотел мобильное решение. А на десктопе ничего не делает. Я проголосовал за этот ответ, но это все. - person Teodor Sandu; 10.12.2014
comment
Мне также нужно -webkit-transform: translate3d(0,0,0) - person Phil Hudson; 02.06.2016

Эффект фильтра css — это графическая операция, которая позволяет управлять внешним видом любого элемента HTML. Начиная с Chromium 19, эти фильтры ускоряются графическим процессором, что делает их очень быстрыми.

CSS3 представляет набор стандартных эффектов фильтра, один из них — фильтр размытия:

-webkit-filter: blur(radius);

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

Установка радиуса на 0 заставит браузер использовать вычисления графического процессора и заставит его сохранить ваш html-элемент без изменений. Это похоже на применение эффектов «жестких краев».

Поэтому лучшим решением для меня, чтобы исправить этот эффект размытия, было добавить эту простую строку кода:

-webkit-filter: blur(0);

Существует также известная ошибка, которая влияет только на экраны Retina. (См. здесь: Почему не 't blur(0) удалить все размытие текста в Webkit/Chrome на экранах Retina?). Поэтому, чтобы он работал и для сетчатки, я рекомендую добавить вторую строку:

-webkit-transform: translateZ(0);
person maoosi    schedule 01.09.2015
comment
пожалуйста, объясните свой ответ - person Blip; 11.09.2015
comment
Как примечание, применение размытия на лету в инструментах разработчика, похоже, не имеет такого же эффекта, как при загрузке страницы. Не уверен, что это был только я, но это может быть ответ, который вы ищете, просто перезагрузите страницу. - person Spaceman; 16.09.2015
comment
После того, как вы попробовали ВСЕ остальное в поиске Google, это было исправлением. Спасибо! - person th317erd; 06.10.2015
comment
это сработало для меня! .modal { максимальная ширина: расчет (100% - 50 пикселей); максимальная высота: расчет (100% - 50 пикселей); положение: фиксированное; верх: 50%; слева: 50%; -ms-transform: перевести (-50%, -50%); -webkit-transform: перевести (-50%, -50%); -moz-transform: перевести (-50%, -50%); -o-преобразование: перевести (-50%, -50%); преобразование: перевести (-50%, -50%); -webkit-фильтр: размытие (0); переполнение: скрыто; } - person Nateous; 27.10.2015
comment
Ответ maoosi раньше работал у меня, но, похоже, что-то изменилось, так как он больше не работает в последней версии Chrome? - person Amethi; 29.10.2016

Попробуй это

 ...{
zoom:2;
-webkit-transform: scale(0.5);
transform: scale(0.5);
}

Или для более точного подхода вы можете вызвать функцию javascript для пересчета матрицы преобразования, удалив десятичные значения матрицы. см.: https://stackoverflow.com/a/42256897/1834212

person Miguel    schedule 09.03.2016
comment
для меня только zoom: 1.005; работало хорошо. нет необходимости использовать scale - person Jithin Raj P R; 30.11.2018

Я столкнулся с этой проблемой при использовании плагина изотопов (http://isotope.metafizzy.co/index.html) в сочетании с плагином масштабирования (http://janne.aukia.com/zoomooz/). Я создал плагин jquery для обработки моего случая. Я закинул его в репозиторий github на случай, если кому-то это может пригодиться. - https://github.com/charleshimmer/jquery-hirestext.

person chuckles    schedule 11.09.2012

Я использовал javascript, чтобы переместить текст на 1 пиксель вверх, а затем через 100 мс вернуться на 1 пиксель вниз. Это почти незаметно и решило проблему полностью кросс-браузерно.

person Mixtelf    schedule 13.11.2015

body {
-webkit-font-smoothing: subpixel-antialiased;
}

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

Я думаю, что это проблема с пользовательскими шрифтами шрифта.

person placeboaddict    schedule 31.07.2012
comment
Учтите, что вы пытаетесь добавить сюда ценность, но предоставленный JS Fiddle не использует собственный шрифт, и -webkit-font-smoothing, похоже, не имеет никакого значения. Это работает для вас в Fiddle выше? - person phil; 09.08.2012
comment
сглаживание шрифтов с субпиксельным сглаживанием теперь используется по умолчанию в Chrome. - person posit labs; 29.01.2013

Webkit обрабатывает преобразованные 3D-элементы как текстуры, а не векторы, чтобы обеспечить аппаратное ускорение 3D.

Это не имеет к этому никакого отношения. Вы заметите, что проблема с алиасингом может быть решена путем добавления информации о длительности и направлении (например, 0,3 linear). У вас есть кобыла, пытающаяся отобразить все во время выполнения:

То же самое для выше ^

person Tom    schedule 30.01.2012
comment
Извини, Том, но я понятия не имею, о чем ты говоришь. Вы говорите о добавлении анимации? (Намерение состояло в том, чтобы просто масштабировать, а не анимировать что-либо.) Если вы измените оригинальный JS Fiddle, возможно, это поможет. - person phil; 09.02.2012
comment
Поскольку я использую переход, я добавил продолжительность и направление. Размытие все еще сохраняется. - person Quentin Engles; 22.08.2017