27 - Click and Drag
主題
製作一個可拖曳移動的水平捲軸。
步驟
Step1. 取得頁面元素與設定初始變數
1 2 3 4
| const slider = document.querySelector('.items'); let isDown = false; let startX; let scrollLeft;
|
Step2. 建立基本事件框架
因為這次練習主要是在拖曳的動作,
所以對會用到的mouse event事件先建立監聽框框出來:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| slider.addEventListener('mousedown', () => {
});
slider.addEventListener('mouseleave', () => {
});
slider.addEventListener('mouseup', () => {
});
slider.addEventListener('mousemove', () => {
});
|
Step3. 滑鼠按下事件
1 2 3 4 5 6 7 8 9 10
| slider.addEventListener('mousedown', (e) => { isDown = true; slider.classList.add('active'); startX = e.pageX - slider.offsetLeft; scrollLeft = slider.scrollLeft; });
|
Step4. 滑鼠移出事件
1 2 3 4 5
| slider.addEventListener('mouseleave', () => { isDown = false; slider.classList.remove('active'); });
|
Step5. 滑鼠按鍵放開事件
與Step4一樣,主要是取消樣式
1 2 3 4 5
| slider.addEventListener('mouseup', () => { isDown = false; slider.classList.remove('active'); });
|
Step6. 滑鼠移動事件
1 2 3 4 5 6 7 8 9 10 11 12
| slider.addEventListener('mousemove', (e) => { if (!isDown) return; e.preventDefault(); const x = e.pageX - slider.offsetLeft; const walk = x - startX; slider.scrollLeft = scrollLeft - walk; });
|
其他
如果有仔細看,會發現當拖曳左右移動時,
HTML中的卡片會有3D移動的效果感很褲,這是CSS的rotateY
效果:
1 2 3
| .item:nth-child(even) { transform: scaleX(1.31) rotateY(40deg); } .item:nth-child(odd) { transform: scaleX(1.31) rotateY(-40deg); }
|
參閱:MDN-rotateY()
[DEMO]