иконка discount

Скидка 15% по промокоду

кибер понедельник до 01.12иконка discount
CYBER2025
логотип PurpleSchool
логотип PurpleSchool

Атрибут href в HTML - подробное руководство для начинающих и практикующих разработчиков

Автор

Олег Марков

Введение

Атрибут href в HTML лежит в основе веб-навигации. Каждый раз, когда вы нажимаете на ссылку в браузере, скорее всего, срабатывает именно href. Через него вы задаете адрес ресурса, на который должен перейти пользователь, задать браузеру место внутри текущей страницы или даже запустить почтовый клиент.

Здесь вы разберете:

  • с какими тегами используется href;
  • какие бывают типы адресов (URL), которые можно указать в href;
  • чем отличаются абсолютные и относительные ссылки;
  • как работать с якорями и навигацией внутри страницы;
  • как использовать специальные протоколы вроде mailto, tel, ftp и других;
  • как href взаимодействует с SEO, безопасностью и доступностью.

Я буду опираться на практические примеры и каждый фрагмент кода сопровождать комментариями, чтобы вам было проще понять происходящее.

Где используется атрибут href

Основные элементы с href

Самый известный элемент, в котором применяется href, — это ссылка:

<a href="https://example.com">Перейти на сайт</a>
<!-- href указывает адрес ресурса, по которому должен перейти пользователь -->

Но не только тег ссылки может содержать href.

Тег a

Тег a (anchor) — основной "носитель" href.

<a href="/about">О компании</a>
<!-- Здесь мы создаем ссылку на страницу /about внутри текущего сайта -->

Без href тег a превращается в "псевдо-ссылку", которая по умолчанию не ведет никуда:

<a>Просто текст без ссылки</a>
<!-- Визуально браузер может стилизовать этот текст как обычный, без поведения ссылки -->

Тег link используется для подключения ресурсов к документу: CSS-стилей, иконок и других связей.

<link rel="stylesheet" href="styles.css">
<!-- href указывает путь к файлу таблицы стилей -->

Еще пример:

<link rel="icon" href="/favicon.ico">
<!-- href здесь указывает путь к иконке сайта -->

Тег area

area используется внутри карты изображений (image map) и тоже опирается на href:

<img src="plan.png" usemap="#office-map" alt="План офиса">

<map name="office-map">
  <area shape="rect" coords="10,10,100,100" href="/meeting-room" alt="Переговорная">
  <!-- href задает страницу, на которую попадает пользователь при клике по области -->
</map>

Как устроен href и что он принимает

С точки зрения стандарта

Атрибут href принимает URL (Uniform Resource Locator) — адрес ресурса. В общем виде:

scheme://host:port/path?query#fragment

Схему (scheme) вы видите в начале адреса — http, https, mailto, tel и так далее. href может содержать полный такой адрес, но нередко вы используете только часть (например, только путь или только фрагмент).

Абсолютные и относительные URL в href

Давайте разберемся, чем эти варианты отличаются.

Абсолютный URL

Абсолютный URL включает:

  • схему (http или https);
  • домен;
  • при необходимости порт, путь, параметры и фрагмент.
<a href="https://example.com/products/item1">Товар 1</a>
<!-- Полный адрес с протоколом и доменом -->

Плюсы:

  • ссылка работает одинаково с любого сайта;
  • явное указание домена, нет зависимости от контекста.

Минусы:

  • если домен или структура URL поменяются, придется обновлять ссылки;
  • менее гибко при переносе проекта между доменами.

Относительный URL

Относительный путь интерпретируется относительно текущего URL (или базового, о нем чуть позже).

<a href="/products/item1">Товар 1</a>
<!-- Путь относительно корня сайта -->

Другой пример:

<!-- Текущая страница: https://example.com/blog/2025/post.html -->
<a href="comments.html">Комментарии</a>
<!-- Реальный адрес: https://example.com/blog/2025/comments.html -->

Плюсы:

  • удобно при работе внутри одного сайта;
  • проще переносить сайт на другой домен;
  • часто короче и нагляднее.

Минусы:

  • зависит от текущего местоположения файла;
  • проще допустить логическую ошибку в структуре.

Виды относительных ссылок

1. Относительно текущей директории

<!-- На странице /docs/tutorials/index.html -->
<a href="intro.html">Введение</a>
<!-- Получится /docs/tutorials/intro.html -->

2. Относительно корня сайта

Когда путь начинается с "/", он считается от корня домена:

<a href="/contact">Контакты</a>
<!-- На любом уровне вложенности это укажет на /contact -->

