Skip to content

Стилизация хлебных крошек на CSS3

Привет, друзья. Навигация в виде «хлебных крошек» помогает посетителям сайта ориентироваться в иерархической структуре документов и находить путь на верхний уровень. Сегодня хотел бы затронуть проблему стилизации хлебных крошек. Потому что многие варианты оформления имеют некоторые неудобства.

Проблема и ее решение

Проблема большинства хлебных крошек, основанных на CSS3, в том, что «стрелки» у ссылок делаются с помощью границ. Это не удобно тем, что:

  • Эффекты наведения не прекрасны — при на ведении на ссылку, его треугольник превращается в квадрат. Наведение/клик на треугольник может спровоцировать события на следующей/предыдущей ссылке;
  • Вы не можете использовать градиенты на границах. Это означает, что вы застряли с плоскими цветными цепочками;
  • Вы не можете анимировать ссылки со стрелками используя CSS3 переходы.

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

Но позиционирование повернутых квадратов является трудоемкой задачей, так как размеры выходят из-под контроля. Поэтому мы используем несколько уменьшенные  повернутые квадраты, но они займут нужную нам высоту. Приступим!

HTML

Скелет наших хлебных крошек состоит из ссылок, которые расположены в одном контейнере. Еще мы будем использовать скрипт Prefix-Free для того, чтобы не писать префиксы браузеров, как мы это недавно делали в уроке про «резиновые» прайс листы.

<div class="breadcrumb">
<a href="#" class="active">Browse</a>
<a href="#">Compare</a>
<a href="#">Order Confirmation</a>
<a href="#">Checkout</a>
</div>
<script src="prefixfree.min.js" type="text/javascript" type="text/javascript"></script>

CSS

1. Простой сброс и основные стили

* {margin: 0; padding: 0;}

html, body {min-height: 100%;}

body {
text-align: center;
padding-top: 100px;
background: #689976;
background: linear-gradient(#689976, #ACDACC);
font-family: 'Myriad Pro', arial, verdana;
}

.breadcrumb {
display: inline-block;
box-shadow: 0 0 15px 1px rgba(0, 0, 0, 0.35);
overflow: hidden;
border-radius: 5px;
counter-reset: flag;
}

.breadcrumb a {
text-decoration: none;
outline: none;
display: block;
float: left;
font-size: 12px;
line-height: 36px;
color: white;
padding: 0 10px 0 60px;
background: #666;
background: linear-gradient(#666, #333);
position: relative;
}

Для .breadcrumb мы добавили свойство counter-reset: flag, чтобы добавить цифры для каждой ссылки с помощью CSS счетчиков. flag — это имя счетчика.

Для каждой «крошки» мы добавили побольше отступа слева для размещения номера.

2. Стили для первой и последней ссылки + эффект при наведении

.breadcrumb a:first-child {
padding-left: 46px;
border-radius: 5px 0 0 5px;
}
.breadcrumb a:first-child:before {
left: 14px;
}
.breadcrumb a:last-child {
border-radius: 0 5px 5px 0;
padding-right: 20px;
}

/*hover/active styles*/
.breadcrumb a.active, .breadcrumb a:hover{
background: #333;
background: linear-gradient(#333, #000);
}
.breadcrumb a.active:after, .breadcrumb a:hover:after {
background: #333;
background: linear-gradient(135deg, #333, #000);
}

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

При наведении или для активной ссылки изменили цвет фона. Еще мы использовали в селекторе псевдокласс :after, не догадываетесь зачем?! Ладно отвечу, что мы с его помощью и добавим треугольную стрелку в конце.

3. Стрелка для «крошек»

.breadcrumb a:after {
content: '';
position: absolute;
top: 0;
right: -18px;
width: 36px;
height: 36px;
transform: scale(0.707) rotate(45deg);
z-index: 1;
background: #666;
background: linear-gradient(135deg, #666, #333);
box-shadow: 2px -2px 0 2px rgba(0, 0, 0, 0.4), 3px -3px 0 2px rgba(255, 255, 255, 0.1);
border-radius: 0 5px 0 50px;
}
/*Не показываем треугольник для последней ссылки*/
.breadcrumb a:last-child:after {
content: none;
}

Ширина и высота нашего квадрата (основы треугольника) равна 36 пикселям, как и свойство line-height для ссылки. Чтобы спрятать половину, мы его перенесли вправо на половину длины -18 пикселей.

После поворота квадрата на 45 градусов гипотенуза треугольника будет больше высоты нашей ссылки. Нам надо ее уменьшить до высоты ссылки. Пусть длина квадрата будет 1, тогда по теореме Пифагора:

гипотенуза = (1?2 + 1?2)?0.5 = 1.414

Теперь найдем отношение высоты ссылки к длине гипотенузы, чтобы узнать, насколько надо уменьшить квадрат:

1/1.414 = 0.707

4. Номер у ссылки

.breadcrumb a:before {
content: counter(flag);
counter-increment: flag;
border-radius: 100%;
width: 20px;
height: 20px;
line-height: 20px;
margin: 8px 0;
position: absolute;
top: 0;
left: 30px;
background: #444;
background: linear-gradient(#444, #222);
font-weight: bold;
}

Еще один пример

До этого мы использовали вариант с использованием градиента в фоне ссылки. Но если у вас дизайн сайта в стили Metro, тогда предыдущий пример вам не подойдет. Я сделал еще один пример с плоскими цветами, который впишется в такой дизайн.

Добавьте блоку .breadcrumb еще один класс flat и добавьте такие стили:

.flat a, .flat a:after {
background: white;
color: black;
transition: all 0.5s;
}
.flat a:before {
background: white;
box-shadow: 0 0 0 1px #ccc;
}
.flat a:hover, .flat a.active,
.flat a:hover:after, .flat a.active:after{
background: #9EEB62;
}

Заключение

На этом урок завершен. Думаю не я один поражен применением теоремы Пифагора на практике :-D. А то многие думают, что многое из курса школы никогда не пригодится.