Search
Write a publication
Pull to refresh

Интерактивная карта. HTML+CSS+JS

Добрый день! Хочу предоставить Вашему вниманию так скажем небольшой туду лист по созданию карты с подсветкой областей на связке HTML+CSS+JS.

Задача


Вроде бы задача тривиальная, но необходимого мне материала я в интернете не нашёл. Точней нашёл, но всё было разрозненно и по кускам, либо с использованием тех технологий, который не подходили. А необходимо было сделать карту с подсветкой областей, а также выбора области на HTML+CSS+JS.

Рисуем карту


Так как хотелось сделать красивую карту в тон дизайну сайту, было принято решение полностью самому её нарисовать. Для это была создана подложка карты с гугл мап, необходимой области и зимними холодными вечерами (ночами) была нарисована карта.
image

Верстаем


После усвоения всего прочитанного материала, всё оказалось проще простого.
  1. С помощью инструмента Polygon Hotspot tool в Adobe Fireworks создаём разделение на необходимые нам областям, при наведении на которые будет подсвечиваться данная область.

  2. Экспортируем всё это дело в HTML, соответствующей командой в меню. На выходе получаем карту ссылок для нашей карты. Пример:
    Copy Source | Copy HTML
    1. <map name="m_map" id="m_map">
    2.     <area shape="poly" coords="253,280,258,280,261,285,267,287" title="1" alt="1" />
    3.     <area shape="poly" coords="253,280,258,280,261,285,267,287" title="2" alt="2" />
    4.     <area shape="poly" coords="253,280,258,280,261,285,267,287" title="3" alt="3" />
    5.     <area shape="poly" coords="253,280,258,280,261,285,267,287" title="4" alt="4" />
    6. </map>



  3. Далее встаёт вопрос как реализовать подсвечивание областей нашей карты. Я поступил следующим обазом. Создал три пустых картинки с неоходимым бэкграундом, которые будут являться нашей картой, подсвеченной областью в текущий момент и выбранной областью, соответсвенно. Код ниже.
    Copy Source | Copy HTML
    1. <img id="map" src="img/empty.png"/>
    2. <img id="activ_r" src="img/empty.png">
    3. <img id="onover_r" src="img/empty.png" usemap="#m_map">


    Тэг usemap со значением #m_map подключает раннее созданную карту ссылок.

  4. Сама карта есть. Необходимы подсвечиваемые области. Берёмся снова за фотошоп и получаем следующее.

  5. Теперь остаётся лишь создать обработчик на JS, который будет реагировать на наведение и нажатие на наши области. Код:
    Copy Source | Copy HTML
    1. window.onload = function()
    2. {
    3.     var aw = new Array;
    4.     aw = document.getElementsByTagName("area");
    5.     var i =  0;
    6.     while(aw[i])
    7.     {
    8.         aw[i].onmouseover = function(){document.getElementById('onover_r').className = 'r' + this.alt;}
    9.         aw[i].onmouseout = function(){document.getElementById('onover_r').className = 'r0';}
    10.         aw[i].onclick = function(){document.getElementById('activ_r').className = 'r' + this.alt;}
    11.         i+=1;
    12.     }
    13. }


    (Пока всё это писал, пришла мысль, что смену картинок при наведении можно реализовать и с помощью CSS, но я уже сделал так.)

  6. В дополнение к нашему бутерброду из 3х слоёв CSS код:
    Copy Source | Copy HTML
    1. #map{
    2.     width:600px;
    3.     height: 732px;
    4.     background:url("../img/map.jpg") no-repeat;
    5.     position:absolute;
    6.     top: 18px;
    7. }
    8.  
    9. #onover_r {
    10.     width:600px;
    11.     height: 732px;
    12.     display:block;
    13.     position:absolute;
    14.     top: 18px;
    15. }
    16.  
    17. #activ_r {
    18.     width:600px;
    19.     height: 732px;
    20.     display:block;
    21.     position:absolute;
    22.     top: 18px;
    23. }
    24.  
    25. .r0{background:none;}
    26. .r1{background:url("../img/map_r.png") 0px 0px;}
    27. .r2{background:url("../img/map_r.png") -600px 0px;}
    28. .r3{background:url("../img/map_r.png") -1200px 0px;}
    29. .r4{background:url("../img/map_r.png") -1800px 0px;}
    30. .r5{background:url("../img/map_r.png") -2400px 0px;}
    31. .r6{background:url("../img/map_r.png") -3000px 0px;}
    32. .r7{background:url("../img/map_r.png") -3600px 0px;}
    33. .r8{background:url("../img/map_r.png") -4200px 0px;}
    34. .r9{background:url("../img/map_r.png") -4800px 0px;}
    35. .r10{background:url("../img/map_r.png") -5400px 0px;}
    36. .r11{background:url("../img/map_r.png") -6000px 0px;}
    37. .r12{background:url("../img/map_r.png") -6600px 0px;}



    Оптимизация


    Вы спросите почему я не соединил карту и области в одну картинку? А всё для того, чтобы уменьшить вес картинки, но при этом не потерять качества. Я не смог отказаться от PNG 24 исходной карты, поэтому области вынес в отдельную картинку с расширением PNG 8 c 64 цветами. В итоге у меня вышла карта размером 92кб, а области 34кб. Можно конечно ещё уменьшить размер, но я не стал фанатеть. Меня устроил такой результат. Вот что получаем в конце: image

    На этом всё. Живого примера к сожалению не выкладываю, т.к. рабочий хостинг не выдержит, а другого нет. Вот ссылка на скачивание архива с файлами.

    С Уважением.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.