Появляется Chrome Font Blurry

Это делает мои глаза!

отлично выглядит в IE и Firefox

enter image description here

Chrome (выше)

Запуск версии 39 из хрома, только появляется размытым в модальном поле, не имеет никакого значения, если я изменю семейство шрифтов.

Это CSS (для метки "Старт" ) браузер отображает следующие

box-sizing: border-box;
color: rgb(85, 85, 85);
cursor: default;
display: block;
float: left;
font-family: sans-serif;
font-size: 12px;
font-weight: 600;
height: 24px;
line-height: 17.142858505249px;
margin-bottom: 0px;
margin-top: 0px;
min-height: 1px;
padding-left: 15px;
padding-right: 15px;
padding-top: 7px;
position: relative;
text-align: right;
visibility: visible;
width: 89.65625px;

Это браузер или CSS?

- UPDATE ---

Ok выглядит как этот CSS

.md-modal {
    position: fixed;
    top: 50%;
    left: 50%;
    width: 50%;
    max-width: 630px;
    min-width: 320px;
    height: auto !important;
    z-index: 2000;
    visibility: hidden;
    -webkit-backface-visibility: hidden;
    -moz-backface-visibility: hidden;
    backface-visibility: hidden;
    -webkit-transform: translateX(-50%) translateY(-50%); <--- This line
    -moz-transform: translateX(-50%) translateY(-50%);
    -ms-transform: translateX(-50%) translateY(-50%);
    transform: translateX(-50%) translateY(-50%);
}

Однако, если я возьму его, мой модальный больше не центрирует?

Ответ 1

Я исправил эту проблему, вычитая 0.5px из значения оси Y. Таким образом вместо:

transform: translateX(-50%) translateY(-50%);

Я сделал это:

transform: translateX(-50%) translateY(calc(-50% - .5px));

Это разрешило это для меня, и я нахожу это более чистым решением, а затем упражняюсь в процентах или используя Javascript.

Ответ 2

Я испытал ту же проблему на хроме после применения преобразования translate к одному из моих элементов. Кажется, это ошибка на хроме. Единственное, что сработало для меня, это:

#the_element_that_you_applied_translate_to {
  -webkit-filter: blur(0.000001px);
}

Другое решение может превращать рендеринг гладких шрифтов:

#the_element_that_you_applied_translate_to {
  -webkit-font-smoothing: antialiased;
}

Ответ 3

Эта скрипка проверяет несколько разных решений:

Выход теста

CSS Output

Исправить 0

-webkit-transform: translateZ(0);
transform: translateZ(0);

Исправить 3

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

Ответ 4

Единственный правильный способ решить эту проблему:

Эта проблема возникает из-за использования значений% для выравнивания элементов div с использованием преобразований CSS. Это приводит к субпиксельным значениям в десятичном формате, которые ваш экран не может правильно отобразить. Решение состоит в том, чтобы нормализовать полученную матрицу преобразования.

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

Итак: матрица (1,0,0,1, -375, -451.5) станет матрицей (1,0,0,1, -375, -451)

Я вызываю этот метод перед.show() jquery... Или, может быть, только один раз в приложении (зависит от вашего случая), вам также может понадобиться вызвать его для события resize и т.д.

function roundCssTransformMatrix(element){
        var el = document.getElementById(element);
        el.style.transform=""; //resets the redifined matrix to allow recalculation, the original style should be defined in the class not inline.
        var mx = window.getComputedStyle(el, null); //gets the current computed style
        mx = mx.getPropertyValue("-webkit-transform") ||
             mx.getPropertyValue("-moz-transform") ||
             mx.getPropertyValue("-ms-transform") ||
             mx.getPropertyValue("-o-transform") ||
             mx.getPropertyValue("transform") || false;
        var values = mx.replace(/ |\(|\)|matrix/g,"").split(",");
        for(var v in values) { values[v]=v>4?Math.ceil(values[v]):values[v]; }

        $("#"+element).css({transform:"matrix("+values.join()+")"});

}

и назовите это

