Mapa Interativo com SVG e JavaScript (sem Jquery)

Vocês viram aquele mapa das eleições do G1? Eu particularmente achei ele bem interessante, ainda mais em saber que utilizaram Jquery!

Mas e se fôssemos fazer isto utilizando apenas JS puro? Como isto ficaria?

Aqui temos um mapa do estado de Roraima na qual queremos saber as informações de suas microrregiões.

roraimaregiao
Mapa de Roraima subdividida em microrregiões

O que queremos fazer aqui, é que ao passar o mouse em cima de cada região, a região em questão altere sua cor e que ao clicar que suas informações apareçam ao lado do mapa.

mapa_interativo

Primeiro de tudo, vamos criar 3 divs. Um que será nosso container, um para nosso svg e por fim para as informações das microrregiões.3

1

containers

Em seguida adicionaremos nosso SVG dentro da nossa div de cor aquamarine.

SVG

CAGOU TUDO! E agora? Vou ter que refazer toda minha imagem no Corel/Photoshop? Claro que não! O truque aqui, vai ser remover o width e height do nosso svg fazendo que ela herde estas propriedades da nossa div, tornando a sua manipulação mais simples.

SVG_SIZE_FIXED

Shoooooww!!!

Agora é que começaremos a fazer a mágica. Dentro do nosso elemento svg, temos vários outros elementos genéricos utilizados para definir formas, alguns deles polygon, path, line, dentre outros. No nosso caso, teremos o path.

Estes elementos path representarão em nosso mapa as regiões na qual manipularemos a seguir. Para recuperar estes elementos de nossa DOM vamos usar a função querySelectorAll() do JS.

2.PNG

Uma vez recuperados, utilizaremos o forEach() para acessar cada elemento da lista retornada e adicionar os nossos listerners e alterar os atributos do elemento.

3

Coisa de mais de uma vez? Calma que eu explico!

Com addEventListener estamos definindo qual o evento e o que deve ser feito quando este evento ocorrer. Neste caso, estamos dizendo com o ‘mouseover’, que quando o ponteiro do mouse estiver sobre o elemento ele deve executar nossa função. Dentro desta função, estamos definindo os atributos do nosso elemento usando o setAttribute().  Passamos então o primeiro parâmetro que corresponde a qual dos atributos que iremos alterar, e logo em seguida o valor a ser alterado. Mas peraí?! E esse ‘hover’ aí? Este ‘hover’ é uma classe css que usaremos para definir a nova cor da região. Você pode defini-la normalmente como qualquer classe css, como dentro do svg:

4

Você já deve ser capaz de alterar as cores das microrregiões apenas passando o mouse por cima – pelo menos aqui compila.

Mas a um problema no nosso código, ao remover o mouse de cima do elemento a cor permanece e não é isso que queremos neste exemplo. Para resolver isto, vamos adicionar outro evento, o mouseout.

5

Funciona da mesma forma, a diferença agora é que estamos passando a classe fill no lugar de hover.

hover

Shooow!

E aquela parte vazia ali? Vai ficar assim mesmo?!

Não, não! Ali colocaremos as informações das nossas regiões como já dito antes. Vamos colocar duas divs, uma para o nome da microrregião e outra para o que seria a descrição da microrregião.

6

Para a div que irá conter o nome da nossa região definiremos o seu id de “microregiao_nome” e também uns estilos para organizar o texto. Na div da nossa descrição definiremos seu id de “microregiao_descricao”, colocaremos também uma tag de parágrafo a onde ficará um breve lorem ipsum para representar o conteúdo.

descricao_microregiao.PNG

Quase pronto! Lembra do elemento path? Então, agora iremos definir os seus ids com o nome de cada região, e exibir ela para usuário para que ele saiba com qual microrregião ele está interagindo.

7

Ids definidas e agora como faz para mudar de acordo com a interação?

Muito simples! Adicionaremos mais um evento ao nosso elemento para que quando este for disparado altere o conteúdo da nossa div.

8

Passamos o “click” como nosso evento, logo, quando o usuário clicar em uma das regiões o evento irá executar nossa função. Veja aqui que utilizamos querySelector() no lugar de querySelectorAll() como anteriormente. O querySelector() retorna apenas o primeiro elemento passado no parâmetro, enquanto o querySelectorAll() retorna uma lista destes elementos.

Dando continuidade ao nosso código, utilizando a propriedade textContent estamos dizendo que queremos alterar o conteúdo do elemento definido pelo querySelector() pelo valor do id do mesmo elemento. E pronto! Nosso mapinha ficou uma belezinha!

Aí funcionou? Aqui compilou! Qualquer coisa comenta aí e dá uma olhada no github do blog. 😉

Até a próxima, galera!

Um comentário em “Mapa Interativo com SVG e JavaScript (sem Jquery)

Deixe um comentário