3. Использование ..

Две точки означают "на уровень выше":

<!-- Текущий документ: /docs/tutorials/index.html -->
<a href="../index.html">К разделу Документация</a>
<!-- Получится /docs/index.html -->

Здесь я привожу немного более сложный пример, чтобы вы увидели, как это может выглядеть в реальном проекте:

<!-- Текущий документ: /projects/app/docs/guide/intro.html -->
<a href="../install.html">Установка</a>
<!-- Получится /projects/app/docs/guide/install.html -->

<a href="../../index.html">Главная документация</a>
<!-- Получится /projects/app/docs/index.html -->

Обратите внимание, насколько легко запутаться в количестве ../ при глубокой вложенности.

Специальное значение # и пустой href

Отдельного внимания заслуживают варианты, когда вы указываете фрагмент или оставляете href пустым.

href="#" — временная или "пустая" ссылка

Часто встречается такой код:

<a href="#">Кликни сюда</a>
<!-- Ссылка ведет на начало текущей страницы -->

Технически это ссылка на фрагмент # (начало документа). Это может вызвать "прыжок" страницы вверх при клике. В современных проектах вместо этого, если нужна "кнопка-обработчик", лучше использовать:

  • кнопку с тегом button;
  • или ссылку с href="javascript:void(0)" (но это менее предпочтительно);
  • или вообще не ставить href, а обрабатывать клик на JavaScript.

Вот пример более корректного подхода:

<button type="button" id="open-modal">
  Открыть окно
</button>
<!-- Здесь мы показываем, что элемент не ссылка, а кнопка действия -->

Пустой href

<a href="">Обновить страницу</a>
<!-- Считается ссылкой на текущий документ -->

При клике страница будет перезагружена, потому что браузер воспримет это как ссылку на тот же URL. Это уже осознанный эффект, если вы действительно хотите перезагрузку.

Фрагменты и якоря: href с

Теперь давайте посмотрим, как с помощью href реализуется прокрутка внутри одной страницы.

Как работает фрагмент (anchor)

Фрагмент — это часть адреса после символа #. Он не отправляется на сервер, а обрабатывается браузером. Пример:

<a href="#features">Перейти к разделу Особенности</a>
<!-- Браузер прокрутит страницу к элементу с id="features" -->

<section id="features">
  <h2>Особенности</h2>
  <!-- Содержимое раздела -->
</section>

Смотрите, что здесь происходит:

  • ссылка содержит href="#features";
  • браузер ищет элемент с атрибутом id="features";
  • если находит, прокручивает страницу так, чтобы этот элемент стал видимым.

Внутренние и внешние якоря

Внутри одной страницы

Простейший и самый частый случай:

<a href="#top">Наверх</a>

<!-- Где-то в начале документа -->
<div id="top"></div>
<!-- Этот элемент станет "якорем" -->

Якорь на другой странице

Вы можете не только прокручивать текущую страницу, но и переходить на определенное место на другом URL:

<a href="/docs/faq.html#payments">Перейти к разделу Оплата</a>
<!-- Сначала откроется /docs/faq.html, затем прокрутится до id="payments" -->

Важно: целевая страница должна содержать элемент с нужным id:

<h2 id="payments">Оплата</h2>
<!-- Именно сюда "прыгает" браузер -->

Комбинация с параметрами

Фрагмент спокойно сочетается с query-параметрами:

<a href="/search?query=html#results">
  Результаты поиска
</a>
<!-- Сначала отрабатывают параметры, затем браузер обрабатывает фрагмент #results -->

Специальные схемы (mailto, tel, и другие)

href может использовать не только http/https. Давайте разберем популярные схемы, которые часто встречаются в проектах.

mailto для отправки писем

Схема mailto открывает почтовый клиент пользователя с уже подставленным адресом и, при желании, темой и телом письма.

<a href="mailto:support@example.com">Написать в поддержку</a>
<!-- При клике откроется установленный почтовый клиент с полем Кому -->

Теперь давайте посмотрим пример с предзаполненной темой и текстом:

<a href="mailto:support@example.com?subject=Вопрос по заказу&body=Здравствуйте, у меня вопрос по заказу 12345">
  Написать по поводу заказа
</a>
<!-- subject и body передаются как параметры URL -->

Комментарий:

  • пробелы и спецсимволы в subject и body должны быть закодированы (URL-encoded);
  • на практике вы будете подготавливать такие строки программно, особенно если тема зависит от данных.

Пример с кодировкой:

