Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Интерактивная карта с комментарием (https://javascript.ru/forum/misc/35262-interaktivnaya-karta-s-kommentariem.html)

madwizard 05.02.2013 13:51

Интерактивная карта с комментарием
 
Доброго времени суток всем. Надеюсь на вашу помощь. Значит хочу сделать карту при наведении на область которой появлялся бы комментарий в виде div'a. К примеру есть круг, при наведении курсора появляется div в котором находятся картинки, ссылки, текст и прочее прочее. Еще если водить курсором по этой области (кругу) то div передвигается за ним. Наглядный пример: клик клик.
Надеюсь на вашу помощь.
п.с. в яве не силен, ибо недавно начал его обучение.

tsigel 05.02.2013 14:54

что-то типа карты отсюда? моя карта

madwizard 05.02.2013 16:15

Цитата:

Сообщение от tsigel (Сообщение 231750)
что-то типа карты отсюда? моя карта

У Вас комментарий выводится под графиком, мне же надо чтобы он следовал за курсором в определенной области. Ссылка на пример указана в 1-ом посте.

tsigel 05.02.2013 16:20

Это мелочи, главное отличие в том что область наведения подсвечивается и может быть любой формы.

Если делать просто и быстро то область при наведении на которую будет всплывать окно будет прямоугольной.

tsigel 05.02.2013 16:27

Собственно есть очень простой вариант. Например есть некая большая картинка, на неё мы раскидываем прозрачные div над теми местами, на которых необходимо сделать отображение комментария. (дивы должны быть поверх картинки, расположить их можно с помощью position: absolute) Во внуторь этих дивов кладём верстку комментария к текущему диву с классом, например, "comment", со стилем display: none. Дальше всё просто.
$('/*Ваш див*/').hover(function() {
  $(this).find('.comment').css('display', 'block');
},function() {
  $(this).find('.comment').css('display', 'none');
})


Теперь у нас будет отображаться комментарий. Чтобы заставить его двигаться за курсором Вам бы почитать тут, Будут вопросы - пишите.

Deff 05.02.2013 17:04

На jQuery и jquery.tipsy.min.js (всплывающие подсказки), есть плагины с более крутыми подсказками http://jquerylist.ru/tooltipe
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Заказ МАР-карт (2) (Единый форум поддержки)</title>


<link rel="stylesheet" type="text/css" href="http://st0.bbcorp.ru/style/extra.14.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<script type="text/javascript" src="http://st0.bbcorp.ru/js/jquery.tipsy.min.js"></script>


</head>
<body style="padding-top:30px">

<center>
<img src="http://s017.radikal.ru/i420/1112/ec/75a65e6e1237.jpg" width="365" height="481" 
border="0" usemap="#mapka">
<map name="mapka" id="Map">
<span class="tipsy-Map" title="Aнкеты"><area shape="rect" coords="141,239,247,267" 
href="http://rolevayagrotter.mybb.ru/viewtopic.php?id=5"></span>

<span class="tipsy-Map" title="Правила"><area shape="rect" coords="202,277,308,308" 
href="http://rolevayagrotter.mybb.ru/viewtopic.php?id=2"></span>

<span class="tipsy-Map" title="Флуд"><area shape="rect" coords="148,313,219,344" 
href="http://rolevayagrotter.mybb.ru/viewforum.php?id=1"></span>

<span class="tipsy-Map" title="Список занятых внешностей"><area shape="rect" coords="216,350,361,376" 
href="http://rolevayagrotter.mybb.ru/viewtopic.php?id=35"></span>

<span class="tipsy-Map" title="Вопросы"><area shape="rect" coords="148,385,246,411" 
href="http://rolevayagrotter.mybb.ru/viewtopic.php?id=3"></span>

<span class="tipsy-Map" title="Предложения"><area shape="rect" coords="205,421,361,450" 
href="http://rolevayagrotter.mybb.ru/viewtopic.php?id=62"></span>

</map></center>
<style>
.tipsy.tipsy-s.Map{
 font-size:14px;
 z-index:10000!important;
}
</style>
<script>
var offset_On=false;
function mouseShowHandler(e){
	e = e || window.event

if(offset_On){	if (e.pageX == null && e.clientX != null ) { 
		var html = document.documentElement
		var body = document.body
	
		e.pageX = e.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0)
		e.pageY = e.clientY + (html && html.scrollTop || body && body.scrollTop || 0) - (html.clientTop || 0)
	}

	
	
	//document.getElementById('mouseX').value = e.pageX
	//document.getElementById('mouseY').value = e.pageY

    $(".tipsy.tipsy-s.Map").css({"top":(e.pageY-50)+"px","left":(e.pageX-30)+"px"});//offset_On=false;
}}


						// nw | n | ne | w | e | sw | s | se
