Хлебные крошки на сайте: создание, SEO-оптимизация и примеры кода
#SEO #ТехSEO #Микроразметка (Schema.org)Для кого эта статья:
- Веб-разработчики и дизайнеры, заботящиеся о юзабилити и SEO своего сайта
- Специалисты по интернет-маркетингу и SEO, стремящиеся улучшить показатели своих ресурсов
- Владельцы и администраторы сайтов, желающие повысить вовлеченность пользователей и уменьшить показатели отказов
Хлебные крошки — это не просто красивое дополнение к дизайну сайта, а мощный инструмент навигации, значительно влияющий на конверсию и SEO-показатели.
#SEO #ТехSEO #Микроразметка (Schema.org)По данным Nielsen Norman Group, внедрение breadcrumbs повышает вовлеченность пользователей на 30% и снижает показатель отказов на 18%. 📊 Грамотно реализованные хлебные крошки становятся невидимым проводником, который помогает посетителям ориентироваться в структуре сайта, а поисковым системам — точнее индексировать контент. В этой статье я разложу по полочкам все аспекты создания эффективных breadcrumbs — от базового HTML до микроразметки и адаптивного дизайна.
Что такое хлебные крошки и их значение для навигации
Хлебные крошки (breadcrumbs) — это навигационный элемент интерфейса, который отображает путь пользователя от главной страницы к текущей. Название происходит из сказки о Гензеле и Гретель, где дети оставляли хлебные крошки, чтобы найти обратную дорогу домой — точно так же breadcrumbs помогают пользователям отслеживать своё положение на сайте.
Существует три основных типа хлебных крошек:
- Иерархические — показывают позицию страницы в структуре сайта (Главная > Каталог > Категория > Товар)
- Истории — отображают путь пользователя по сайту (Главная > Статья 1 > Статья 2)
- Атрибутивные — используются для фильтрации (Главная > Электроника > Смартфоны > Android)
Исследования показывают, что 94% пользователей ценят четкую навигацию выше всех других элементов дизайна. Хлебные крошки напрямую влияют на удобство использования сайта по нескольким причинам:
| Преимущество | Влияние на пользователя | Влияние на SEO |
|---|---|---|
| Снижение количества кликов | На 31% сокращает время поиска нужной информации | Уменьшает показатель отказов |
| Улучшение контекстного понимания | На 27% повышает понимание структуры сайта | Улучшает глубину просмотра |
| Предотвращение "тупиков" | На 24% снижает количество использований кнопки "Назад" | Повышает время на сайте |
| Визуальное восприятие структуры | На 18% повышает запоминаемость архитектуры сайта | Улучшает индексацию внутренних страниц |
Михаил Рудаков, Lead UX Designer
Мы работали над редизайном крупного интернет-магазина с каталогом из 50,000+ товаров. Глубина вложенности категорий достигала 6 уровней, и пользователи регулярно терялись, особенно при переходе из поисковика на страницу товара.
После внедрения иерархических хлебных крошек мы наблюдали невероятное преображение: среднее время сессии увеличилось на 42%, а глубина просмотра выросла на 3.7 страницы. Самым впечатляющим оказалось снижение показателя отказов на мобильных устройствах — с 68% до 39%!
Ключевым элементом успеха стала правильная микроразметка — после её внедрения CTR в поисковой выдаче вырос на 18.3%, а позиции сайта улучшились в среднем на 7 пунктов по высококонкурентным запросам.

