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


126

Схоже, нещодавно оновлено 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, ви повинні побачити проблему в основній області тексту. Це раніше не робилося, і, схоже, це не впливає на інші веб-браузери (наприклад, Safari). Були ще деякі публікації про людей, які стикаються з подібною проблемою із 3D-перетвореннями, але нічого про подібні перетворення 2d не можна знайти.

Будь-які ідеї будуть вдячні, дякую!


Щойно відвідавши сайт за допомогою Firefox та IE 10, не бачите проблеми. Якщо він обмежений Chrome, вам може знадобитися зачекати, коли Google виправить це самостійно.
Нолонар

Я не бачу розмиття ... Я перебуваю на Chrome v25 / PC
vsync

Я вже стикався з цією проблемою раніше, оскільки Нолонар згадував, що нам доведеться чекати, коли Google виправить її.
raj_n

Це не рішення, але я помітив, що ця проблема виникає у мене лише тоді, коли я використовую CSS optimizeLegibility.
Bangkokian

Посилання розірвано.
Тимофій003

Відповіді:


78

У мене виникала ця проблема кілька разів, і, здається, є два способи її усунення (показано нижче). Ви можете використовувати будь-який з цих властивостей, щоб виправити візуалізацію, або обидва одночасно.

Прихована видимість задньої поверхні виправляє проблему, оскільки вона спрощує анімацію лише передньою частиною об'єкта, тоді як за замовчуванням - це передня та задня частина.

backface-visibility: hidden;

TranslateZ також працює, оскільки це хак додати апаратне прискорення до анімації.

transform: translateZ(0);

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

-webkit-font-smoothing: subpixel-antialiased;

їх анімовані на заперечення. Я вважаю, що це може змінити візуалізацію веб-шрифту, але сміливо експериментуйте і з цим методом.


12
Ці методи, схоже, покращують речі, але я все одно не можу досягти Chrome на тому рівні ясності, який я бачу у Firefox.
Майкл Мартін-Смукер

13
backface-visibility: hidden;Впевнений, працював у моєму випадку, вирішуючи якусь дивну розмиту причину руху шляхом переходу непрозорості, тобто. Дивний рух зараз відпав, але це зробило тексти в моєму діві назавжди розмитим.
ITWitch

14
Як @ykadaru запропонував, спробуйте додати perspective(1px)до свого transform:коду, це працювало для мене в Chrome, поки нічого іншого не вирішило проблему
Сергій Єремеєв,

4
Не працює на версії Chrome 65.0.3325.162 (Офіційна збірка) (64-розрядна), що працює в Ubuntu 17.10 із сеансом Gnome X11 (вимкнено Wayland)
Marecky

3
У веб-переглядачі Chrome 72 перші два варіанти тексту
розмиваються

24

Для поліпшення розмитості, особливо у Chrome спробуйте зробити це:

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

ОНОВЛЕННЯ: Перспектива додає відстань між користувачем і площиною z, яка технічно масштабує об'єкт, завдяки чому розмитість здається «постійною». Вище perspective(1px)сказане як качка-стрічка, оскільки ми відповідаємо розмитості, яку ми намагаємося вирішити. Можливо, вам пощастить із css нижче:

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

4
Для мене це насправді робить гірше.
balu

1
Для мене це виправляє глюк (без цього, елемент переміщається 1px після анімації буде зроблено, перетворення: перспективи (1px) в поодинці виправити це!)
Серджіу

@balu перевіри мою оновлену відповідь! позбудьтеся perspective(1px)власності та подивіться, чи працює він краще.
ykadaru

16

Я виявив, що коригування співвідношення масштабу трохи допомогло.

Використання scale(1.048)Over, (1.05)здавалося, генерує краще наближення до розміру шрифту в цілому пікселі, зменшуючи розмиття субпікселя.

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


1
Це єдиний підхід, який працював на мене. Інші підходи (видимість фонових зображень, додавання фільтрів, перспектива та хороший старий переклад Z) просто погіршили ситуацію. Спробуйте масштабувати цілі пікселі. Наприклад, перейдіть від 14 до 16 пікселів, використовуючи коефіцієнт масштабу 1,1429 (16/14).
hugo der hungrige

1
Працював для мене без translateZ(0), змінився просто 1.05на1.048
А.

15

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


