パーツ番号 08-15-09 ・ JavaScript使用
スプリング開閉ドラッグトグル
つまみをドラッグして離すと、近い側の状態へオーバーシュートしながらバネで吸着します。WordPressの設定オン/オフスイッチに応用できます。
プレビュー
ソースコード
HTML
<div class="d08-15-09-toggle" id="d08-15-09-toggle">
<div class="d08-15-09-knob" id="d08-15-09-knob"></div>
</div>CSS
.d08-15-09{width:100%;display:flex;align-items:center;justify-content:center}
.d08-15-09-toggle{position:relative;width:76px;height:34px;border-radius:99px;background:#dcdfe6;transition:background .25s}
.d08-15-09-toggle.is-on{background:linear-gradient(90deg,#6a5cff,#8b5cf6)}
.d08-15-09-knob{position:absolute;top:4px;left:4px;width:26px;height:26px;border-radius:50%;background:#fff;box-shadow:0 2px 6px rgba(0,0,0,.22);cursor:grab;touch-action:none}
.d08-15-09-knob.is-drag{cursor:grabbing}JavaScript
(function(){
var root=document.getElementById('item-08-15-09');if(!root)return;
var toggle=root.querySelector('#d08-15-09-toggle'),knob=root.querySelector('#d08-15-09-knob');
if(!toggle||!knob)return;
var MAXX=42,dragging=false,startX=0,startTx=0,curTx=0,raf=null;
function apply(x){knob.style.transform='translateX('+x+'px)';}
knob.addEventListener('pointerdown',function(e){
dragging=true;knob.classList.add('is-drag');
if(raf)cancelAnimationFrame(raf);
startX=e.clientX;startTx=curTx;
try{knob.setPointerCapture(e.pointerId);}catch(err){}
});
knob.addEventListener('pointermove',function(e){
if(!dragging)return;
var dx=e.clientX-startX;
curTx=Math.max(0,Math.min(MAXX,startTx+dx));
apply(curTx);
});
function end(){
if(!dragging)return;
dragging=false;knob.classList.remove('is-drag');
var target=curTx>MAXX/2?MAXX:0;
toggle.classList.toggle('is-on',target===MAXX);
var x=curTx,v=0,stiff=.22,damp=.68;
function step(){
var f=(target-x)*stiff;v=(v+f)*damp;x+=v;curTx=x;apply(x);
if(Math.abs(target-x)>.5||Math.abs(v)>.5){raf=requestAnimationFrame(step);}
else{curTx=target;apply(target);}
}
raf=requestAnimationFrame(step);
}
knob.addEventListener('pointerup',end);
knob.addEventListener('pointercancel',end);
})();クラス名 .d08-15-09 は本ライブラリ内での識別用です。複数のパーツを同じページで使う場合は、重複しないよう名前を変更してください。