Хлебные крошки на сайте: создание, SEO-оптимизация и примеры кода
Перейти

Хлебные крошки на сайте: создание, SEO-оптимизация и примеры кода

#SEO  #ТехSEO  #Микроразметка (Schema.org)  
Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Веб-разработчики и дизайнеры, заботящиеся о юзабилити и SEO своего сайта
  • Специалисты по интернет-маркетингу и SEO, стремящиеся улучшить показатели своих ресурсов
  • Владельцы и администраторы сайтов, желающие повысить вовлеченность пользователей и уменьшить показатели отказов

Хлебные крошки — это не просто красивое дополнение к дизайну сайта, а мощный инструмент навигации, значительно влияющий на конверсию и SEO-показатели.

#SEO  #ТехSEO  #Микроразметка (Schema.org)  
Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

По данным 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-структура хлебных крошек выглядит так:

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 для создания привлекательного вида:

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:

JS
Скопировать код
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:

HTML
Скопировать код
<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):

HTML
Скопировать код
<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 для хлебных крошек:

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-решение для динамического сокращения хлебных крошек на мобильных устройствах:

JS
Скопировать код
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:

php
Скопировать код
// Функция для вывода хлебных крошек
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:

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:

HTML
Скопировать код
<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:

php
Скопировать код
/**
* Реализация 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-инвестиций с минимальными затратами времени.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Что такое хлебные крошки на сайте?
1 / 5

Пётр Гончаров

SEO-редактор

Свежие материалы

Загрузка...