Изменение шрифта-веса на полужирный - это нежелательное изменение ширины элемента
Во время создания панели навигации для моего сайта я решил сделать живую вкладку активной страницы яркой для удобства использования, но когда я изменяю элемент font-weight
на элементе, он лишь слегка увеличивает элемент, пример, который я сделал используя эффекты зависания, вместо этого демонстрирует мою проблему, и я никогда не знал, как ее решить.
http://jsfiddle.net/amx7E/
HTML
<ul id="mainNav">
<li class="navItem">
<a class="navLink" id="activeLink">Link 1</a>
</li>
<li class="navItem">
<a class="navLink">Link 2</a>
</li>
<li class="navItem">
<a class="navLink">Link 3</a>
</li>
</ul>
CSS
* {
font-family: Arial;
font-size: 14px;
list-style: none;
margin: 0;
padding: 0;
text-decoration: none;
}
#mainNav {
background: RGB(200, 230, 240);
border-bottom: 1px solid RGB(0, 0, 0);
height: 30px;
margin: 0 auto;
position: relative;
width: 100%;
}
.navItem {
display: block;
float: left;
position: relative;
}
.navItem:last-child .navLink {
border-right: 1px solid RGB(0, 0, 0);
}
.navLink {
border-bottom: 1px solid RGB(0, 0, 0);
border-left: 1px solid RGB(0, 0, 0);
display: inline-block;
height: 30px;
line-height: 30px;
padding: 0 15px;
white-space: nowrap;
}
.navItem:hover .navLink {
background: RGB(120, 200, 250);
color: RGB(255, 255, 255);
cursor: pointer;
font-weight: bold;
}
#activeLink {
background: RGB(90, 170, 220);
color: RGB(255, 255, 255);
font-weight: bold;
}
#activeLink:hover {
background: RGB(110, 190, 240);
}
.navItem:hover .subNav {
display: block;
}
Ответы
Ответ 1
Помимо маршрута width
здесь есть две другие возможности, это зависит от личных предпочтений относительно того, считаете ли вы их подходящими или нет. Обе эти идеи работают над одним и тем же принципом, что вы используете отдельный элемент для отображения жирного состояния, и этот элемент либо не имеет (идея один), либо (идея два) влияет на пользовательский интерфейс с его размерами.
http://jsfiddle.net/3Jyge/2/
Идея
Используйте псевдоселектора. Этот метод зависит от браузера, поддерживающего довольно недавние достижения, т.е. :before
и content: attr()
, поэтому, вероятно, пока не является надежным.
CSS
ul {
list-style: none;
}
ul li {
float: left;
}
ul li:hover a {
visibility: hidden;
}
ul li:hover:before {
position: absolute;
font-weight: bold;
content: attr('data-text');
}
Разметка
<ul>
<li data-text="one"><a href="#">one</a></li>
<li data-text="two"><a href="#">two</a></li>
<li data-text="three"><a href="#">three</a></li>
</ul>
Идея два
Другое немного более прямолинейное, хотя оно зависит от предварительной настройки вашей разметки first — и те, кто использует программы для чтения с экрана, могут явно не любить ваш сайт; если вы не найдете хороший способ скрыть от них дублирующийся текст.
Разметка:
<ul>
<li><a href="#">
<span class="a">one</span>
<span class="b">one</span>
</a></li>
<li><a href="#">
<span class="a">two</span>
<span class="b">two</span>
</a></li>
<li><a href="#">
<span class="a">three</span>
<span class="b">three</span>
</a></li>
</ul>
CSS
ul {
margin: 0; padding: 0;
list-style: none;
}
ul li {
float: left;
}
ul li a span.b {
visibility: hidden;
font-weight: bold;
}
ul li a span.a {
position: absolute;
}
ul li:hover a span.b {
visibility: visible;
}
ul li:hover a span.a {
visibility: hidden;
}
В конце дня лучшими решениями будут:
- Задайте ширину, хотя я понимаю, что не хочу этого делать.
- Используйте JavaScript для расчета измерений.
- Выберите другую подсветку, которая не изменяет размеры текста.
Ответ 2
То, как я обрабатываю это, - это использовать JQuery для "исправления" ширины, чтобы он не изменялся при наведении, даже если жирный шрифт меняется. Это в основном принимает ответ ширины css здесь и автоматизирует процесс.
(function($) {
$(function() {
$('#menu > li').each(function(){
wid = $(this).width();
$(this).css('width', wid+'px');
});
});
})(jQuery);
Ответ 3
Интересно, что никто не упоминает letter-spacing
.
Можно добавить расстояние между буквами к нормальному шрифту и удалить его для жирной версии.
Правильное решение не всегда возможно и сильно зависит от шрифта и font-size
. Но с большим количеством браузеров, начинающих принимать значения субпикселя для межстрочного интервала, он становится более практичным.
Пример:
.nav-link.active {
font-weight: bold;
/* Adjust for font-weight bold so that the text will still align */
letter-spacing: -1px;
}
Ответ 4
Поскольку вы не указываете ширину элементов, они имеют размер в соответствии с их содержимым. Таким образом, когда font-weight
normal
, элемент занимает меньше места, чем при bold
. По мере изменения размера контента размер окна также изменяется.
Вы можете указать ширину элемента, чтобы он немного больше, чем содержимое, или альтернативно использовать другой метод для идентификации активной активной вкладки.
Ответ 5
Альтернативой font-weight
для полужирного текста является использование text-shadow
, чтобы установить горизонтальную тень того же цвета, что и текст. Этот код устанавливает равные тени влево и вправо. С одной тенью текст будет смещаться в направлении тени.
CSS
a:hover {
text-shadow: .25px 0px .1px,
-.25px 0px .1px;
}
Обратите внимание, что веб-браузеры не отображают текст, не говоря уже о text-shadow
эффектах, одинаково. Вы должны проверить, как они выглядят в нескольких браузерах, прежде чем принимать решение о значениях.
Ответ 6
Если вы поместите атрибут width в свой .navItem класс, тогда ширина не будет изменена при наведении курсора.
.navItem {
display: block;
float: left;
position: relative;
**width:70px;** // this
}
Я обдумал скрипку. Пожалуйста, проверьте.
Ответ 7
Я думаю, что для этого нет основанного на CSS решения, если вы не можете добавить ширину, возможно, другую ширину для каждого элемента li.
У вас уже есть изменения в цвете bg при наведении и выбранных состояниях, я предлагаю вам отказаться от изменения шрифта. Визуально это не большое изменение, и с точки зрения удобства использования у вас уже есть изменение цвета bg, которое, как мне кажется, достаточно.
Ответ 8
Нет. Он изменит размер родительского div.
Я хотел бы процитировать ответ Квентина.
Шрифт является пропорциональным шрифтом, поэтому он становится толще (и занимает больше горизонтальное пространство), когда он выделен жирным шрифтом.
Найти дополнительную информацию здесь.
Ответ 9
Вот как я это сделал:
<ul id="header_menu">
<?php
$menu_items = array(array("Home", "/"),
array("About", "/about.html"),
array("Consumer Info", "consumer-info.html"),
array("News & Events", "news-events.html"),
array("Contact", "contact.html")
);
foreach($menu_items as $value)
{
// Find box width of text and add padding
$padding = 10;
$font-size = 12; // pt
list($left,, $right) = imageftbbox($font-size, 0, "fonts/OpenSans-Bold.ttf", $value[0]);
$width = ($right - $left) + ($padding * 2);
echo "<li><a style=\"width:" . ($width) . "px;\" href=\"" . $value[1] . "\">" . $value[0] . "</a></li>";
}
?>
</ul>