关于限制边界方法的通用性问题

关于限制边界方法的通用性问题

老师,以之前课程源码为例,如果元素在左上角顶格,就可以用movePoint.x<=0和movePoint.x>=视口宽-元素宽度 来限制边界,但是如果元素初始位置在任意坐标,比如课程里的右下角,那该如何判断?难道要先手动计算边界位置?

有没有通用的方法呢?

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

你好,可以将css中的定位换成transform,这样在js中设置移动的时候就是在当前移动的基础上进行移动的,可以将移动的距离也传入在函数中,设置在当前的坐标上,参考:

http://img1.sycdn.imooc.com//climg/5d1b0d760001715e06130264.jpg

http://img1.sycdn.imooc.com//climg/5d1b0d8b00018e5f05900499.jpg

http://img1.sycdn.imooc.com//climg/5d1b0dc30001407009030572.jpg

可以按照上图修改测试下,祝学习愉快!

  • 慕用6093692 提问者 #1
    老师,我发现只设置transform:translate3d(10px,0,0)后,就能正常限制边界了,没有在后面传参,这是为什么?
    2019-07-03 15:48:20
  • 慕用6093692 提问者 #2
    啊不是,看错了
    2019-07-03 15:54:01
  • 好帮手慕星星 回复 提问者 慕用6093692 #3
    你好,同学的疑惑解决了吗?
    2019-07-03 19:34:57
提问者 慕用6093692 2019-07-02 14:11:57
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>2-7</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }

      body {
        height: 2000px;
        background-color: rgba(255, 192, 203, 0.733);
      }

      #myDiv {
        width: 100px;
        height: 100px;
        position: relative;
        /* 重要!改变了元素的起始位置 */
        left: 10px;
        background-color: #ff0000;
      }
    </style>
  </head>

  <body>
    <div id="myDiv"></div>

    <script>
      drag(myDiv, {
        x: true,
        y: true
      });

      function drag(el, options) {
        options.x = typeof options.x !== "undefined" ? options.x : true;

        options.y = typeof options.y !== "undefined" ? options.y : true;

        if (!options.x && !options.y) return;

        var curPoint = {
            x: 0,
            y: 0
          },
          movePoint = {
            x: 0,
            y: 0
          },
          startPoint = {},
          isTouchMove = false;

        el.addEventListener(
          "touchstart",
          function(e) {
            var touch = e.changedTouches[0];
            startPoint.x = touch.pageX;
            startPoint.y = touch.pageY;
          },
          false
        );

        el.addEventListener(
          "touchmove",
          function(e) {
            isTouchMove = true;
            e.preventDefault();
            var touch = e.changedTouches[0],
              diffPoint = {};
            diffPoint.x = touch.pageX - startPoint.x;
            diffPoint.y = touch.pageY - startPoint.y;
            if (options.x === true) {
              movePoint.x = diffPoint.x + curPoint.x;
            }
            if (options.y === true) {
              movePoint.y = diffPoint.y + curPoint.y;
            }
            move(this, movePoint.x, movePoint.y);
          },
          false
        );

        el.addEventListener(
          "touchend",
          function(e) {
            if (!isTouchMove) return;
            curPoint.x = movePoint.x;
            curPoint.y = movePoint.y;
            isTouchMove = false;
          },
          false
        );

        function move(el, x, y) {
          //得到边界条件
          var limitWidth =
              document.documentElement.clientWidth - el.offsetWidth,
            limitHeight =
              document.documentElement.clientHeight - el.offsetHeight;
          //判断是否出界
          if (x <= 0) {
            x = 0;
          } else if (x >= limitWidth) {
            x = limitWidth;
          }

          if (y < 0) {
            y = 0;
          } else if (y > limitHeight) {
            y = limitHeight;
          }

          el.style.transform = "translate3d(" + x + "px, " + y + "px, 0)";
        }
      }
    </script>
  </body>
</html>

请老师看一下,我设置了元素的 left : 10px ,改变了元素的起始位置。

好帮手慕星星 2019-07-02 11:29:38

你好,

1、可以通过document.documentElement.offsetWidth和document.documentElement.offsetHeight获取页面的宽和高,然后再获取元素的宽高

2、判断元素的位置是否在边界处,例如右侧边界(页面宽度-元素宽度)就是元素在右侧边界的界限。

自己可以试着写一写,如果有问题,可以参考下面这个链接中的回复:

https://class.imooc.com/course/qadetail/126620

祝学习愉快!

  • 提问者 慕用6093692 #1
    不是的老师,我发现链接中的判断条件是相对元素起始位置的相对长度,链接中元素起始位置在页面的左上角,所以才能适用左边为0和右边为height-eleHeight两个限定条件。如果我改变了元素的起始位置,比如我给元素的css加了left:10px,这个时候判断左右边界条件就变成了<=-10和>=height-eleHeight+10,所以很明显这不是个通用的判断方法。所以我想问对于元素任意起始位置,判断限定条件有没有通用的方法,不能总是手动计算上下左右吧?
    2019-07-02 12:12:03
  • 好帮手慕星星 回复 提问者 慕用6093692 #2
    不管元素的起始位置在什么地方,这个判断方法都是使用的哦。判断的是元素停止的位置在什么地方,而不是元素起始位置在什么地方。可以将自己写的代码粘贴上来,老师帮助你测试下。
    2019-07-02 13:53:35
  • 提问者 慕用6093692 回复 好帮手慕星星 #3
    老师请看一下,我把代码粘贴在回答里
    2019-07-02 14:13:03
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
3.WebAPP开发与小程序
  • 参与学习           人
  • 提交作业       622    份
  • 解答问题       6815    个

微信带火了小程序,也让前端工程师有了更多的展现机会,本阶段带你从移动基础知识的学习到webAPP开发,及小程序开发,让你PC端与移动端两端通吃。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师