Атрибут usemap в HTML: что это и как использовать

Атрибут usemap (от английского use map, «использовать карту») подключает к картинке карту областей: клик по разным частям одной картинки ведёт на разные ссылки. Закрывающий тег для него не нужен: атрибут пишется внутри открывающего тега, например usemap="#m", а у самого <img> закрывающего тега нет.

Значение атрибута ссылается на карту: решётка и значение name тега <map>. Сами области описывают вложенные в карту теги <area>. Все результаты ниже я проверил в браузере, на котором я проверял.

HTML
<img src="map.png" alt="Схема" width="200" height="100"
  usemap="#m">

<map name="m">
  <area shape="rect" coords="0,0,100,50"
    href="/room-1" alt="Комната 1">
</map>

Что такое атрибут usemap в HTML и зачем он нужен

Это клиентская карта изображения: все области описаны прямо в разметке, поэтому серверу ничего считать не нужно. Браузер сам сравнивает точку клика с областями и открывает ссылку подходящей. Противоположность ей серверная карта, которую включает ismap: там координаты клика уходят на сервер.

Клиентская и серверная карта
СпособКто решает, куда вестиПример записи
usemapБраузер по областям area<img src="m.png" alt="" usemap="#m">
ismapСервер по координатам в адресе<a href="/go"><img src="m.png" alt="" ismap></a>

Для каких тегов работает usemap: img, а также object и input

Основное место атрибута это <img>. Свойство useMap я нашёл ещё у <object> и <input>, но это старые варианты, к современной вёрстке они не относятся. У <iframe>, <video>, <canvas>, <source>, <embed>, <map>, <area>, ссылки и SVG-элемента image свойства нет.

Теги, у которых есть usemap
ТегЧто можно сказатьПример записи
<img>Основной случай: картинка с кликабельными областями<img src="m.png" alt="" usemap="#m">
<object>Свойство есть, использовать для карт не рекомендую<object data="m.png" usemap="#m"></object>
<input>Свойство есть, это устаревший способ<input type="image" src="m.png" usemap="#m">

Как записать значение usemap: решётка и name карты

Значение должно начинаться с решётки, за которой идёт name карты, то есть значение одноимённого атрибута тега <map>. В браузере, на котором я проверял, получилось так.

Как читается значение usemap
ЗаписьЧто получилосьПример записи
#mКарта name="m" найдена<img usemap="#m">
m без решёткиКарта не найдена, клик ничего не открывает<img usemap="m">
#MДругой регистр: карта name="m" не найдена<img usemap="#M">
/page.html#mКарта найдена: важна часть после решётки<img usemap="/page.html#m">
#После решётки пусто: ничего не открывает<img usemap="#">
Карты с таким именем нетНичего не открывает<img usemap="#net">

Свойство useMap возвращает значение так, как оно записано: у usemap="m" вернётся "m", без исправлений.

Пример: какие значения usemap находят карту

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

Результат

Результат показывает ваш браузер через Navigation API. Если он не поддерживается, демонстрация об этом сообщит.

Как usemap связан с тегом map: name, id и порядок

Карту ищут по name, и тут есть детали, которые легко упустить.

Как браузер ищет карту
СитуацияЧто получилосьПример записи
У карты есть только nameНайдена<map name="m">
У карты есть только idНайдена и по id<map id="m">
name="m" и id="x"Для usemap="#m" найдена по name<map name="m" id="x">
Две карты с одним именемСработала первая по порядку в документе<map name="m"> ... <map name="m">
Карта до картинкиРаботает<map name="m"></map><img usemap="#m">
Карта после картинкиРаботает<img usemap="#m"><map name="m"></map>
Карта добавлена скриптом позжеРаботаетdocument.body.append(map);

Практический вывод: name карты должен быть уникальным и записанным в том же регистре, что в usemap. Лучше всегда писать name, как в примерах, а не только id.

Пример: где может находиться карта

Выберите вариант и кликните по закрашенному прямоугольнику в левом верхнем углу картинки.

Результат

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

Какие области описывает карта: коротко про area

Каждая область это тег <area> внутри карты. Форму областей задаёт shape, числа задаёт coords, адрес задаёт href, а текст для тех, кто не видит картинку, задаёт alt. Подробно о каждом из них в отдельных статьях справочника, а здесь достаточно одного примера.

HTML
<map name="m">
  <area shape="rect" coords="0,0,100,50"
    href="/room-1" alt="Комната 1">
</map>

Область rect задана двумя углами: левым верхним и правым нижним, в пикселях CSS от левого верхнего угла картинки. В моём замере область без href клика не принимала, а область с href и alt открывала ссылку.