Создание хлебных крошек: HTML, CSS и JavaScript решения
Приступим к практической реализации хлебных крошек на сайте. Начнём с базового HTML-кода и постепенно усложним его до полноценного интерактивного компонента. 🛠️
Базовая HTML-структура хлебных крошек выглядит так:
<nav aria-label="Breadcrumb">
<ol class="breadcrumbs">
<li><a href="/">Главная</a></li>
<li><a href="/catalog/">Каталог</a></li>
<li><a href="/catalog/electronics/">Электроника</a></li>
<li aria-current="page">Смартфоны</li>
</ol>
</nav>
Обратите внимание на атрибуты aria-label и aria-current. Они важны для обеспечения доступности (accessibility) вашего сайта. Применим CSS для создания привлекательного вида:
.breadcrumbs {
display: flex;
flex-wrap: wrap;
padding: 0;
margin: 0;
list-style: none;
}
.breadcrumbs li {
display: inline;
font-size: 14px;
}
.breadcrumbs li + li:before {
content: ">";
padding: 0 8px;
color: #ccc;
}
.breadcrumbs li a {
text-decoration: none;
color: #0275d8;
}
.breadcrumbs li a:hover {
text-decoration: underline;
color: #01447e;
}
.breadcrumbs li:last-child {
color: #6c757d;
}
Для динамического формирования хлебных крошек на основе структуры сайта можно использовать JavaScript:
function generateBreadcrumbs() {
const path = window.location.pathname.split('/').filter(Boolean);
let currentPath = '';
let breadcrumbsHTML = '<li><a href="/">Главная</a></li>';
path.forEach((segment, index) => {
currentPath += `/${segment}`;
if (index === path.length – 1) {
breadcrumbsHTML += `<li aria-current="page">${formatSegment(segment)}</li>`;
} else {
breadcrumbsHTML += `<li><a href="${currentPath}/">${formatSegment(segment)}</a></li>`;
}
});
document.querySelector('.breadcrumbs').innerHTML = breadcrumbsHTML;
}
function formatSegment(segment) {
return segment
.replace(/-/g, ' ')
.replace(/\b\w/g, l => l.toUpperCase());
}
document.addEventListener('DOMContentLoaded', generateBreadcrumbs);
При создании хлебных крошек важно учесть несколько ключевых аспектов:
- Используйте разделители, которые соответствуют стилю вашего сайта (>, /, →, |)
- Ограничивайте длину отдельных элементов для предотвращения переполнения на мобильных устройствах
- Обеспечьте достаточный контраст между текстом и фоном (соответствие WCAG)
- При необходимости добавьте функцию сокращения длинных путей (например, "Главная > ... > Текущая страница")
SEO-оптимизация breadcrumbs с помощью микроразметки
Алексей Соколов, SEO-специалист
Когда я начал работу с интернет-магазином строительных материалов, сайт имел плоскую структуру и практически не показывался в поиске по категорийным запросам. Хлебные крошки были на сайте, но реализованы без микроразметки — для Google и Яндекс они оставались невидимыми.
Мы внедрили микроразметку Schema.org для хлебных крошек, и результаты не заставили себя ждать. Уже через две недели в Google Search Console появились первые расширенные сниппеты с хлебными крошками, а через месяц CTR вырос в среднем на 14.7%.
Самым неожиданным эффектом стало улучшение ранжирования страниц категорий — они поднялись в среднем на 12 позиций по ключевым запросам. Поисковые системы стали лучше понимать иерархическую структуру сайта и давать больший вес нужным страницам.
Микроразметка превращает обычные хлебные крошки в ценный источник структурированных данных для поисковых систем. 🔍 Правильно размеченные breadcrumbs имеют следующие преимущества:
- Отображение структуры сайта в поисковой выдаче
- Улучшение CTR благодаря более информативным сниппетам
- Повышение понимания поисковыми системами иерархии контента
- Косвенное влияние на улучшение позиций в выдаче
Существует два основных подхода к разметке хлебных крошек: с использованием microdata (Schema.org) и JSON-LD. Рассмотрим оба варианта.
Вариант 1: Schema.org с использованием microdata:
<ol class="breadcrumbs" itemscope itemtype="https://schema.org/BreadcrumbList">
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a href="/" itemprop="item"><span itemprop="name">Главная</span></a>
<meta itemprop="position" content="1" />
</li>
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a href="/catalog/" itemprop="item"><span itemprop="name">Каталог</span></a>
<meta itemprop="position" content="2" />
</li>
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a href="/catalog/electronics/" itemprop="item"><span itemprop="name">Электроника</span></a>
<meta itemprop="position" content="3" />
</li>
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem" aria-current="page">
<span itemprop="name">Смартфоны</span>
<meta itemprop="position" content="4" />
</li>
</ol>
Вариант 2: JSON-LD разметка (рекомендуемый Google):
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Главная",
"item": "https://example.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Каталог",
"item": "https://example.com/catalog/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Электроника",
"item": "https://example.com/catalog/electronics/"
},
{
"@type": "ListItem",
"position": 4,
"name": "Смартфоны"
}
]
}
</script>
При реализации микроразметки хлебных крошек следует помнить о следующих нюансах:
| Ошибка в микроразметке | Потенциальное последствие | Рекомендуемое решение |
|---|---|---|
| Неправильная нумерация position | Хлебные крошки не отображаются в SERP | Последовательная нумерация, начиная с 1 |
| Отсутствие атрибута item для элементов | Неполная индексация структуры | Добавить полные URL для каждого уровня |
| Дублирование микроразметки | Конфликты в понимании структуры | Использовать один метод (microdata или JSON-LD) |
| Несоответствие видимых и размеченных крошек | Возможные санкции за обман поисковых систем | Синхронизировать видимую структуру с разметкой |
Для проверки правильности микроразметки используйте инструменты:
- Инструмент проверки структурированных данных Google
- Валидатор микроразметки Яндекс
- Schema.org Validator
- Rich Results Test от Google
Адаптация хлебных крошек под мобильные устройства
Мобильный трафик составляет более 60% всех посещений большинства сайтов, поэтому адаптация хлебных крошек для маленьких экранов — критически важная задача. 📱 На мобильных устройствах длинные цепочки breadcrumbs могут занимать слишком много места и выглядеть нечитаемыми.
Рассмотрим основные стратегии адаптации хлебных крошек:
- Сокращение длинных названий категорий
- Использование компактных разделителей
- Скрытие промежуточных уровней с возможностью их раскрытия
- Вертикальное расположение на самых узких экранах
- Использование иконок вместо текста для первых элементов
Пример адаптивного CSS для хлебных крошек:
.breadcrumbs {
display: flex;
flex-wrap: wrap;
padding: 8px 0;
margin: 0;
list-style: none;
}
.breadcrumbs li {
display: inline;
font-size: 14px;
max-width: 150px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* Иконка домашней страницы для экономии места */
.breadcrumbs li:first-child a:before {
content: "🏠";
margin-right: 5px;
}
/* Адаптация для мобильных устройств */
@media (max-width: 768px) {
.breadcrumbs li {
font-size: 12px;
max-width: 100px;
}
/* Сокращаем промежуточные элементы */
.breadcrumbs li:not(:first-child):not(:last-child):not(:nth-last-child(2)) {
display: none;
}
/* Добавляем многоточие для пропущенных элементов */
.breadcrumbs li:nth-last-child(2):before {
content: "... >";
padding: 0 8px;
color: #ccc;
}
}
/* Экстремально узкие экраны */
@media (max-width: 480px) {
.breadcrumbs {
flex-direction: column;
}
.breadcrumbs li {
max-width: 100%;
margin-bottom: 5px;
}
.breadcrumbs li + li:before {
content: "↳";
padding-right: 8px;
color: #ccc;
}
}
JavaScript-решение для динамического сокращения хлебных крошек на мобильных устройствах:
function adaptBreadcrumbs() {
const breadcrumbs = document.querySelectorAll('.breadcrumbs li');
const screenWidth = window.innerWidth;
// Возвращаем все элементы в видимое состояние
breadcrumbs.forEach(crumb => crumb.style.display = 'inline');
if (screenWidth < 768 && breadcrumbs.length > 4) {
// Показываем только первый, последний и предпоследний элементы
for (let i = 1; i < breadcrumbs.length – 2; i++) {
breadcrumbs[i].style.display = 'none';
}
// Добавляем многоточие
const ellipsis = document.createElement('li');
ellipsis.className = 'breadcrumb-ellipsis';
ellipsis.textContent = '...';
breadcrumbs[0].parentNode.insertBefore(ellipsis, breadcrumbs[breadcrumbs.length – 2]);
// Добавляем обработчик для раскрытия полного пути
ellipsis.addEventListener('click', () => {
breadcrumbs.forEach(crumb => crumb.style.display = 'inline');
ellipsis.remove();
});
}
}
window.addEventListener('resize', adaptBreadcrumbs);
document.addEventListener('DOMContentLoaded', adaptBreadcrumbs);
При создании мобильной версии хлебных крошек обратите внимание на следующие моменты:
- Обеспечьте достаточный размер для удобного нажатия (минимум 44×44px согласно рекомендациям WCAG)
- Учитывайте различные ориентации устройства (портретная/альбомная)
- Тестируйте на реальных устройствах, а не только в эмуляторах
- Используйте условную загрузку в зависимости от размера экрана для экономии трафика
Готовые примеры кода для разных CMS и фреймворков
Реализация хлебных крошек зависит от используемой CMS или фреймворка. Предлагаю готовые решения для наиболее популярных платформ. 🚀
WordPress:
// Функция для вывода хлебных крошек
function custom_breadcrumbs() {
echo '<nav aria-label="Breadcrumb">';
echo '<ol class="breadcrumbs" itemscope itemtype="https://schema.org/BreadcrumbList">';
// Главная страница
echo '<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">';
echo '<a href="' . home_url() . '" itemprop="item"><span itemprop="name">Главная</span></a>';
echo '<meta itemprop="position" content="1" /></li>';
if (is_category() || is_single()) {
// Категория
$categories = get_the_category();
if ($categories) {
$category = $categories[0];
echo '<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">';
echo '<a href="' . get_category_link($category->term_id) . '" itemprop="item">';
echo '<span itemprop="name">' . $category->name . '</span></a>';
echo '<meta itemprop="position" content="2" /></li>';
}
// Текущая статья/страница
if (is_single()) {
echo '<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem" aria-current="page">';
echo '<span itemprop="name">' . get_the_title() . '</span>';
echo '<meta itemprop="position" content="3" /></li>';
}
} else if (is_page()) {
// Если это вложенная страница
if ($post->post_parent) {
$parents = get_post_ancestors($post->ID);
$parents = array_reverse($parents);
$position = 2;
foreach ($parents as $parent) {
echo '<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">';
echo '<a href="' . get_permalink($parent) . '" itemprop="item">';
echo '<span itemprop="name">' . get_the_title($parent) . '</span></a>';
echo '<meta itemprop="position" content="' . $position . '" /></li>';
$position++;
}
}
// Текущая страница
echo '<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem" aria-current="page">';
echo '<span itemprop="name">' . get_the_title() . '</span>';
echo '<meta itemprop="position" content="' . $position . '" /></li>';
}
echo '</ol></nav>';
}
// Вставка в тему WordPress
// <?php custom_breadcrumbs(); ?>
React.js:
import React, { useEffect, useState } from 'react';
import { Link, useLocation } from 'react-router-dom';
import './Breadcrumbs.css';
const Breadcrumbs = ({ routes }) => {
const location = useLocation();
const [breadcrumbs, setBreadcrumbs] = useState([]);
useEffect(() => {
const pathnames = location.pathname.split('/').filter(x => x);
const breadcrumbsArray = [];
// Добавляем главную страницу
breadcrumbsArray.push({
name: 'Главная',
path: '/',
position: 1
});
// Формируем breadcrumbs на основе пути
let currentPath = '';
pathnames.forEach((path, index) => {
currentPath += `/${path}`;
// Ищем соответствующий маршрут для получения человекопонятного названия
const route = routes.find(r => r.path === currentPath);
breadcrumbsArray.push({
name: route ? route.name : path.charAt(0).toUpperCase() + path.slice(1),
path: currentPath,
position: index + 2
});
});
setBreadcrumbs(breadcrumbsArray);
}, [location, routes]);
if (breadcrumbs.length <= 1) return null;
return (
<nav aria-label="Breadcrumb">
<ol className="breadcrumbs" itemScope itemType="https://schema.org/BreadcrumbList">
{breadcrumbs.map((breadcrumb, index) => (
<li
key={breadcrumb.path}
itemProp="itemListElement"
itemScope
itemType="https://schema.org/ListItem"
aria-current={index === breadcrumbs.length – 1 ? "page" : undefined}
>
{index < breadcrumbs.length – 1 ? (
<Link to={breadcrumb.path} itemProp="item">
<span itemProp="name">{breadcrumb.name}</span>
</Link>
) : (
<span itemProp="name">{breadcrumb.name}</span>
)}
<meta itemProp="position" content={breadcrumb.position} />
</li>
))}
</ol>
</nav>
);
};
export default Breadcrumbs;
// Использование:
// <Breadcrumbs routes={[
// { path: '/', name: 'Главная' },
// { path: '/catalog', name: 'Каталог' },
// { path: '/catalog/electronics', name: 'Электроника' }
// ]} />
Vue.js:
<template>
<nav aria-label="Breadcrumb" v-if="crumbs.length > 1">
<ol class="breadcrumbs" itemscope itemtype="https://schema.org/BreadcrumbList">
<li
v-for="(crumb, index) in crumbs"
:key="crumb.path"
itemprop="itemListElement"
itemscope
itemtype="https://schema.org/ListItem"
:aria-current="index === crumbs.length – 1 ? 'page' : undefined"
>
<router-link
v-if="index < crumbs.length – 1"
:to="crumb.path"
itemprop="item"
>
<span itemprop="name">{{ crumb.name }}</span>
</router-link>
<span v-else itemprop="name">{{ crumb.name }}</span>
<meta itemprop="position" :content="index + 1" />
</li>
</ol>
</nav>
</template>
<script>
export default {
name: 'Breadcrumbs',
data() {
return {
crumbs: []
}
},
watch: {
$route() {
this.updateBreadcrumbs();
}
},
created() {
this.updateBreadcrumbs();
},
methods: {
updateBreadcrumbs() {
const pathArray = this.$route.path.split('/').filter(Boolean);
this.crumbs = [];
// Добавляем главную страницу
this.crumbs.push({
name: 'Главная',
path: '/'
});
// Добавляем промежуточные пути
let currentPath = '';
pathArray.forEach(segment => {
currentPath += `/${segment}`;
// Ищем маршрут, чтобы получить человекочитаемое название
const matchedRoute = this.$router.options.routes.find(
route => route.path === currentPath
);
this.crumbs.push({
name: matchedRoute ? matchedRoute.name : segment.charAt(0).toUpperCase() + segment.slice(1),
path: currentPath
});
});
}
}
}
</script>
<style scoped>
.breadcrumbs {
display: flex;
padding: 0;
margin: 0;
list-style: none;
}
.breadcrumbs li {
display: inline;
font-size: 14px;
}
.breadcrumbs li + li:before {
content: ">";
padding: 0 8px;
color: #ccc;
}
@media (max-width: 768px) {
.breadcrumbs li {
font-size: 12px;
}
}
</style>
Drupal:
/**
* Реализация hook_theme_suggestions_breadcrumb_alter().
*/
function mytheme_theme_suggestions_breadcrumb_alter(array &$suggestions, array $variables) {
$suggestions[] = 'breadcrumb__custom';
}
/**
* Создание шаблона breadcrumb--custom.html.twig
*/
{#
{% if breadcrumb %}
<nav aria-label="Breadcrumb">
<ol class="breadcrumbs" itemscope itemtype="https://schema.org/BreadcrumbList">
{% for item in breadcrumb %}
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"
{% if loop.last %}aria-current="page"{% endif %}>
{% if item.url and not loop.last %}
<a href="{{ item.url }}" itemprop="item">
<span itemprop="name">{{ item.text }}</span>
</a>
{% else %}
<span itemprop="name">{{ item.text }}</span>
{% endif %}
<meta itemprop="position" content="{{ loop.index }}" />
</li>
{% endfor %}
</ol>
</nav>
{% endif %}
#}
В дополнение к готовым решениям для CMS, предлагаю рассмотреть лучшие практики:
- Всегда тестируйте хлебные крошки после обновления CMS или фреймворка
- Используйте встроенные API для получения иерархии страниц — это снизит риск ошибок
- Кэшируйте хлебные крошки для повышения производительности, особенно на крупных сайтах
- Обеспечьте возможность переопределения автоматически сгенерированных путей для специфических страниц
- Интегрируйте аналитику для отслеживания использования хлебных крошек пользователями
Хлебные крошки — одновременно простой и мощный элемент навигации, который существенно улучшает пользовательский опыт и SEO-показатели сайта. Правильно реализованные breadcrumbs с микроразметкой не только помогают посетителям ориентироваться, но и предоставляют поисковым системам ценные сигналы о структуре вашего ресурса. Адаптивность под мобильные устройства обеспечивает универсальность этого компонента на любых экранах. Выберите подходящую реализацию для вашей платформы и сделайте навигацию интуитивной — это одна из самых эффективных SEO-инвестиций с минимальными затратами времени.
Пётр Гончаров
SEO-редактор