Это очень старый вопрос, но я возвращаюсь к нему, потому что у меня возникла эта проблема в разрабатываемом приложении, и я нашел все ответы здесь.
(Пропустить этот абзацдля TL; DR ...) Я использую веб-шрифт Gotham от cloud.typography.com, и у меня есть кнопки, которые начинаются пустым (с белой рамкой / текстом и прозрачным фоном) и приобретают цвет фонапри наведенииЯ обнаружил, что некоторые цвета фона, которые я использовал, плохо контрастировали с белым текстом, поэтому я хотел поменять текст на черный для этих кнопок, но - из-за визуального трюка или распространенных методов сглаживания - темныйтекст на светлом фоне всегда выглядит легче, чем белый текст на темном фоне.Я обнаружил, что увеличение веса с 400 до 500 для темного текста поддерживает почти такой же «визуальный» вес.Тем не менее, он увеличивал ширину кнопки на крошечную величину - долю пикселя - но этого было достаточно, чтобы кнопки слегка «дрожали», от чего я хотел избавиться.
Решение:
Очевидно, что это действительно сложная задача, поэтому для нее требовалось сложное решение.В конечном итоге я использовал отрицательный letter-spacing
для более смелого текста, как рекомендованный выше cgTag, но 1px был бы излишним, поэтому я просто рассчитал именно ту ширину, которая мне была бы нужна.
Изучив кнопку в Chrome devtools,Я обнаружил, что ширина моей кнопки по умолчанию составляет 165,47 пикселей, а при наведении - 165,69 пикселей, разница составляет 0,22 пикселей.У кнопки было 9 символов, так что:
0.22 / 9 = 0.024444px
Преобразовав это значение в em, я мог бы сделать настройку размера шрифта независимой.Моя кнопка использовала размер шрифта 16 пикселей, поэтому:
0.024444 / 16 = 0,001527em
Так что для моего конкретного шрифта следующий CSS сохраняет кнопки точно та же ширина при наведении:
.btn {
font-weight: 400;
}
.btn:hover {
font-weight: 500;
letter-spacing: -0.001527em;
}
После небольшого тестирования и использования приведенной выше формулы вы можете найти точно правильное значение letter-spacing
для вашей ситуации, и оно должно работать независимо от размера шрифта.
Единственное предостережение в том, что разные браузеры используют немного разные субпиксельные вычисления, поэтому, если вы стремитесь к этому уровню OCD с идеальной точностью до субпикселя, вам нужно будет повторить тестирование и установить другое значение длякаждый браузер. Стили CSS, ориентированные на браузер, обычно не одобряются , по понятной причине, но я думаю, что это один из вариантов использования, когда это единственный вариант, который имеет смысл.