У меня есть горизонтальное меню навигации, которое, по сути, представляет собой просто элемент <ul>
с рядом расположенных рядом элементов. Я не определяю ширину, а просто использую отступы, потому что я бы хотел, чтобы ширина определялась шириной пункта меню. Я выделил выделенный в данный момент элемент жирным шрифтом.
Проблема в том, что при выделении жирным шрифтом слово становится немного шире, что приводит к небольшому смещению остальных элементов влево или вправо. Есть ли хитрый способ предотвратить это? Что-то вроде указания обивке игнорировать лишнюю ширину, вызванную полужирным шрифтом? Моей первой мыслью было просто вычесть несколько пикселей из заполнения «активного» элемента, но это количество варьируется.
Если возможно, я бы хотел избежать установки статической ширины для каждой записи, а затем центрирования, в отличие от решения для заполнения, которое у меня есть в настоящее время, чтобы упростить будущие изменения записей.
Ответы:
У меня была та же проблема, но я получил аналогичный эффект с небольшим компромиссом, вместо этого я использовал text-shadow.
Вот рабочий пример:
пример jsfiddle
источник
li:hover {text-shadow: 1px 0 0 black;}
привело к тексту с слишком маленьким интервалом между буквами. Чтобы еще раз улучшить это, мы также установилиli {letter-spacing: 1px;}
-0.5px 0 #fff, 0.5px 0 #fff
, потому что мы могли видеть небольшой промежуток между самим текстом и тенью. А также, когда текст выделен жирным шрифтом, он добавляет веса обеим сторонам.Лучшее рабочее решение с использованием :: after
HTML
CSS
Он добавляет невидимый псевдоэлемент с шириной полужирного текста, полученный по
title
атрибуту.text-shadow
Решение выглядит неестественно на Mac и не использует всю красоту , что текст рендеринга на Mac предложений .. :)http://jsfiddle.net/85LbG/
Кредит: https://stackoverflow.com/a/20249560/5061744
источник
margin-top
к::after
блоку решило эту проблему.Самым портативным и визуально приятным решением будет использование
text-shadow
. Это пересматривает и показывает примеры ответа Торгейра с использованием Alexxali и моих собственных настроек:Это помещает крошечные «тени» в черный цвет (используйте название цвета / код вашего шрифта вместо,
black
если необходимо) с обеих сторон каждой буквы, используя единицы, которые будут правильно масштабироваться с рендерингом шрифта.Посмотреть на себя:
Наведите указатель мыши на отображаемые строки, чтобы увидеть, чем они отличаются от стандартного текста.
Измените уровень масштабирования вашего браузера ( Ctrl+ +и Ctrl+ -), чтобы увидеть, как они меняются.
Я добавил здесь два других решения для сравнения: трюк с интервалом между буквами @ cgTag , который работает не так хорошо, поскольку предполагает угадывание диапазонов ширины шрифта, и трюк @ workaholic_gangster911 :: after рисования , который оставляет неудобное дополнительное пространство, поэтому жирный текст может расширяться без подталкивания соседних текстовых элементов (я помещаю атрибуцию после полужирного текста, чтобы вы могли видеть, как он не перемещается).
В будущем у нас будет больше вариативных шрифтов, способных изменять качество шрифта с помощью
font-variation-settings
. Поддержка браузеров растет (Chrome 63+, Firefox 62+), но для этого по-прежнему требуется больше, чем просто стандартные шрифты, и лишь немногие существующие шрифты поддерживают его.Если вы встроите переменный шрифт, вы сможете использовать CSS следующим образом:
В Mozilla Variable Fonts Guide есть живая демонстрация с ползунком для работы с различными классами. Во введении Google в вариативные шрифты в Интернете есть анимированный GIF-файл, демонстрирующий переключение между высокой и нулевой оценкой:
источник
Я обнаружил, что большинство шрифтов имеют одинаковый размер, когда вы регулируете расстояние между буквами на 1 пиксель.
Хотя это меняет обычный шрифт, так что каждая буква имеет дополнительный интервал пикселей. Заголовки меню настолько короткие, что это не проблема.
источник
0.98px
или меньшие дроби.1px
относительные значения, такие как0.025ex
или0.0125ex
. Смотрите мой ответ для живой демонстрации.Для более актуального ответа вы можете использовать
-webkit-text-stroke-width
:Это позволяет избежать любых псевдоэлементов (что является плюсом для программ чтения с экрана) и текстовых теней (которые выглядят беспорядочно и все же могут создавать небольшой эффект «прыжка») или установки любой фиксированной ширины (что может быть непрактично).
Он также позволяет вам сделать элемент более жирным, чем 1 пиксель (теоретически вы можете сделать шрифт настолько полужирным, насколько захотите, а также может быть дрянной тренировкой для создания жирной версии шрифта, у которого нет полужирного вариант, например, пользовательские шрифты ( редактирование: переменные шрифты обесценивают это предложение ). Хотя этого следует избегать, поскольку он, вероятно, сделает некоторые шрифты царапающими и неровными)
Я определенно работает в Edge, Firefox, Chrome и Opera (на момент публикации) и в Safari ( отредактируйте: @Lars Blumberg, спасибо за подтверждение ). Он НЕ работает в IE11 или ниже.
Также обратите внимание, что он использует
-webkit
префикс, поэтому он не является стандартным, и поддержка может быть прекращена в будущем, поэтому не полагайтесь на это жирным шрифтом, это действительно важно - лучше избегать этого метода, если он не является чисто эстетическим.источник
К сожалению, единственный способ избежать изменения ширины, когда текст выделен жирным шрифтом, - это определить ширину элемента списка, однако, как вы заявили, выполнение этого вручную занимает много времени и не масштабируется.
Единственное, что я могу придумать, - это использовать некоторый javascript, который вычисляет ширину вкладки до того, как она будет выделена жирным шрифтом, а затем применяет ширину, в то же время, когда требуется жирный шрифт (либо при наведении курсора, либо при нажатии).
источник
Используйте JavaScript, чтобы установить фиксированную ширину li на основе содержимого без жирного шрифта, затем выделите содержимое жирным шрифтом, применив стиль к
<a>
тегу (или добавьте диапазон, если у<li>
него нет дочерних элементов ).источник
Это очень старый вопрос, но я возвращаюсь к нему, потому что у меня была эта проблема в приложении, которое я разрабатываю, и я нашел здесь все необходимые ответы.
(Пропустите этот абзац для 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,024444 пикселей
Преобразуя это в em-единицы, я мог сделать настройку независимой от размера шрифта. Моя кнопка использовала размер шрифта 16 пикселей, поэтому:
0,024444 / 16 = 0,001527эм
Итак, для моего конкретного шрифта следующий CSS сохраняет кнопки точно такой же ширины при наведении курсора:
Пройдя небольшое тестирование и используя приведенную выше формулу, вы сможете найти именно то
letter-spacing
значение, которое подходит для вашей ситуации, и оно должно работать независимо от размера шрифта.Единственное предостережение заключается в том, что разные браузеры используют несколько разные вычисления субпикселей, поэтому, если вы стремитесь к этому уровню OCD с точностью до субпикселей, вам нужно будет повторить тестирование и установить разные значения для каждого браузера. Стили CSS, ориентированные на браузер, обычно не одобряются по уважительной причине, но я думаю, что это один из вариантов использования, когда это единственный вариант, который имеет смысл.
источник
Интересный вопрос. Я полагаю, вы используете float, верно?
Что ж, я не знаю какой-либо техники, которую вы можете использовать, чтобы избавиться от этого увеличения шрифта, поэтому они будут пытаться соответствовать минимальной требуемой ширине - и изменение толщины шрифта изменит это значение.
Я знаю уникальное решение, позволяющее избежать этого изменения, - это то, о чем вы сказали, что не хотите: установка фиксированных размеров на li.
источник
Вы можете реализовать это, например, на сайте amazon.com в контекстном меню «Покупки по отделам». Он использует широкий div. Вы можете создать широкий div и скрыть его правую часть
источник
ОБНОВЛЕНИЕ: пришлось использовать тег B для заголовка, потому что в IE11 псевдокласс i: after не отображался, когда у меня была видимость: скрытый.
В моем случае я хочу выровнять (специально разработанный) флажок ввода / радио с текстом метки, где текст выделяется жирным шрифтом, когда ввод отмечен.
Предлагаемое здесь решение не сработало для меня в Chrome. Вертикальное выравнивание input и label было испорчено из-за: after psuedo class и -margins не исправили это.
Вот исправление, при котором у вас не возникает проблем с вертикальным выравниванием.
источник