<a href="mailto:support@example.com?subject=Вопрос%20по%20заказу&body=Здравствуйте%2C%20у%20меня%20вопрос%20по%20заказу%2012345">
  Написать по поводу заказа
</a>
<!-- Здесь пробелы заменены на %20, запятая на %2C -->

tel для звонков

tel используется для вызова телефонного приложения, особенно на мобильных устройствах.

<a href="tel:+74951234567">Позвонить нам</a>
<!-- На смартфоне откроется экран дозвона с этим номером -->

Рекомендации:

  • используйте международный формат номера (с + и кодом страны);
  • в href убирайте пробелы и дефисы, чтобы избежать проблем с распознаванием.

Например:

<a href="tel:+380501234567">+38 050 123-45-67</a>
<!-- В тексте можно оставить форматированный номер, но в href лучше использовать "чистый" -->

Другие схемы, которые вы можете встретить

Иногда вы можете столкнуться и с другими схемами:

  • ftp:// — доступ к файлам по FTP;
  • skype: или sip: — звонки или сообщения через VoIP-клиенты;
  • file:// — доступ к локальной файловой системе (в браузере обычно ограничен).

Пример:

<a href="ftp://example.com/files/report.pdf">Скачать отчет по FTP</a>
<!-- Браузер или FTP-клиент попробуют открыть этот ресурс по FTP -->

Используйте такие схемы осознанно, понимая, что поведение сильно зависит от настроек браузера и системы пользователя.

href и атрибут target

Атрибут target не относится напрямую к href, но сильно влияет на поведение ссылки. Давайте на коротком примере посмотрим, как они работают в паре.

<a href="https://example.com" target="_blank">
  Открыть в новой вкладке
</a>
<!-- href задает адрес, target говорит открыть его в новой вкладке -->

Частые значения target:

  • _self — открыть в текущем окне (по умолчанию);
  • _blank — открыть в новой вкладке/окне;
  • _parent, _top — используются с фреймами.

Если вы открываете внешние ссылки в новой вкладке, обычно вместе с target="_blank" добавляют rel="noopener noreferrer" по соображениям безопасности.

<a href="https://external-site.com"
   target="_blank"
   rel="noopener noreferrer">
  Перейти на внешний сайт
</a>
<!-- rel снижает риск атак через доступ к window.opener -->

href и тег base — как изменить "точку отсчета"

Иногда вам нужно задать общую базу для всех относительных ссылок на странице. Для этого существует тег base, который размещается внутри head.

<head>
  <base href="https://docs.example.com/v2/">
  <!-- Все относительные href теперь считаются от этого URL -->
</head>

<body>
  <a href="intro.html">Введение</a>
  <!-- Реальный адрес: https://docs.example.com/v2/intro.html -->
</body>

Обратите внимание:

  • base влияет на ВСЕ относительные URL на странице, не только href у ссылок;
  • использовать base стоит осторожно, чтобы не запутать себя и других разработчиков;
  • на одной странице может быть только один тег base.

Если base указан, ссылка:

<a href="/guide.html">Руководство</a>

по-прежнему будет считаться от корня домена (так работает ведущий слеш), а вот

<a href="guide.html">Руководство</a>

уже относительно base.

Использование href в связке с JavaScript

Интерцепция переходов

Часто нужно повесить обработчик на ссылку и, например, открыть модальное окно вместо перехода по href. Покажу вам, как это реализовано на практике.

<a href="/login" id="login-link">Войти</a>

<script>
// Находим ссылку по id
const loginLink = document.getElementById('login-link');

loginLink.addEventListener('click', function (event) {
  event.preventDefault(); // Отменяем переход по ссылке
  // Здесь мы могли бы открыть модальное окно авторизации
  console.log('Открываем модальное окно авторизации вместо перехода');
});
</script>

Комментарий:

  • href по-прежнему указывается, чтобы без JavaScript ссылка вела себя корректно;
  • при включенном JS вы можете переопределить поведение.

Это важный принцип прогрессивного улучшения: href задает базовое поведение, а JS может его улучшать.

Чтение и изменение href через JS

<a href="/profile" id="profile-link">Профиль</a>

<script>
// Получаем ссылку
const profileLink = document.getElementById('profile-link');

// Читаем текущий href (полный URL)
console.log(profileLink.href); // Например https://example.com/profile

// Меняем адрес ссылки
profileLink.href = '/profile/settings';
// Теперь клик по ссылке приведет на /profile/settings
</script>

Комментарии:

  • свойство element.href возвращает полный URL (с учетом домена);
  • при присвоении вы можете использовать как относительный, так и абсолютный путь.