Размер картинки и координаты областей

Это самое неприятное свойство клиентских карт. Координаты записаны в пикселях и сами не меняются, когда картинка меняет размер.

Я проверил: картинка 200 на 100 с областью на её левой верхней четверти была растянута стилями до 400 на 200. Область осталась прежней, и клик там, где теперь находится закрашенная часть, но за пределами старых координат, ничего не открыл. Последний вариант демонстрации выше показывает это на ваших глазах.

Что можно сделать. Если размер картинки задан жёстко, то ничего: координаты сходятся. Если картинка адаптивная, координаты нужно пересчитывать скриптом по отношению текущей ширины к исходной. Я проверил такой пересчёт на картинке, растянутой вдвое: после него клик по новой области сработал.

HTML
const img = document.querySelector('img');
const area = document.querySelector('area');
const base = [0, 0, 100, 50];
const k = img.clientWidth / 200;   // 200 - исходная ширина

area.coords = base.map(n => Math.round(n * k)).join(',');

Скрипт нужно запускать после загрузки картинки и при изменении размера окна.

Доступность карты: alt и порядок Tab

Карта изображения должна работать и без мыши. Я проверил две вещи.

Что проверено
ПроверкаЧто получилосьПример записи
Обход клавишей TabОбласти получают фокус по очереди, в порядке записи, а потом фокус идёт дальше<area href="/a" alt="A"><area href="/b" alt="B">
Текст областиНужен alt у каждой области, иначе ссылка не описана<area href="/a" alt="Комната 1">
Описание всей картинкиУ самого img тоже нужен alt<img usemap="#m" alt="Схема этажа">

О том, как это озвучивают программы чтения с экрана, я не проверял, поэтому здесь не пишу. Надёжный совет простой: дублируйте области обычными ссылками рядом с картинкой, чтобы навигация не зависела от карты.

Usemap и ismap на одной картинке

Серверная и клиентская карта вместе не складываются. В статье про ismap я проверил картинку внутри ссылки с обоими атрибутами.

Что побеждает при ismap и usemap
Куда кликнулиЧто получилосьПример записи
В область areaОткрылась ссылка области, координат нет<area shape="rect" coords="0,0,50,50" href="/area">
Мимо всех областейОткрылась внешняя ссылка a без координат<a href="/go"><img ismap usemap="#m"></a>

Оставьте один способ: для современной вёрстки это usemap.

Usemap в JavaScript: свойство useMap

В скрипте атрибут доступен как свойство useMap с большой буквой M. Запись в свойство меняет атрибут, а чтение возвращает значение без исправлений.

Как работает свойство useMap
ДействиеЧто получилосьПример записи
Чтение без атрибутаВернулась пустая строкаimg.useMap
Запись значенияАтрибут в разметке изменилсяimg.useMap = '#m'
Запись без решёткиАтрибут записан как есть, свойство вернуло то же значениеimg.useMap = 'm'
HTML
const img = new Image();
img.useMap = '#m';
img.src = 'map.png';

console.log(img.useMap);   // "#m"

Частые ошибки в usemap и шпаргалка

Большинство ошибок связано с записью значения и с масштабом картинки.

ОшибкаЧто происходитКак исправить
usemap="m"Без решётки карта не найденаПисать usemap="#m"
usemap="#M" при name="m"Регистр важен, карта не найденаСовпасть с именем буква в букву
Нет карты с таким именемКлик ничего не открываетДобавить map с нужным name
Две карты с одним именемРаботает только перваяДавать картам разные name
У карты только idНайдена, но надёжнее писать nameДобавить name
Область без hrefКлика нетДобавить адрес
Область без altСсылка не описана для тех, кто не видит картинкуПисать alt у каждой области
Картинка растягивается стилямиКоординаты остаются прежними, области смещаютсяПересчитать координаты скриптом
usemap и ismap вместеПри клике в область координаты не добавляютсяОставить usemap
usemap у iframe или videoТакого свойства нетИспользовать только у img
Только карта без обычных ссылокНавигация зависит от одной картинкиПродублировать ссылки рядом

Шпаргалка по атрибуту usemap

Атрибут usemap: что и как писать
ЗадачаКак записатьПример записи
Подключить картуРешётка и name карты<img usemap="#m">
Описать картуТег map с name<map name="m">
Добавить областьТег area с href и alt<area shape="rect" coords="0,0,50,25" href="/a" alt="A">
Адаптивная картинкаПересчитать coords скриптомarea.coords = ...
Прочитать значениеСвойство useMapimg.useMap
Не путатьismap отправляет координаты на сервер<img ismap>
Категория
Поделиться в социальных сетях

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

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

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

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×