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

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

家賃レンジフィルタースライダー

2つのハンドルをドラッグして家賃の上限・下限を変更できます。トラックのクリックでも近い方のハンドルが移動。物件検索の絞り込みパネルに。

clickdragjs

プレビュー

ソースコード

HTML

<div class="d10-13-02-panel">
          <p class="d10-13-02-label">家賃 <span class="d10-13-02-min">6</span>〜<span class="d10-13-02-max">21</span>万円</p>
          <div class="d10-13-02-track">
            <span class="d10-13-02-fill"></span>
            <span class="d10-13-02-handle" data-handle="min" style="left:20%"></span>
            <span class="d10-13-02-handle" data-handle="max" style="left:70%"></span>
          </div>
        </div>

CSS

.d10-13-02{padding:20px}
        .d10-13-02-panel{width:100%;max-width:260px}
        .d10-13-02-label{margin:0 0 20px;font-size:13px;font-weight:700;color:#233;text-align:center}
        .d10-13-02-label span{color:#2f7fef}
        .d10-13-02-track{position:relative;height:4px;background:#e3e8ec;border-radius:2px;margin:0 4px}
        .d10-13-02-fill{position:absolute;top:0;bottom:0;background:#2f7fef;border-radius:2px}
        .d10-13-02-handle{position:absolute;top:50%;width:18px;height:18px;margin:-9px 0 0 -9px;background:#fff;border:3px solid #2f7fef;border-radius:50%;box-shadow:0 2px 6px rgba(0,0,0,.2);cursor:grab;touch-action:none}
        .d10-13-02-handle:active{cursor:grabbing}

JavaScript

(function(){
        var root=document.getElementById('item-10-13-02');if(!root)return;
        var track=root.querySelector('.d10-13-02-track');
        var fill=root.querySelector('.d10-13-02-fill');
        var minH=root.querySelector('.d10-13-02-handle[data-handle="min"]');
        var maxH=root.querySelector('.d10-13-02-handle[data-handle="max"]');
        var minLabel=root.querySelector('.d10-13-02-min');
        var maxLabel=root.querySelector('.d10-13-02-max');
        var RANGE=30;
        var vals={min:20,max:70};
        function pctToVal(p){return Math.round(p/100*RANGE);}
        function render(){
          minH.style.left=vals.min+'%';
          maxH.style.left=vals.max+'%';
          fill.style.left=vals.min+'%';
          fill.style.width=(vals.max-vals.min)+'%';
          minLabel.textContent=pctToVal(vals.min);
          maxLabel.textContent=pctToVal(vals.max);
        }
        function clientToPct(clientX){
          var rect=track.getBoundingClientRect();
          var p=(clientX-rect.left)/rect.width*100;
          return Math.max(0,Math.min(100,p));
        }
        function bindDrag(handle,key,isMin){
          handle.addEventListener('pointerdown',function(e){
            handle.setPointerCapture(e.pointerId);
            function move(ev){
              var p=clientToPct(ev.clientX);
              if(isMin){p=Math.min(p,vals.max-4);}else{p=Math.max(p,vals.min+4);}
              vals[key]=p;
              render();
            }
            function up(){
              handle.removeEventListener('pointermove',move);
              handle.removeEventListener('pointerup',up);
            }
            handle.addEventListener('pointermove',move);
            handle.addEventListener('pointerup',up);
          });
        }
        bindDrag(minH,'min',true);
        bindDrag(maxH,'max',false);
        track.addEventListener('click',function(e){
          if(e.target===minH||e.target===maxH)return;
          var p=clientToPct(e.clientX);
          if(Math.abs(p-vals.min)<=Math.abs(p-vals.max)){vals.min=Math.min(p,vals.max-4);}
          else{vals.max=Math.max(p,vals.min+4);}
          render();
        });
        render();
      })();

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