Когда использовать href="javascript:..."

Раньше было популярно:

<a href="javascript:openModal()">Открыть окно</a>
<!-- При клике вызывается JS-функция -->

Сейчас такой подход считается плохой практикой:

  • логика смешивается с разметкой;
  • хуже читаемость и поддерживаемость;
  • сложнее отлаживать и тестировать.

Гораздо аккуратнее повесить обработчик через addEventListener, как мы делали выше, а href использовать для "нормального" адреса или вообще оставить пустым, если это действительно не ссылка.

href, доступность и SEO

Роль href для доступности (a11y)

Для пользователей, которые пользуются экранными читателями или навигацией с клавиатуры, корректные ссылки с href — ключевой элемент ориентации на сайте.

Рекомендации:

  • не делайте "ссылки без href" там, где реально нужен переход;
  • текст ссылки должен отражать суть назначения, а не быть "кликните здесь";
  • чтобы добавить контекста, можно использовать атрибут aria-label.

Пример:

<a href="/pricing" aria-label="Тарифы и цены на услуги">
  Цены
</a>
<!-- aria-label объясняет назначение ссылки более полно -->

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

href и SEO

Поисковые системы используют ссылки с href для обхода сайта и понимания структуры.

Некоторые моменты:

  • внутренние ссылки помогают поисковику находить и переиндексировать страницы;
  • текст ссылки (anchor text) влияет на то, как поисковик понимает связанный контент;
  • ссылки без href (например, с обработчиками JS) обычно не учитываются как стандартные ссылки.

Простой пример внутренней перелинковки:

<p>
  Подробнее о возможностях сервиса читайте в разделе
  <a href="/features">Функциональность</a>.
</p>
<!-- Здесь мы даем поисковику и пользователю понятный анкор -->

Если вы используете относительные или абсолютные URL — для SEO это не принципиально, важно, чтобы конечный адрес был стабильным и корректным.

Подключение CSS файлов

Тег link с href — основной способ подключать внешние стили.

<link rel="stylesheet" href="/assets/css/main.css">
<!-- href указывает путь к CSS файлу -->

Комментарии:

  • лучше указывать относительные пути относительно корня или base;
  • браузеры кэшируют CSS по URL, поэтому стабильный href важен для производительности.

Подключение иконок сайта

<link rel="icon" href="/favicon.ico" type="image/x-icon">
<!-- Здесь href задает путь к файлу иконки -->

Вы можете подключать разные иконки для разных устройств:

<link rel="apple-touch-icon" href="/icons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/icons/favicon-32x32.png">

Частые ошибки и анти-паттерны при работе с href

Ошибка 1: Использование # вместо кнопки

<a href="#" onclick="doSomething()">Сделать что-то</a>
<!-- При клике страница может дергаться вверх, если JS не отработает или отключен -->

Лучший вариант:

<button type="button" onclick="doSomething()">
  Сделать что-то
</button>
<!-- Это действие, а не переход, поэтому кнопка логичнее -->

Ошибка 2: Отсутствие href там, где нужна ссылка

<a class="link" onclick="goToProfile()">Профиль</a>
<!-- Для пользователя с отключенным JS эта ссылка вообще не работает -->

Исправленный вариант:

<a href="/profile" class="link">Профиль</a>
<!-- Базовое поведение - переход по ссылке -->
<script>
// Дополнительно можно улучшить поведение через JS
</script>

Ошибка 3: Некорректное смешение относительных путей

Например, на странице /blog/2025/january/ вы пишете:

<a href="post.html">Статья</a>
<!-- Это приведет на /blog/2025/january/post.html -->

А вы рассчитывали на /blog/post.html. Здесь правильнее:

<a href="/blog/post.html">Статья</a>
<!-- Путь от корня сайта -->

Ошибка 4: Проблемы с кодировкой в mailto

<a href="mailto:info@example.com?subject=Вопрос по оплате">
  Написать
</a>
<!-- Некодированные пробелы и кириллица могут некорректно обработаться -->

Лучше подготовить строку с кодировкой:

<a href="mailto:info@example.com?subject=%D0%92%D0%BE%D0%BF%D1%80%D0%BE%D1%81%20%D0%BF%D0%BE%20%D0%BE%D0%BF%D0%BB%D0%B0%D1%82%D0%B5">
  Написать
</a>
<!-- Здесь тема письма закодирована в UTF-8 и URL-encoded -->

На практике это обычно делает сервер или JavaScript.

Заключение