$("#Map .tipsy-Map").tipsy({gravity: 's Map'});

$("#Map .tipsy-Map").mouseover(function(){
   offset_On=true;$(document).mousemove(mouseShowHandler)
}).mouseout(function(){
      offset_On=false;
});
</script>


</body>
</html>

madwizard 06.02.2013 11:47

Цитата:

Сообщение от tsigel (Сообщение 231788)
Собственно есть очень простой вариант. Например есть некая большая картинка, на неё мы раскидываем прозрачные div над теми местами, на которых необходимо сделать отображение комментария. (дивы должны быть поверх картинки, расположить их можно с помощью position: absolute) Во внуторь этих дивов кладём верстку комментария к текущему диву с классом, например, "comment", со стилем display: none. Дальше всё просто.
$('/*Ваш див*/').hover(function() {
  $(this).find('.comment').css('display', 'block');
},function() {
  $(this).find('.comment').css('display', 'none');
})


Теперь у нас будет отображаться комментарий. Чтобы заставить его двигаться за курсором Вам бы почитать тут, Будут вопросы - пишите.

А если места над которыми должен быть комментарий круглые?
Т.е. если простые дивы сделать, область будет прямоугольной?

tsigel 06.02.2013 12:11

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

tsigel 06.02.2013 12:18

Если вы хотите сделать область наведения произвольной формы, то вам надо использовать
<map>
  <area coords="0,0,0,10,10,10,10,0" class='area1' />
  <area ... />
</map>

Где area может быть любой формы (туда прописываются координаты точек (x,y,x,y,x,y,...), по которым будет построена фигура области относительно map. Точек может быть сколько угодно).

$('.area1').hover(function() {
  //событие при наведении на область в форме квадрата со стороной 10px в левом верхнем углу map
}, function() {
  //событие потери наведения
});


Если необходимо подсвечивать область произвольной формы, то надо использовать тег canvas.

madwizard 06.02.2013 15:46

Благодарю, а вот если допустим на картинке кругов 10, код будет выглядеть так?
<map>
  <area coords="координаты" class='area1' />
  <area coords="координаты" class='area2' />
  <area coords="координаты" class='area3' />
  <area coords="координаты" class='area4' />
  <area ... />
</map>

$('.area1').hover(function() {
  $(this).find('.comment').css('display', 'block');
}, function() {
  $(this).find('.comment').css('display', 'none');
});
$('.area2').hover(function() {
  $(this).find('.comment2').css('display', 'block');
}, function() {
  $(this).find('.comment2').css('display', 'none');
});
...

и для каждой области свой скрипт, т.е. нельзя написать один скрипт на все комментарии?
За ранее огромное спасибо.

п.с. а вместо канваса нельзя использовать карту?
<area shape="circle" coords="230,340, 100">

Deff 06.02.2013 15:49

madwizard,
:) А чем не нравицо мой код ? Комментарии в титлах <area

Deff 06.02.2013 15:54

Цитата:

Сообщение от madwizard
вместо канваса нельзя использовать карту?

Вместо канваса можно использовать набор картинок (на прозрачной основе), все размером с мап карту и прорисованной области нужной формы и положения.

tsigel 06.02.2013 16:12

Цитата:

Сообщение от madwizard
$('.area1').hover(function() {
  $(this).find('.comment').css('display', 'block');
}, function() {
  $(this).find('.comment').css('display', 'none');
});

