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

Атрибут coords (от английского coordinates, «координаты») задаёт место и размер области на картинке, у которой есть клиентская карта: прямоугольник, круг или многоугольник. Закрывающий тег для него не нужен: атрибут пишется внутри открывающего тега <area>, а сам area закрывающего тега не имеет.

Это строка из чисел в пикселях. Сколько чисел нужно и что они значат, зависит от формы области. Все результаты ниже я проверил в браузере, на котором я проверял, кликая по настоящим областям.

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

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

Карта изображения делит картинку на кликабельные части. Каждая часть это <area> внутри <map>, а coords объясняет браузеру, где именно эта часть находится. Без него область есть, но занимать ей нечего. Саму карту к картинке подключает usemap.

Числа отсчитываются от левого верхнего угла картинки: сначала по горизонтали (x), потом по вертикали (y).

Для каких тегов работает coords: area и устаревший a

Всерьёз coords нужен только тегу <area>. Свойство с таким названием есть ещё у ссылки a, но это наследие старых версий HTML, и на поведение страницы оно не влияет. У <img>, <map>, <iframe>, <input>, <object>, <link> и SVG-элемента image свойства нет.

Теги, у которых есть coords
ТегЧто можно сказатьПример записи
<area>Основной случай: описывает область на картинке<area shape="rect" coords="0,0,50,25" href="/a" alt="A">
<a>Свойство есть, это устаревший вариант<a href="/a" coords="0,0,50,25">

Какие числа записывать для rect, circle, poly и default

Число значений зависит от формы, которую задаёт shape. Ниже то, что я проверил кликами.

Что записывать в coords для каждой формы
ФормаЧто в coordsПример записи
rectЧетыре числа: левый верхний и правый нижний углыcoords="50,20,150,80"
circleТри числа: центр и радиусcoords="100,50,30"
polyПары чисел: вершины по порядку, вершин не меньше трёхcoords="100,10,180,90,20,90"
defaultНе нужен: область занимает всю картинку<area shape="default" href="/a" alt="A">

Две подробности. Если shape не указан, область читается как прямоугольник. В моём замере то же случилось и при неверном значении, например shape="foo". А значение default заняло всю картинку, даже когда я записал для него coords: числа были проигнорированы.

Пример: как выглядят области разных форм

Выберите форму и кликайте по картинке: внутри закрашенной фигуры ссылка открывается, снаружи нет.

Результат

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

Как записывать числа: разделители, дроби и ошибки

Браузер разбирает строку снисходительно. Я попробовал разные записи одного и того же прямоугольника 50, 20, 150, 80, проверяя клик по десяткам точек картинки.

Что считается верной записью
ЗаписьЧто получилосьПример записи
Через запятуюОбласть обычнаяcoords="50,20,150,80"
Запятая и пробелОбласть обычнаяcoords="50, 20, 150, 80"
Только пробелыОбласть обычнаяcoords="50 20 150 80"
Точки с запятойОбласть обычнаяcoords="50;20;150;80"
Запятая в концеОбласть обычнаяcoords="50,20,150,80,"
Дробные числаОбласть обычнаяcoords="50.5,20.5,150.5,80.5"
Углы в обратном порядкеОбласть заняла то же местоcoords="150,20,50,80"
Отрицательные числаОбласть обрезана границей картинкиcoords="-50,-20,100,50"
ПроцентыЗнак процента отброшен, числа считались пикселямиcoords="25%,20%,75%,80%"
Буква вместо числаБуква считалась нулёмcoords="a,20,150,80"

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

Пример: какие записи coords принимает браузер

Выберите запись, кликните в центр картинки, потом у края. Пунктиром показан обычный прямоугольник 50, 20, 150, 80.

Результат

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

Сколько чисел нужно и что при лишних или нехватке

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

Что при неверном количестве чисел
ЗаписьЧто получилосьПример записи
rect, три числаОбласти нет, клик ничего не открываетcoords="50,20,150"
rect, пять чиселПятое число проигнорированоcoords="50,20,150,80,10"
circle, два числаОбласти нетcoords="100,50"
circle, четыре числаИспользованы первые триcoords="100,50,30,5"
circle, радиус 0 или отрицательныйОбласти нетcoords="100,50,0"
poly, нечётное количество чиселПоследнее число отбрасывается; из пяти чисел остаются две вершины, области нетcoords="100,10,180,90,20"
poly, две вершиныОбласти нетcoords="10,10,190,90"
coords не записан у rectОбласти нет<area shape="rect" href="/a" alt="A">

