键盘的方向键控制div 进行上下左右移动,上左下右等斜方移动

2017, Jan 21    

写这个东西很简单,主要是组合键的处理,div移动的方式有很多,我用的最简单的方式就是 父容器relative,需要子滑块absolute。 这样控制子滑块的left 和 top 就可以控制它移动了。 组合键的方式也很简单,当 keydown 的时候,将keyCode 放入一个Set里面 , 然后将 将这个set遍历 进行移动操作, 如果 set里面有 ↑← 的keyCode 就执行 上移左移操作。 keyup的时候就从 Set里面delete 对于的keyCode。 这样就实现了 组合键的移动。

演示(按 上下左右 可以滑动 SLIDE )

SLIDE

CodePen: CodePen Address

CSS

.move-container{
  width: 800px;
  height: 500px;
  background: #000;
  margin:auto;
  margin-top:80px;
  position: relative;
}
.move-element{
  width: 80px;
  height: 60px;
  background:#fff;
}

HTML(pug)

div.move-container
  div.move-element#move SLIDE

JS

class absMover  {
  constructor(el, stepPx = 1) {
    this.el = el
    this.stepPx = stepPx
    this.offsetLeft = el.offsetLeft
    this.offsetTop = el.offsetTop
  }

   render () {
     this.el.setAttribute('style',
`position:absolute;top:${this.offsetTop}px;left:${this.offsetLeft}px`)
  }

  moveLeft () {
    this.offsetLeft -= this.stepPx
    this.render()
  }
  moveRight () {
    this.offsetLeft += this.stepPx
    this.render()
  }
  moveTop () {
    this.offsetTop -= this.stepPx
    this.render()
  }
  moveBottom () {
    this.offsetTop += this.stepPx
    this.render()
  }

}

const move = document.getElementById('move')
const mover = new absMover(move, 1)

function eventKeyDown (key) {
  switch (key) {
    case 37:
      mover.moveLeft()
      break
    case 38:
      mover.moveTop()
      break
    case 39:
      mover.moveRight()
      break
    case 40:
      mover.moveBottom()
      break
  }
}
let keyDownSet = new Set()

function moveSlide() {
  keyDownSet.forEach(key => eventKeyDown(key))
}

document.addEventListener('keydown', (e) => {
  e.preventDefault()
  keyDownSet.add(e.keyCode)
  moveSlide()
})
document.addEventListener('keyup', (e) => {
  keyDownSet.delete(e.keyCode)
})