fesmap / pj
forked from Ray8/pj
Newer
Older
pj / pai.js
const map = document.getElementById('map');
const img = document.getElementById('mapImage');

// CSV読み込み関数
async function loadCSV(url) {
  const response = await fetch(url);
  const text = await response.text();
  const rows = text.trim().split("\n").map(r => r.split(","));
  const headers = rows.shift();
  return rows.map(r => Object.fromEntries(r.map((v,i) => [headers[i], v])));
}

// ピンを配置する関数
function placePins(pins) {
  document.querySelectorAll('.pin, .tooltip').forEach(e => e.remove());

  const rect = img.getBoundingClientRect();
  const width = rect.width;
  const height = rect.height;

  pins.forEach(pos => {
    const x = parseFloat(pos.x);
    const y = parseFloat(pos.y);

    // ピン本体
    const pin = document.createElement('div');
    pin.className = 'pin';
    pin.style.left = (x * width) + 'px';
    pin.style.top = (y * height) + 'px';

    const iconImg = document.createElement('img');
    iconImg.src = pos.icon;
    pin.appendChild(iconImg);

    // 吹き出し
    const tooltip = document.createElement('div');
    tooltip.className = 'tooltip';
    tooltip.style.left = (x * width) + 'px';
    tooltip.style.top = (y * height) + 'px';
    tooltip.innerHTML = `
      <strong>${pos.title}</strong><br>
      <span>${pos.description}</span><br>
      <img src="${pos.image}" alt="${pos.title}">
      <a href="${pos.url}" target="_blank">公式サイトへ</a>
    `;

    // クリックで表示切替
    pin.addEventListener('click', () => {
      const isVisible = tooltip.style.display === 'block';
      document.querySelectorAll('.tooltip').forEach(t => t.style.display = 'none');
      tooltip.style.display = isVisible ? 'none' : 'block';
    });

    map.appendChild(pin);
    map.appendChild(tooltip);
  });
}

// 初期化
async function init() {
  const pins = await loadCSV('spots.csv');
  placePins(pins);
  window.addEventListener('resize', () => placePins(pins));
}

img.addEventListener('load', init);