Атрибут href — один из базовых инструментов HTML, который определяет, куда и как пользователь будет перемещаться по сайту и за его пределами. Через href вы задаете:

  • переходы на другие страницы и сайты;
  • перемещение внутри одной страницы с помощью якорей;
  • открытие почтовых клиентов, звонков и других приложений;
  • подключение внешних ресурсов в теге link;
  • более сложные сценарии навигации, которые можно дополнять JavaScript.

Ключевые моменты, которые стоит помнить:

  • отличайте абсолютные и относительные ссылки и выбирайте их исходя из архитектуры проекта;
  • используйте якоря (фрагменты) для удобной навигации по длинным страницам;
  • внимательно относитесь к схемам mailto и tel, корректно кодируйте параметры;
  • не подменяйте семантику: ссылки с href — для переходов, кнопки — для действий;
  • само наличие href важно для доступности и SEO.

Если вы будете относиться к href не как к "просто атрибуту со строкой", а как к механизму навигации со своими правилами и особенностями, структура и поведение ваших веб-приложений станут очевиднее и для пользователей, и для разработчиков.

Частозадаваемые технические вопросы

Как сделать ссылку, которая скачивает файл, а не открывает его в браузере

Вы можете использовать атрибут download вместе с href:

<a href="/files/report.pdf" download="report-2025.pdf">
  Скачать отчет
</a>
<!-- download подсказывает браузеру сохранить файл вместо открытия -->

Комментарии:

  • download работает только для того же домена (без специальных настроек CORS);
  • вы можете задать имя файла в download или оставить пустым.

Как сделать относительную ссылку на "одну директорию выше" от корня

Если вы хотите ссылку на страницу "на уровень выше" относительно текущего пути, используйте ..:

<!-- На странице /docs/guide/intro.html -->
<a href="../index.html">К разделу Документация</a>

Если нужно именно "от корня", а не от текущей директории, задайте путь от корня:

<a href="/docs/index.html">К разделу Документация</a>

Как правильно сформировать href с несколькими query-параметрами

Параметры пишутся после ?, разделяются &:

<a href="/search?query=html&sort=date&order=desc">
  Найти статьи по HTML
</a>
<!-- Каждый параметр - пара ключ=значение, значения следует URL-кодировать -->

Если значение содержит пробелы или спецсимволы, кодируйте его (например, через encodeURIComponent в JS).

Как сделать ссылку на конкретное место в PDF или другом документе

Стандартно браузеры не поддерживают навигацию к фрагментам внутри PDF по id как в HTML, но вы можете использовать встроенные параметры вьюера, если они есть. Например, для PDF в некоторых браузерах и вьюерах:

<a href="/docs/manual.pdf#page=5">
  Открыть руководство на 5 странице
</a>

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

Как отключить переход по ссылке в отдельных случаях (например, по условию)

Вы можете проверять условие в обработчике клика и вызывать preventDefault:

<a href="/pay" id="pay-link">Оплатить</a>

<script>
document.getElementById('pay-link').addEventListener('click', function (event) {
  const isFormValid = false; // Здесь вы проверяете реальное условие

  if (!isFormValid) {
    event.preventDefault(); // Блокируем переход
    alert('Сначала заполните все обязательные поля');
  }
});
</script>

Так вы сохраняете корректный href для случаев без JavaScript, но в интерактивном сценарии контролируете поведение.

Стрелочка влевоАтрибут rel в HTML - полное практическое руководствоАтрибут download в HTMLСтрелочка вправо

Постройте личный план изучения Html до уровня Middle — бесплатно!

Html — часть карты развития Frontend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Все гайды по Html

Тег section в HTML - семантическая разметка структуры страницыТег nav в HTML - полное руководство по семантической навигацииТег main в HTML - подробное руководство по использованиюТег header в HTML - полное практическое руководствоТег footer в HTML - назначение семантика и практические примерыТег figure в HTML - как правильно оформлять иллюстрации и подписиТег figcaption в HTML - подробное руководство с примерамиТег aside в HTML - назначение правильная семантика и примеры
Текстовая область HTML textarea - практическое руководствоВыпадающий список HTML select - полное руководство для разработчиковОпция списка HTML option - как работает и как правильно использоватьАтрибут method в HTML - как правильно отправлять данные формыЗаголовок группы HTML legend - как правильно использовать и оформлятьТег input в HTML - типы атрибуты валидация и примерыТег формы form в HTMLГруппа полей HTML fieldsetАтрибут action в HTML - как правильно задавать адрес отправки формы
Открыть базу знаний

Лучшие курсы по теме

изображение курса

HTML и CSS

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.9
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий