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

Размытый текст после использования CSS transform: scale(); в Chrome

Похоже, недавно появилось обновление для Google Chrome, которое вызывает размытый текст после выполнения transform: scale(). В частности, я делаю это:

@-webkit-keyframes bounceIn {
  0% {
    opacity: 0;
    -webkit-transform: scale(.3);
  }

  50% {
    opacity: 1;
    -webkit-transform: scale(1.05);
  }

  70% {
    -webkit-transform: scale(.9);
  }

  100% {
    -webkit-transform: scale(1);
  }
}

Если вы посещаете http://rourkery.com в Chrome, вы должны увидеть проблему в основной области текста. Он не использовал это, и это, похоже, не влияет на другие браузеры webkit (например, Safari). Были и другие сообщения о том, что люди сталкиваются с подобной проблемой с 3d-преобразованиями, но ничего не могут найти о преобразованиях 2d, подобных этому.

Любые идеи будут оценены, спасибо!

4b9b3361

Ответ 1

У меня есть эта проблема несколько раз, и, похоже, есть два способа ее устранения (показано ниже). Вы можете использовать любое из этих свойств для исправления рендеринга или обоих одновременно.

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

backface-visibility: hidden;

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

transform: translateZ(0);

Оба этих свойства исправляют проблему, которую вы имеете, но некоторые люди также хотели бы добавить

-webkit-font-smoothing: subpixel-antialiased;

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

Ответ 2

Чтобы улучшить размытость, особенно в Chrome попробуйте сделать следующее:

transform: perspective(1px) translateZ(0);
backface-visibility: hidden;

ОБНОВЛЕНИЕ: Перспектива добавляет расстояние между пользователем и плоскостью z, что технически масштабирует объект, делая размытость "постоянной". perspective(1px) выше похож на утку, потому что мы соответствуем размытости, которую пытаемся решить. Возможно, вам повезет больше с css ниже:

transform: translateZ(0);
backface-visibility: hidden;

Ответ 3

Я обнаружил, что корректировка коэффициента масштабирования помогла незначительно.

Использование scale(1.048) over (1.05), казалось, создало лучшее приближение к размеру всего пикселя, уменьшая размытие субпикселей.

Я также использовал translateZ(0), который, похоже, настраивает шаг окончательного округления Chrome в анимации преобразования. Это плюс для моего использования onhover, потому что это увеличивает скорость и уменьшает визуальный шум. Однако для функции onclick я бы не использовал ее, потому что преобразованный шрифт не выглядел таким хрустящим.

Ответ 4

Вместо

transform: scale(1.5);

используя

zoom : 150%;

исправляет проблему размытия текста в Chrome.

Ответ 5

Сандерлы привели меня к ответу. За исключением filter: scale не существует, но filter: blur делает.

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

backface-visibility: hidden;    
-webkit-filter: blur(0);

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

Ответ 6

Это должно быть ошибкой с Chrome (версия 56.0.2924.87), но ниже исправляется размытость для меня при изменении свойств css в консоли ('. 0'). Я сообщу об этом.

filter: blur(.0px)

Ответ 7

Попробовав все остальное здесь безуспешно, что окончательно исправило эту проблему для меня, удалив изменение will-change: transform; имущество. По какой-то причине это вызвало ужасно размытое масштабирование в Chrome, но не в Firefox.

Ответ 8

Я выяснил, что проблема имеет место при относительных преобразованиях. translateX (50%), масштаб (1.1) или что-то еще. при условии, что абсолютные значения всегда работают (не создает размытый текст()).

Ни одно из упомянутых здесь решений не работает, и я думаю, что пока нет решения (используя Chrome 62.0.3202.94, когда я пишу это).

В моем случае transform: translateY(-50%) translateX(-50%) вызывает размытие (я хочу центрировать диалог).

Чтобы достичь более "абсолютных" значений, мне пришлось установить десятичные значения в transform: translateY(-50.09%) translateX(-50.09%).

Примечание