Чому хтось спротив це? Я не розумію ... :( Це цілком дійсна проблема в деяких версіях хрому, і здається, що "зміниться" взагалі все ще досить нова і, мабуть, її не слід використовувати. Для отримання додаткової інформації дивіться greensock .com / will-change
Dan

Мав те саме питання. Дякуємо за публікацію
дощ

У мене була така ж проблема з рендерінгом матеріалів-дизайнерських компонентів на Chrome 75. Видалення стилю css "змінено" буде виправлено.
Роб

Підтверджено в Chrome 79
Fareesh Vijayarangam

1
Я маю навпаки, додавши will-change: transform;трохи виправляє питання
Якуб Завіслак

14

Замість

transform: scale(1.5);

використовуючи

zoom : 150%;

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


Це може допомогти, але також вводить інші питання, наприклад, іноді вводяться білі межі
Кевін

1
не впевнений, чому потік. Коли я застосував це до прапорців, це спрацювало набагато краще, ніж transform: scale ()
Брайан МакКал,

2
Для Firefox використовуйте transform: scale () працює як шарм без будь-якої розмитості. Вам доведеться працювати над виявленням браузера та діяти відповідно до chrome / safari та firefox.
Найшель Вердхан

15
Інша проблема полягає в тому, що масштабування, здається, не працює з властивістю переходу, тому його не можна використовувати для анімації CSS
ericgrosse

3
Це спрацьовує та розмиває річ розмитості, але також змінює положення елементів.
користувач1156544

8

Це має бути помилка з Chrome (версія 56.0.2924.87), але наведене нижче виправляє розмитість для мене при зміні властивостей css в консолі ('. 0'). Я повідомлю про це.

filter: blur(.0px)

1
Чи потрапили ви десь зі свого звіту про помилку?
Діазол

боюся, я навіть не згадую, куди я подав помилку. Хоча так і зробив.
andyw

Я використовую Bootstrap (4.4.1), Chrome (80.0.3987.132), Windows 10 (з переглядом масштабів на 125%), і в розкритому меню є розмиті тексти. Меню розташоване за допомогою, transform: translate3d();і це, мабуть, спричинить проблему. Жодне із запропонованих рішень не працювало для мене. За винятком / свого роду цього. Це працює лише в тому випадку, якщо я спершу встановлю його на якесь позитивне значення (наприклад, blur(0.1px)), а потім змінити на blur(0px). Оскільки елемент є динамічним, а також вимагає динамічного (JS) рішення, ... це смокче: \
akinuri

7

Сундери ведуть мене до відповіді. За винятком filter: scaleне існує, але є filter: blur.

Застосуйте наступні декларації до елементів, які здаються розмитими (у моєму випадку вони були всередині трансформованого елемента):

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

Це майже справно працювало. " Майже ", тому що я використовую перехід, і перебуваючи в переході, елементи не виглядають ідеально, але як тільки перехід зроблений, вони роблять.


-webkit-filter: blur(0);один працює на мене. backface-visibility: hidden;розмиває мій елемент, коли я скидаю масштаб згодом.
Кай Хартманн

це щось дивно для Chrome ... якщо я встановив, blur(0px);це не виправить. але якщо я це роблю, blur(1px);а потім натискаю клавішу зі стрілкою вниз, щоб blur(0px);вона виглядала правильно. Перейшов на оновлення сторінки / незалежно від того, що я пишу в CSS
Том Роджеро

1
@TomRoggero Це звучить менш специфічно для значення властивості розмиття і більше про те, коли зроблено перемальовування макета. Ви можете експериментувати примушуючи перемальовувати елемент за допомогою JavaScript після деякої затримки.
Гаджус

5

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

Жодне із згаданих рішень тут не працювало, і я думаю, що рішення ще не існує (використовуючи Chrome 62.0.3202.94, поки я це пишу).

У моєму випадку transform: translateY(-50%) translateX(-50%) спричиняє розмиття (я хочу відцентрувати діалогове вікно).

Щоб досягти трохи більше "абсолютних" значень, мені довелося встановити десяткові значення transform: translateY(-50.09%) translateX(-50.09%) .

ПРИМІТКА

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


Я біг до цього саме того питання, роблячи абсолютно те саме. Я зосереджував модальний варіант з translate3d (-50%, -50%, 0). У моєму випадку я зіткнувся з значеннями до -50,048%, і це виглядає ідеально.
Кріс


4

Додавання perspective(1px)працювало для мене.

transform: scale(1.005);

до

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

3

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


Зверніть увагу , що zoomне визначається який - або веб - стандарту і не підтримується FireFox caniuse.com/#feat=css-zoom
Boltgolt

3

У моєму випадку наступний код викликав розмитий шрифт:

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

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

zoom: 97%;   

4
Немає підтримки для Firefox дляzoom
Дастін Пуассан

3

Ще одне виправлення, яке я спробував щойно знайти для розмитих перетворень (translate3d, scaleX) на Chrome, - це встановити елемент як " display: inline-table ;". Здається, у певному випадку (на осі X) вимушене округлення пікселів.

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


3

Оновлення 2019 року
року Помилка відображення Chrome все ще не виправлена, і, хоча не винні меценати, жодна з пропозицій, запропонованих у цілому на цьому веб-сайті, не допомагає вирішити проблему. Я можу погодитися, що я пробував кожне з них даремно: лише 1 підходить, і це правило css: filter: blur (0); що виключає зсув контейнера на 1px, але не усуває помилку відображення самого контейнера та будь-якого вмісту, який він може мати.

Ось реальність: у цій буквально немає виправлення цієї проблеми, тому тут є розробка веб-сайтів

СЛУЧАЙ
В даний час я розробляю веб-сайт із флюїдом і маю 3 діви, усі в центрі яких мають ефект наведення курсору та обмін значеннями відсотків як по ширині, так і по позиції. Помилка Chrome виникає на центральному контейнері, який встановлено ліворуч: 50%; та перетворити: translateX (-50%); загальна обстановка.

ПРИКЛАД: Спочатку HTML ...

<div id="box1" class="box">
    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry"s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
</div>

<div id="box2" class="box">
    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry"s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
</div>

<div id="box3" class="box">
    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry"s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
</div>

Ось CSS, де відбувається помилка Chrome ...

*{margin:0; padding:0; border:0; outline:0; box-sizing:border-box;  background:#505050;}
.box {position:absolute; border:1px solid #fff; border-radius:10px; width:26%; background:#8e1515; padding:25px; top:20px; font-size:12pt; color:#fff; overflow:hidden; text-align:center; transition:0.5s ease-in-out;}
.box:hover {background:#191616;}
.box:active {background:#191616;}
.box:focus {background:#191616;}
#box1 {left:5%;}
#box2 {left:50%; transform:translateX(-50%);} /* Bugged */
#box3 {right:5%;}

Ось фіксований css ...

*{margin:0; padding:0; border:0; outline:0; box-sizing:border-box;  background:#505050;}
.box {position:absolute; border:1px solid #fff; border-radius:10px; width:26%; background:#8e1515; padding:25px; top:20px; font-size:12pt; color:#fff; overflow:hidden; text-align:center; transition:0.5s ease-in-out;}
.box:hover {background:#191616;}
.box:active {background:#191616;}
.box:focus {background:#191616;}
#box1 {left:5%;}
#box2 {left:37%;} /* Fixed */
#box3 {right:5%;}

Bugged скрипка: https://jsfiddle.net/m9bgrunx/2/
Fixed скрипка: https://jsfiddle.net/uoc6e2dm/2/

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


Розмитість , як очікується , при використанні перекладу, тому що елемент може в кінцевому підсумку на половину пікселя . Є в даний час кращі альтернативи для центрування речей: зразок Flexbox , сітка зразок
Timothy003

Єдиний браузер, який я перевірив, який, мабуть, має проблему з центром трансформації, - це Chrome, все інше здається кристально чистим. Я озирнувся назад, і це питання існує вже 7 років! Все ж існує маса способів зняти кота, і, як ви кажете, це більше навіть не потрібно.
SJacks

це неймовірно, але фільтр: blur (-0,1px); допомогли мені !!. як чорт це працює ??
jt3k

3

У мене така ж проблема. Я виправив це за допомогою:

.element {
  display: table
}

2
божевільний, але це працює; Chrome - це новий IE, мабуть
Артур

оооу, пане! працює! я здогадуюсь, що таблиця "виправити" де ширину в PX не дозволила шириною з
півпікселем

2

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

@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.


Він працює для мене, і він також позначений як невикористаний. Я також додав, will-change: transform;що виправляє розмиття меж елементів. Будь-які інші відповіді не спрацювали для мене.
Якуб Завіслак

2

Моє рішення було:

дисплей: початковий;

Тоді воно було хрустким гострим


1

Ніщо з перерахованого вище не працювало для мене.

Це спрацювало, коли я додав перспективи

тобто від

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

я змінився на

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


Додавання perspective(1px)насправді погіршило для мене :(
balu

1

Я виправив свою справу, додавши:

transform: perspective(-1px)

Це для мене щойно видалило scale()результат перетворення
jpenna

1

ДЛЯ ЧОРМУ:

Я спробував усі пропозиції тут. Але не вийшло. Мій коледж знайшов чудове рішення, яке працює краще:

НЕ МОЖЕТЕ масштабувати минулі 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);
}

1

Я використовував комбінацію всіх відповідей, і ось що, в кінцевому підсумку, спрацювало для мене:

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

1

Коли я стикався з розмитою проблемою з текстом у Chrome, але не в Firefox transform: translate(-50%,-50%).

Ну, я справді намагався багато способів подолати:

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

Жодне з них мені не працювало.

Нарешті, я зробив рівномірно висоту і ширину елемента. Це вирішило для мене питання !!!

Примітка. Це може залежати від випадку використання до випадку. Але неодмінно варто спробувати!


1

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

 transform-origin: 50% 50%;

ось цей

 transform-origin: 51% 51%;

це допомагає мені


0

Для мене проблема полягала в тому, що мої елементи використовували transformStyle: preserve-3d. Я зрозумів, що це насправді не потрібно додатку, і видалення його виправляє розмитість.


0

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

розмиття пішло!


0

У Chrome 74.0.3729.169, поточний станом на 5-25-19, здається, не існує жодного виправлення розмиття, яке виникає на певних рівнях масштабування браузера, викликаних перетворенням. Навіть простий TransformY(50px)розмиє елемент. Це не відбувається в поточних версіях Firefox, Edge або Safari, і, схоже, це не відбувається на всіх рівнях збільшення.


Це те, що трапилося з моїм. Я не можу позбутися цього ефекту розмивання. Одним із розроблених рішень є встановлення цих властивостей: top: 0, bottom: 0, left: 0; right: 0; margin: autoале тоді контейнер займе весь простір, який він може (він повинен бути шириною), тому це не працює в тому випадку, коли вміст повинен вирішити, яким буде великий контейнер.
kwiat1990

0

Це буде важко вирішити лише css.

Тому я вирішив це за допомогою jquery.

Це мій CSS.

.trY {
   top: 50%;
   transform: translateY(-50%);
}

.trX {
   left: 50%;
   transform: translateX(-50%);
}

.trXY {
   top: 50%;
   left: 50%;
   transform: translate(-50%, -50%);
}

і це мій jquery.

function tr_init() {
$(".trY, .trX, .trXY").each(function () {
    if ($(this).outerWidth() % 2 != 0) {
        var fixed_width = Math.ceil($(this).outerWidth() / 2) * 2;
        $(this).css("width", fixed_width);
    }
    if ($(this).outerHeight() % 2 != 0) {
        var fixed_height = Math.ceil($(this).outerHeight() / 2) * 2;
        $(this).css("height", fixed_height);
    }
})}

0

Просто додати магію виправлення, встановивши {border: 1px solid # ???} навколо погано виглядає об’єкта, вирішує проблему для мене. Якщо у вас стійкий колір фону, врахуйте і це. Це настільки німий, що ніхто не думав згадувати, мабуть, так.


-1

ви можете використовувати css, filterщоб виправити це.

.element {
    filter: blur(0);
}

про постачальник-префікс, будь ласка, зробіть це самостійно. -webkit-filter, -ms-filter. Докладніше тут http://browser.colla.me/show/css_transformation_scale_ why_blurring


Немає filter: scaleвідповідно до developer.mozilla.org/en/docs/Web/CSS/filter
Девід Блртон

Він повинен бути розмитим згідно з посиланням на URL у відповіді.
Сардок

-1

Текст не буде розмито , якщо ви не .transitiontransform

Просто зробіть це:

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

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

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