| <!doctype html> |
| <style> |
| body { |
| margin: 0; |
| padding: 0; |
| } |
| |
| div { |
| position: absolute; |
| width: 50px; |
| height: 50px; |
| left: 0; |
| top: 0; |
| } |
| |
| #TR { |
| left: 206px; |
| } |
| |
| #BL { |
| top: 206px; |
| } |
| |
| #BR { |
| left: 206px; |
| top: 206px; |
| } |
| |
| #container { |
| width: 256px; |
| height: 256px; |
| left: 0; |
| top: 0; |
| border: 1px solid black; |
| } |
| |
| #slide { |
| background: silver; |
| z-index: 1; |
| } |
| </style> |
| <body> |
| <div id="container"> |
| <div id="slide"></div> |
| <div id="TR"></div> |
| <div id="BR"></div> |
| <div id="BL"></div> |
| </div> |
| <script> |
| let offset |
| let mouseDown = false |
| let slide = document.getElementById('slide') |
| slide.addEventListener('mousedown', function (e) { |
| mouseDown = true |
| |
| let bbox = slide.getBoundingClientRect() |
| offset = { |
| x: e.clientX - bbox.left, |
| y: e.clientY - bbox.top, |
| } |
| }) |
| |
| let container = document.getElementById('container') |
| |
| let slideBox = slide.getBoundingClientRect() |
| let containerBox = container.getBoundingClientRect() |
| let maxLeft = containerBox.width - slideBox.width - 2 |
| let maxTop = containerBox.height - slideBox.height - 2 |
| |
| container.addEventListener('mousemove', function (e) { |
| if (!mouseDown) return |
| |
| let bbox = slide.getBoundingClientRect() |
| let newLeft = e.clientX - offset.x |
| newLeft = Math.max(newLeft, 0) |
| newLeft = Math.min(newLeft, maxLeft) |
| |
| let newTop = e.clientY - offset.y |
| newTop = Math.max(newTop, 0) |
| newTop = Math.min(newTop, maxTop) |
| |
| slide.style.top = `${newTop}px` |
| slide.style.left = `${newLeft}px` |
| }) |
| |
| document.body.addEventListener('mouseup', function () { |
| mouseDown = false |
| }) |
| </script> |
| </body> |