Этот код подходит для дивов а не для area, вы же не можете положить блок comment во внуторь area ($(this).find("это") означеет что мы ищем "это" внутри this. this при событии клик это то на что мы кликнули.)

сейчас немного занят, скоро напишу.

Deff 06.02.2013 16:19

tsigel,
Обрамить каждый area в span, в span всунуть картинку с position:absolute; top:0;left:0;display:none;
Всю карту обернуть в div c position:relative; тогда все картинки будут привязаны к левому верхнему углу карты
(Про картинки пост 12)
Отслеживаем наведение на span - разворачиваем картинку, при сходе курсора - сворачиваем

tsigel 06.02.2013 16:29

Для того чтобы отображать комментарии в карте с использованием area Вам надо научиться связывать элементы. Это можно делать с помощью data() или можно сделать просто и наглядно.

Добавляем арии и метке одинаковый класс (например <area class='area lebel1' /> будет соответствовать метке <label class='label label1'></label>), тогда мы можем написать:
$('.area').hover(function() {//наведение на область
  var class; //Объявляем переменную "class"
  class = $(this).attr('class');//записали в переменную класс арии (class = "area lebel1")
  class = class.replace('area ', '');//Удалили из переменной класс арии (class = "lebel1")
  $('.' + class).css('display', 'block');//показали метку
 }, function () {//потеря наведения на арию
  $('.label').each(function() {//цикл по всем элементам с классом label
    $(this).css('display', 'none');//скрываем все метки
  })
})


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

tsigel 06.02.2013 16:30

Цитата:

Сообщение от Deff
tsigel,
Обрамить каждый area в span, в span всунуть картинку с position:absolute; top:0;left:0;display:none;
Всю карту обернуть в div c position:relative; тогда все картинки будут привязаны к левому верхнему углу карты
(Про картинки пост 12)
Отслеживаем наведение на span - разворачиваем картинку, при сходе курсора - сворачиваем

Deff,
Мне проще канвасом попользоваться. :)

tsigel 06.02.2013 16:42

Цитата:

Сообщение от madwizard
п.с. а вместо канваса нельзя использовать карту?

canvas используется не вместо, а вместе с картой.

Deff 06.02.2013 16:51

Цитата:

Сообщение от tsigel
Мне проще канвасом попользоваться

Один фиг - пусть канвас, но при таком способе отпадает надобность позиционирования- привязки каждого

tsigel 06.02.2013 16:57

Deff,
А я и не писал, что для канваса нужна привязка, я говорил что можно сделать блоками или, как альтернатива, канвасом и map area.

Просто это сложнее и требует больших навыков. Но качество работы того стоит.

Deff 06.02.2013 17:01

tsigel,
:) Если не нужна - то как канва всплывет в нужной области ?-(вычислять крайние точки по area - геммор)
Тут она всплывет в нужном span

tsigel 06.02.2013 17:19

Deff,
Ничего вычислять не надо, все координаты и так есть в ареа, мы просто забираем их в текстовый массив, делим сплитом на цифровые переменные (я назвал этот массив coords).

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

function draw(canvas, coords, lineColor, fullColor) {
            ctx = canvas.getContext("2d");
            ctx.strokeStyle = lineColor;
            ctx.fillStyle = fullColor;
            ctx.lineWidth = 1;
            ctx.beginPath();
            ctx.moveTo(coords[0], coords[1]);
            for (var i = 2; i < coords.length; i = i + 2) {
                ctx.lineTo(coords[i], coords[i + 1]);
            }
            ctx.stroke();
            if (fullColor != null) {
                ctx.fill();
            }
            ctx.closePath();
        }


Просто и функционально) (Делал интерактивную карту России)

Deff 06.02.2013 17:27

Цитата:

Сообщение от tsigel
Если канвас совпадает по размеру с картой, то никаких проблем, координаты арии и будут координатами канваса.

