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();
}
Просто и функционально) (Делал интерактивную карту России) |
Цитата:
Хотя имхо картинкой не сложнее, и чище *часто по пойнтерам в coords более грубый край, нежели реально в самой картинке Карты, поэтому есть ограничения по плавности краёв. Картинка может сгладить эти края и вдобавок, каждой области можно всунуть отмасштабированную в меньшем размере, с увеличением при клике(где уже видны: города - заводы улицы и .т.д) Вообще занимался впихиванием фреймом гугол-карты в области |
Deff,
Нууу... Тут как сказать, я бы не сказл что Ваш вриант лучше, большое количество картинок увеличивает вес сайта, он дольше грузится, необходимо догружать картинки, чтобы они не мигали при первом наведении (если они дисплей нун). И нужно делать кучу картинок. С другой стороны канвас медленно работает в ИЕ (и то только со скриптом) и т.д. Каждый делает так как ему удобнее, мне было удобнее так ;) |
Цитата:
У Deff'a карта отличная, почти то что нужно, но комментарий там просто текст, а не блок с элементами =( надеюсь до меня дойдет, как все это делать =( |
например так:
<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 не во всем документе а в конкретных местах. |
<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, время: 22:11. |