roundCssTransformMatrix("MyElementDivId");
$("#MyElementDivId").show();

Красиво, не правда ли?

Если вам нужно обновить размер, вы можете сделать это с:

$( window ).resize(function() {
  roundCssTransformMatrix("MyElementDivId");  
});

Чтобы это работало, все родительские элементы должны быть "выровнены/нормализованы", потому что если у вас, к примеру, осталось тело с x = 10.1px слева, а дочерний - 10px.. проблема не исчезнет, потому что у родителя есть остаточные десятичные дроби матрица Таким образом, вы должны применить эту функцию к каждому элементу, который является родительским и использует преобразование.

Вы можете увидеть этот живой скрипт здесь: https://jsbin.com/fobana/edit?html,css,js,output

Ответ 5

Спасибо за пример CSS. Кажется, что translateX(50%) и translateY(50%) вычисляют значение пикселя с десятичной точкой (например, 0.5px), которая вызывает субпиксельную визуализацию.

Есть много исправлений для этого, но если вы хотите сохранить качество текста, лучшим решением будет использовать -webkit-font-smoothing: subpixel-antialiased; на .md-modal, чтобы заставить состояние отображения для браузеров веб-китов, таких как Chrome и Safari.

Ответ 6

Я закончил это исправлением, удалив эти строки:

-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
backface-visibility: hidden;

Ответ 7

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

Проблема для меня заключалась в том, что у ребенка div были свойства width и height с комбинацией, которая вызвала проблему.

Как я изменил height для другого значения, он просто сработает!

Это, вероятно, связано с другими ответами, но я не хотел использовать JS или изменять свойство transform, чтобы исправить его.

Вот живой пример: JSFIDDLE

Ответ 8

Для модальных полей этот css поможет:

-webkit-transform: translate3d(-50%, -51%, 0);
-moz-transform: translate3d(-50%, -51%, 0);
transform: translate3d(-50%, -51%, 0);

Вместо того, чтобы поместить ось Y на 50%, сделайте ее 51%. Это помогает в моем cse. Если у вас другое расположение, поиграйте, но обычно 1% вверх/вниз фиксирует размытое содержимое.

Ответ 9

Если вы хотите что-то отцентрировать, лучше используйте flexbox. Это поможет вам позиционировать текст без размытия.

Добавьте это в родительский div того элемента, который вы хотите центрировать:

display: flex;
justify-content: center;
align-items: center;

Надеюсь, это поможет.

Ответ 10

Добавление перехода CSS к родительскому элементу родительского элемента моего размытого элемента (который использовал transformX, который вызывал размытость) фактически отменил оскорбительную размытость.

Ответ 11

Подобная проблема произошла для меня.

Я пытался всеми предлагаемыми методами ни один не работал нормально. Однако, наконец, я решил это. Так как есть проблема с Google Chrome, имеющим font-weight:600 или больше. Попробуйте изменить семейство шрифтов на семейство font-family:"Webly Sleek SemiBold","Helvetica";

Свойство font-weight будет работать нормально.

Blur_Font

Without_Blur

Ответ 12

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

Например, если вы хотите использовать как Лато, так и Робото, вы хотите включить больше, чем просто стандартный вес. Этот пример применяется, если вы используете Google Font API:

<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:400,900|Roboto:500,700">

Примечание: Lato доступен с шрифтами 100, 300, 400, 700 и 900, но мне пришлось указать 900, чтобы текст 700 стал четким... не знаю почему.

Ответ 13

На данный момент я нашел только одно хорошее решение:

transform: translate(-50%, -50.1%)

0,1% - обычно пользователь не может видеть это

Надеюсь, что хром исправит это - ошибка существует с 2014 года))))

Ответ 14

Если вы не хотите реализовывать какие-либо специальные js или нестандартные решения, и единственное, чего вы хотите добиться, это центрировать ваш div, а ширина и высота не имеют фиксированного размера, вы можете просто использовать это:

position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;

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

position: absolute;
left: 50%;
translate: transformX(-50%);
top: 0;
bottom: 0;
margin: auto;

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