← 動的パーツギャラリーへ戻る

パーツ番号 10-13-03 ・ JavaScript使用

地図ピンクリックで詳細ポップアップ

地図上のピンをクリックすると物件の詳細カードがふわっとポップアップ表示。地図検索ページのピン連動UIに使えます。

clickjsoverlay

プレビュー

ソースコード

HTML

<div class="d10-13-03-map">
          <span class="d10-13-03-grid"></span>
          <button class="d10-13-03-pin" data-id="a" style="left:26%;top:36%"><span>A</span></button>
          <button class="d10-13-03-pin" data-id="b" style="left:58%;top:56%"><span>B</span></button>
          <button class="d10-13-03-pin" data-id="c" style="left:76%;top:28%"><span>C</span></button>
          <div class="d10-13-03-card" data-for="a" style="left:26%;top:36%">
            <p class="d10-13-03-c-name">グリーンハイツA棟</p>
            <p class="d10-13-03-c-price">8.2万円 / 1LDK</p>
          </div>
          <div class="d10-13-03-card" data-for="b" style="left:58%;top:56%">
            <p class="d10-13-03-c-name">パークサイドB</p>
            <p class="d10-13-03-c-price">9.8万円 / 2DK</p>
          </div>
          <div class="d10-13-03-card" data-for="c" style="left:76%;top:28%">
            <p class="d10-13-03-c-name">リバーテラスC</p>
            <p class="d10-13-03-c-price">11.5万円 / 2LDK</p>
          </div>
        </div>

CSS

.d10-13-03{padding:0}
        .d10-13-03-map{position:absolute;inset:0;background:#eaeef0;overflow:hidden}
        .d10-13-03-grid{position:absolute;inset:0;background-image:linear-gradient(#dbe1e5 1px,transparent 1px),linear-gradient(90deg,#dbe1e5 1px,transparent 1px);background-size:30px 30px}
        .d10-13-03-pin{position:absolute;width:26px;height:26px;margin:-26px 0 0 -13px;border-radius:50% 50% 50% 0;transform:rotate(-45deg);background:#2f7fef;border:2px solid #fff;color:#fff;font-size:11px;font-weight:700;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 2px 6px rgba(0,0,0,.2);padding:0;transition:transform .2s,background .2s}
        .d10-13-03-pin span{display:block;transform:rotate(45deg)}
        .d10-13-03-pin.is-active{background:#e2504a;transform:rotate(-45deg) scale(1.15)}
        .d10-13-03-card{position:absolute;transform:translate(-50%,-130%);background:#fff;border-radius:10px;padding:8px 12px;box-shadow:0 8px 20px rgba(0,0,0,.18);font-size:11px;opacity:0;pointer-events:none;transition:opacity .2s,transform .2s;white-space:nowrap}
        .d10-13-03-card.is-show{opacity:1;transform:translate(-50%,-150%)}
        .d10-13-03-c-name{margin:0;font-weight:700;color:#223}
        .d10-13-03-c-price{margin:2px 0 0;color:#2f7fef;font-weight:700}

JavaScript

(function(){
        var root=document.getElementById('item-10-13-03');if(!root)return;
        var pins=root.querySelectorAll('.d10-13-03-pin');
        var cards=root.querySelectorAll('.d10-13-03-card');
        pins.forEach(function(pin){
          pin.addEventListener('click',function(){
            var id=pin.getAttribute('data-id');
            var wasActive=pin.classList.contains('is-active');
            pins.forEach(function(p){p.classList.remove('is-active');});
            cards.forEach(function(c){c.classList.remove('is-show');});
            if(!wasActive){
              pin.classList.add('is-active');
              var card=root.querySelector('.d10-13-03-card[data-for="'+id+'"]');
              if(card)card.classList.add('is-show');
            }
          });
        });
      })();

クラス名 .d10-13-03 は本ライブラリ内での識別用です。複数のパーツを同じページで使う場合は、重複しないよう名前を変更してください。