Тогда - ясно
Хотя имхо картинкой не сложнее, и чище *часто по пойнтерам в coords более грубый край, нежели реально в самой картинке Карты, поэтому есть ограничения по плавности краёв. Картинка может сгладить эти края и вдобавок, каждой области можно всунуть отмасштабированную в меньшем размере, с увеличением при клике(где уже видны: города - заводы улицы и .т.д)
Вообще занимался впихиванием фреймом гугол-карты в области

tsigel 06.02.2013 17:37

Deff,
Нууу... Тут как сказать, я бы не сказл что Ваш вриант лучше, большое количество картинок увеличивает вес сайта, он дольше грузится, необходимо догружать картинки, чтобы они не мигали при первом наведении (если они дисплей нун). И нужно делать кучу картинок.

С другой стороны канвас медленно работает в ИЕ (и то только со скриптом) и т.д.

Каждый делает так как ему удобнее, мне было удобнее так ;)

madwizard 06.02.2013 19:30

Цитата:

Сообщение от tsigel (Сообщение 231987)
Для того чтобы отображать комментарии в карте с использованием area Вам надо научиться связывать элементы. Это можно делать с помощью data() или можно сделать просто и наглядно.

Добавляем арии и метке одинаковый класс (например <area class='area lebel1' /> будет соответствовать метке <label class='label label1'></label>), тогда мы можем написать:
$('.area').hover(function() {//наведение на область
  var class; //Объявляем переменную "class"
  class = $(this).attr('class');//записали в переменную класс арии (class = "area lebel1")
  class = class.replace('area ', '');//Удалили из переменной класс арии (class = "lebel1")
  $('.' + class).css('display', 'block');//показали метку
 }, function () {//потеря наведения на арию
  $('.label').each(function() {//цикл по всем элементам с классом label
    $(this).css('display', 'none');//скрываем все метки
  })
})


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

Создали карту, написали скрипт, а куда саму верстку комментария девать?:cray:

У Deff'a карта отличная, почти то что нужно, но комментарий там просто текст, а не блок с элементами =( надеюсь до меня дойдет, как все это делать =(

tsigel 07.02.2013 10:07

например так:
<div class='labels'>
  <div class='label label1'>...</div>
  <div class='label label2'>...</div>
  <div class='label label3'>...</div>
  <div class='label label4'>...</div>
</div>
<map>
  <area class='area label1' coords='...' />
  <area class='area label2' coords='...' />
  <area class='area label3' coords='...' />
  <area class='area label4' coords='...' />
</map>


Тогда скрипт можно немного оптимизировать, чтобы пошустрее бегал:
var map = $('map'),
  labels = $('.labels');

map.find('.area').hover(function() {//наведение на область
  var class; //Объявляем переменную "class"
  class = $(this).attr('class');//записали в переменную класс арии (class = "area lebel1")
  class = class.replace('area ', '');//Удалили из переменной класс арии (class = "lebel1")
  labels.find('.' + class).css('display', 'block');//показали метку
 }, function () {//потеря наведения на арию
  labels.find('.label').each(function() {//цикл по всем элементам с классом label
    $(this).css('display', 'none');//скрываем все метки
  })
})


Разница в том, что когда мы создали переменные мы сделали ссылки на конкретные элементы в документе и ищем area и label не во всем документе а в конкретных местах.

tsigel 07.02.2013 10:32

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<style>
.area {
margin: 50px;
width: 150px;
height: 100px;
background-color: rgb(255, 222, 173);
}
.label {
background-color: rgb(250, 240, 230);
width: 40px;
height: 20px;
position: absolute;
margin: -20px -10px 0 0;
display:none;
}
</style>
<div class='area'></div>
<div class='label'></div>
<script>

function muve(e) {
  $('.label').css({
    'left' : e.pageX + 5,
    'top' : e.pageY + 5
  })
}

$('.area').hover(function(e) {
  $(document).bind('mousemove', muve);
  $('.label').css({
    'display' : 'block',
    'left' : e.pageX,
    'top' : e.pageY
  })
}, function() {
  $(document).unbind('mousemove', muve);
  $('.label').css('display', 'none');
})
</script>


Это должно навести вас на мысли как сделать подвижную метку. Будут вопросы - пишите!


Часовой пояс GMT +3, время: 08:12.