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

Атрибут ismap (от английского image map, «карта изображения») делает картинку серверной картой: при клике по ней браузер дописывает к адресу ссылки координаты клика, и сервер решает, куда вести читателя. Закрывающий тег для него не нужен: это булев атрибут, он пишется внутри открывающего тега, а у самого <img> закрывающего тега нет.

Способ старый, сейчас вместо него обычно используют клиентскую карту через usemap. Но атрибут остаётся в стандарте, и его поведение полезно знать. Все описанные ниже результаты я проверил в браузере, на котором я проверял.

HTML
<a href="/go">
  <img src="map.png" alt="Карта" width="200" height="100" ismap>
</a>

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

Обычно клик по картинке-ссылке ведёт на один адрес, куда бы вы ни нажали. С атрибутом ismap браузер добавляет к адресу позицию клика, например /go?50,30. Серверная программа читает эти числа и выбирает, какую страницу показать.

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

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

Для каких тегов работает ismap: только img внутри ссылки

Атрибут есть только у <img>, и действует он, лишь если картинка лежит внутри ссылки с адресом. Свойство isMap у <iframe>, <video>, <input>, <canvas>, <source>, <object>, <area> и у самой ссылки я не нашёл, как и у SVG-элемента image.

Где ismap работает, а где нет
РазметкаЧто получилосьПример записи
Картинка внутри ссылки с hrefКлик ведёт по ссылке с координатами<a href="/go"><img src="m.png" alt="" ismap></a>
Картинка без ссылкиКлик ничего не делает<img src="m.png" alt="" ismap>
Ссылка без hrefКлик ничего не делает<a><img src="m.png" alt="" ismap></a>
Картинка внутри кнопкиКоординат нет<button><img src="m.png" alt="" ismap></button>
<input> с типом imageСвой механизм: при отправке формы добавляются x и y<input type="image" src="m.png" alt="">

У <input> координаты уходят в форму как ?x=50&y=30 и без атрибута ismap. Это отдельная возможность, к серверной карте она не относится.

Как записать ismap: булев атрибут и свойство isMap

Атрибут булев: важно только то, есть он или нет. Значение браузер не читает, поэтому ismap="false" тоже включает его. Ниже результаты в браузере, на котором я проверял.

Что даёт каждая запись
ЗаписьСвойство img.isMapПример записи
ismaptrue<img ismap>
ismap=""true<img ismap="">
ismap="ismap"true<img ismap="ismap">
ismap="false"true: значение не читается<img ismap="false">
Атрибута нетfalse<img>

Из скрипта работает свойство isMap с большой буквой M. Запись true создаёт атрибут с пустым значением, запись false убирает его.

Пример: как записывается ismap

Выберите запись или действие и посмотрите, что стало с атрибутом и свойством.

Результат

Результат считает ваш браузер, он может отличаться от моих замеров.

Как браузер добавляет координаты к адресу

К адресу ссылки добавляется знак вопроса и два числа через запятую: сначала расстояние от левого края картинки, потом от верхнего. Это обычная запятая, а не пара x=...&y=..., как у формы.

Как считаются координаты
УсловиеЧто получилось при клике в точку 50, 30Пример записи
Картинка без отступовК адресу добавлено ?50,30<img ismap width="200" height="100">
Рамка 5px и padding 10pxОтсчёт идёт от внутреннего края картинки: ?35,15img { padding: 10px; border: 5px solid; }
Картинку растянули стилями до 400 на 200Координаты остались экранными: ?50,30img { width: 400px; height: 200px; }
Правый нижний пиксель картинки 200 на 100Получилось ?199,99<img ismap width="200" height="100">

Числа целые, их меряют в пикселях CSS, а не в пикселях файла. Если картинку показывают в другом размере, сервер получит экранные значения, и пересчитывать их придётся самому.

Пример: какой адрес получится при клике

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

Результат

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

Особенности: запрос в адресе, якорь и клавиатура

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

Что происходит в особых случаях
СитуацияЧто получилосьПример записи
В адресе уже есть запросКоординаты добавлены ещё одним знаком вопроса: /go?a=1?50,30<a href="/go?a=1">
В адресе есть якорьКоординаты оказались после якоря: /go#h?50,30, сервер их не получит<a href="/go#h">
Переход с клавиатуры (фокус и Enter)Координат нет, открывается обычный адрес<a id="a" href="/go">
Ссылка с targetКоординаты добавляются так же<a href="/go" target="_self">
Картинка внутри другого элемента ссылкиРаботает так же<a href="/go"><span><img ismap></span></a>

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

Ismap и usemap на одной картинке

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

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

Практический вывод: если картинка описана через <map> и <area>, атрибут ismap ей не нужен. Подробности клиентской карты в статьях про эти теги.

Как серверу прочитать координаты

На стороне сервера обработка одинакова для любого языка: из адреса берут строку запроса, делят её по запятой и получают два числа.

HTML
адрес:    /go?50,30
запрос:   "50,30"
x, y  =   запрос.split(",")   ->  50, 30

Дальше по этим числам сервер ищет, в какую область попал клик, и отправляет читателя на нужную страницу. Если своей серверной части у сайта нет, обработать такие координаты некому, и остаётся клиентская карта через usemap.

Частые ошибки в атрибуте ismap

Ошибки в основном связаны с тем, что атрибут путают с клиентской картой.

ОшибкаЧто происходитКак исправить
ismap без ссылки вокруг картинкиКлик ничего не делаетОбернуть картинку в a с href
Ссылка без hrefКлик ничего не делаетДобавить адрес ссылки
ismap="false"Атрибут всё равно включёнУбрать атрибут целиком
ismap="true" ради «правильной» записиЗначение не читается, достаточно словаПисать ismap без значения
Ждут пару x=50&y=30Приходит ?50,30Делить строку запроса по запятой
В адресе ссылки уже есть запросПолучается ?a=1?50,30Писать адрес без запроса
В адресе ссылки есть якорьКоординаты уходят после якоря и до сервера не доходятУбрать якорь из адреса
Считают координаты в пикселях файлаОни экранные и зависят от размера показаПересчитать с учётом реального размера
Рассчитывают на клавиатуруПереход без координатДать обычные ссылки рядом с картинкой
ismap и usemap вместеПри клике в область координаты не добавляютсяОставить один способ
ismap у input, iframe, videoУ этих тегов такого свойства нетИспользовать только у img

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

Всё главное из статьи в одной таблице.

Атрибут ismap: что и как писать
ЗадачаКак записатьПример записи
Серверная картаКартинка с ismap внутри ссылки<a href="/go"><img src="m.png" alt="" ismap></a>
Формат координатЧерез запятую после знака вопроса/go?50,30
Откуда отсчётВнутренний край картинки, пиксели CSS?35,15
ВыключитьУбрать атрибут<img src="m.png" alt="">
ПрочитатьСвойство isMapimg.isMap
Включить из скриптаЗаписать trueimg.isMap = true;
Клиентская картаАтрибут usemap и теги map, area<img usemap="#m">
Не путать с формойinput type="image" шлёт x и y?x=50&y=30
Категория
Поделиться в социальных сетях

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

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

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

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

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