Надёжный вариант для poly: чётное количество чисел и не меньше трёх вершин.

Откуда отсчёт, в чём единицы и что с масштабом

Числа это пиксели CSS, а нулевая точка находится в левом верхнем углу картинки. Я проверил три случая.

Как отсчитываются координаты
УсловиеЧто получилосьПример записи
Картинка с рамкой и paddingНулевая точка осталась в наружном углу картинки: область не сдвинулась внутрьimg { padding: 10px; border: 5px solid; }
Картинку растянули стилями вдвоеЧисла остались прежними, область не растянуласьimg { width: 400px; }
Область выходит за край картинкиОбрезается границей картинкиcoords="-50,-20,100,50"

Про рамку и padding здесь надо обратить внимание: в статье про ismap координаты клика отсчитывались от внутреннего края, а для области они считаются от наружного. Это два разных механизма, смешивать их не нужно. Что делать с растяжением, описано в статье про usemap: там же пересчёт координат скриптом.

Что при пересечении областей

Области могут перекрываться. Я проверил две пересекающиеся прямоугольные области и кликнул в трёх местах.

Что побеждает при пересечении
Куда кликнулиЧто получилосьПример записи
Только в первую областьОткрылась первая<area coords="0,0,100,100" href="/first">
В общую частьОткрылась первая: побеждает та, что записана раньше<area coords="50,0,150,100" href="/second">
Только во вторую областьОткрылась вторая<area coords="50,0,150,100" href="/second">

Практический вывод: самые важные области записывайте выше остальных.

Coords в JavaScript: свойство coords

В скрипте атрибут доступен как свойство coords, это строка. Она возвращается так, как записана: запятые и пробелы не меняются.

Как работает свойство coords
ДействиеЧто получилосьПример записи
Чтение без атрибутаВернулась пустая строкаarea.coords
Запись строкиАтрибут изменился, прочитать можно ту же строкуarea.coords = '1, 2 ,3'
Запись списка чиселНужно собрать строку самомуarea.coords = [50, 20, 150, 80].join(',')
HTML
const area = document.querySelector('area');
area.coords = [50, 20, 150, 80].join(',');

console.log(area.coords);   // "50,20,150,80"

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

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

ОшибкаЧто происходитКак исправить
Три числа у rectОбласти нетЗаписать четыре: два угла
Два числа у circleОбласти нетЗаписать центр и радиус
Меньше трёх вершин у polyОбласти нетЗаписать не меньше трёх пар чисел
Нечётное количество чисел у polyПоследнее число отбрасываетсяЗаписывать только пары
Проценты в coordsЗнак отброшен, числа считаются пикселямиПисать пиксели
Буква вместо числаСчитается нулём, область смещаетсяПроверить запись
Пробелы и точки с запятой вместо запятыхСейчас работает, но другой браузер может не принятьПисать через запятую
Нулевой радиус у circleОбласти нетЗадать положительный радиус
coords у defaultЧисла игнорируютсяУбрать атрибут
Картинку растянули стилямиОбласти остались прежнимиПересчитать координаты скриптом
Важную область записали после большойПри пересечении побеждает перваяПоставить важную выше

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

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

Атрибут coords: что и как писать
ЗадачаКак записатьПример записи
ПрямоугольникЛевый верхний и правый нижний углыcoords="50,20,150,80"
КругЦентр и радиусcoords="100,50,30"
МногоугольникПары чисел, не меньше трёх вершинcoords="100,10,180,90,20,90"
Вся картинкаЗначение default без чисел<area shape="default" href="/a" alt="A">
ЕдиницыПиксели CSScoords="0,0,100,50"
ОтсчётЛевый верхний угол картинкиcoords="0,0,100,50"
РазделительЗапятая без пробеловcoords="50,20,150,80"
Прочитать из скриптаСвойство coordsarea.coords
Категория
Поделиться в социальных сетях

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

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

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

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

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