1. // html
    2. <div id="box"></div>
    3. // css
    4. #box {
    5. width: 200px;
    6. height: 200px;
    7. background: skyblue;
    8. position: absolute;
    9. left: 0;
    10. top: 0;
    11. }
    1. // 原生 JavaScript 实现
    2. const box = document.getElementById('box')
    3. box.onmousedown = function (event) {
    4. let distanceX = event.clientX - event.target.offsetLeft
    5. let distanceY = event.clientY - event.target.offsetTop
    6. document.onmousemove = function (event) {
    7. let positionX = event.clientX - distanceX
    8. let positionY = event.clientY - distanceY
    9. box.style.left = positionX + "px"
    10. box.style.top = positionY + "px"
    11. }
    12. box.onmouseup = function () {
    13. document.onmousemove = null
    14. }
    15. }
    1. // RxJS 实现
    2. import { fromEvent } from "rxjs"
    3. import { map, switchMap, takeUntil } from "rxjs/operators"
    4. const box = document.getElementById("box")
    5. fromEvent(box, "mousedown")
    6. .pipe(
    7. map(event => ({
    8. distanceX: event.clientX - event.target.offsetLeft,
    9. distanceY: event.clientY - event.target.offsetTop
    10. })),
    11. switchMap(({ distanceX, distanceY }) =>
    12. fromEvent(document, "mousemove").pipe(
    13. map(event => ({
    14. positionX: event.clientX - distanceX,
    15. positionY: event.clientY - distanceY
    16. })),
    17. takeUntil(fromEvent(document, "mouseup"))
    18. )
    19. )
    20. )
    21. .subscribe(({ positionX, positionY }) => {
    22. box.style.left = positionX + "px"
    23. box.style.top = positionY + "px"
    24. })