Я уверен, что эти значения различаются по разным размерам экрана. Я просто хотел поделиться своим опытом, если это кому-то поможет.

Ответ 9

Попробуйте использовать zoom: 101%; для сложных конструкций, если вы не можете использовать комбинацию масштабирования и масштабирования.

Ответ 10

В моем случае следующий код вызвал размытый шрифт:

-webkit-transform: translate(-50%,-50%);
transform: translate(-50%,-50%);

и просто добавив свойство масштабирования, исправил его для меня. Играйте с масштабированием, после чего работали для меня:

zoom: 97%;   

Ответ 11

Еще одно исправление, которое я только что нашел для размытых преобразований (translate3d, scaleX) в Chrome, - установить элемент как " display: inline-table ;". Кажется, в некоторых случаях происходит принудительное округление пикселей (по оси X).

Я прочитал субпиксельное позиционирование под Chrome, и разработчики не исправят это.

Ответ 12

Добавление perspective(1px) сработало для меня.

transform: scale(1.005);

в

transform: scale(1.005) perspective(1px);

Ответ 14

Ничто из вышеперечисленного не помогло мне.

Это сработало, когда я добавил перспективу

то есть из

transform: translate3d(-10px,-20px,0) scale3d(0.7,0.7, 1)

я изменился на

transform: perspective(1px) translate3d(-10px,-20px,0) scale3d(0.7,0.7, 1)

Ответ 15

Я исправил свой случай, добавив:

transform: perspective(-1px)

Ответ 16

ДЛЯ ХОРМЫ:

Я перепробовал все предложения здесь. Но я не работаю. Мой колледж нашел отличное решение, которое работает лучше:

Вы НЕ должны масштабироваться выше 1,0

И включите translateZ(0) в режиме наведения, но НЕ в исходное положение.

Пример:

a {
    transition: all 500ms cubic-bezier(0.165, 0.840, 0.440, 1.000);
    transform: scale(0.8, 0.8);
}

a:hover {
    transform: translateZ(0)scale(1.0, 1.0);
}

Ответ 17

Я использовал комбинацию всех ответов, и вот что у меня получилось в итоге:

.modal .modal--transition {
  display: inline-table;
  transform: perspective(1px) scale(1) translateZ(0);
  backface-visibility: hidden;
  -webkit-font-smoothing: subpixel-antialiased;
}

Ответ 18

Для меня проблема заключалась в том, что мои элементы использовали transformStyle: preserve-3d. Я понял, что это действительно не нужно для приложения, и он устраняет его размытость.

Ответ 19

Никто из них не работал у меня. У меня была эта анимация для всплывающих окон:

@keyframes pulse {
  from {
    transform: scale3d(1, 1, 1);
  }
  50% {
    transform: scale3d(1.05, 1.05, 1.05);
  }
  to {
    transform: scale3d(1, 1, 1);
  }
}

В моем случае размытый эффект исчез после применения этого правила: -webkit-perspective: 1000;, хотя он отмечен как неиспользуемый в инспекторе Chrome.

Ответ 20

Я удалил это из своего кода - transform-style: preserve-3d; и добавили this- transform: perspective(1px) translateZ(0);

размытие ушло!

Ответ 21

В Chrome 74.0.3729.169, по состоянию на 5-25-19, похоже, нет исправления размытия, возникающего при определенных уровнях масштабирования браузера, вызванных преобразованием. Даже простой TransformY(50px) размывает элемент. Это не происходит в текущих версиях Firefox, Edge или Safari, и, похоже, не происходит при всех уровнях масштабирования.

Ответ 22

вы можете использовать css filter, чтобы исправить это.

.element {
    filter: blur(0);
}

о префиксе поставщика, сделайте это самостоятельно. -webkit-filter, -ms-filter. деталь здесь http://browser.colla.me/show/css_transformation_scale_cause_blurring

Ответ 23

Текст не будет размытым, если вы не transition transform.

Просто сделай это:

&:hover {
    transform: scale(1.1);
}

Без перехода, как transition: all.2s;

Ответ 24

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