【问题标题】:Make HTML5 draggable items scroll the page?使 HTML5 可拖动项目滚动页面?
【发布时间】:2013-09-19 12:29:26
【问题描述】:

我在我网页上的一些 div 上使用了 HTML5 属性 draggable = "true"。我想要这样,当您将其中一项拖动到页面底部时,它会向下滚动页面,当您将其拖动到顶部时,它会向上滚动页面。

我最终会在我的侧边栏上创建一个播放列表,由于它不会始终显示在页面上,具体取决于您在页面上查看的位置,因此页面需要在您拖动时滚动。

我的页面是here,您可以尝试拖动帖子的图片。在 Chrome 上,当我拖动到底部时,它会自动让我向下滚动,但不能向上滚动。在 Firefox 上,它不会自动让我滚动任一方向。有什么帮助吗?

这里有一个简单的jsfiddle 可以帮助您入门。在 Chrome 上,您应该能够向下拖动 Google 图标并让它向下滚动页面,但不能向上滚动。

【问题讨论】:

  • 你可以制作一个 javascript/jquery 解决方案,但我会等待发布它,因为我想知道是否有其他方法
  • @Breezer 为什么不让 OP 决定您的方法是否适合他? :)
  • @wei2912 因为您认为任何在窗口内实现可拖动功能的人都会想到这一点并为此制定了解决方案。
  • @Breezer 你有使用 javascript 或 jquery 的好解决方案吗?我原以为浏览器会足够聪明,可以自动执行此操作,但我想不会……
  • 对 Chrome 的提示:如果您将光标放在视点上端的正下方(也就是收藏夹或地址栏下方),它会让您向上滚动页面

标签: javascript html draggable


【解决方案1】:

这是一个代码,当您拖动某些东西时,它会向上或向下滚动您的页面。只需将拖动的对象放在页面的顶部或底部。 :)

    var stop = true;
    $(".draggable").on("drag", function (e) {

        stop = true;

        if (e.originalEvent.clientY < 150) {
            stop = false;
            scroll(-1)
        }

        if (e.originalEvent.clientY > ($(window).height() - 150)) {
            stop = false;
            scroll(1)
        }

    });

    $(".draggable").on("dragend", function (e) {
         stop = true;
    });

    var scroll = function (step) {
        var scrollY = $(window).scrollTop();
        $(window).scrollTop(scrollY + step);
        if (!stop) {
            setTimeout(function () { scroll(step) }, 20);
        }
    }

【讨论】:

  • 您好,欢迎来到 StackOverflow!在回答问题时,在回答中加入一些解释通常会很有帮助(而不仅仅是块代码)。谢谢!
  • 我为容器元素内的水平滚动修改了它...将 x 更改为 y,但请确保将 $(element).offset().left 位置作为左边缘。
  • 这个回复和相关的投票有点令人困惑。在 HTML5 拖动期间,拖动事件不会暴露任何与拖动相关的坐标。我不明白如果没有这些数据,这将如何工作......
  • 这是一个优雅的答案,鼓励我坚持使用原生 html5 拖动,你能更新它的 x 轴吗?
  • @kamelkev。它确实有效,但仅在移动设备上,在桌面上使用时 e.originalEvent.clientY 始终为 0
【解决方案2】:

我制作了一个简单的 JavaScript 拖放类。它可以在拖动时自动向上或向下滚动页面。 请参阅此jsfiddle。也可以在我的github 页面上找到。 现在不建议高速拖动。我需要解决这个问题。

下面的代码是库的一部分。

var autoscroll = function (offset, poffset, parentNode) {
  var xb = 0;
  var yb = 0;
  if (poffset.isBody == true) {
    var scrollLeft = poffset.scrollLeft;
    var scrollTop = poffset.scrollTop;
    var scrollbarwidth = (document.documentElement.clientWidth - document.body.offsetWidth); //All
    var scrollspeed = (offset.right + xb) - (poffset.right + scrollbarwidth);
    if (scrollspeed > 0) {
      this.scrollLeft(parentNode, scrollLeft + scrollspeed);
    }
    scrollspeed = offset.left - (xb);
    if (scrollspeed < 0) {
      this.scrollLeft(parentNode, scrollLeft + scrollspeed);
    }
    scrollspeed = (offset.bottom + yb) - (poffset.bottom);
    if (scrollspeed > 0) {
      this.scrollTop(parentNode, scrollTop + scrollspeed);
    }
    scrollspeed = offset.top - (yb);
    if (scrollspeed < 0) {
      this.scrollTop(parentNode, scrollTop + scrollspeed);
    }
  } else {
    var scrollLeft = offset.scrollLeft;
    var scrollTop = offset.scrollTop;
    var scrollbarwidth = parentNode.offsetWidth - parentNode.clientWidth; //17
    var scrollbarheight = parentNode.offsetHeight - parentNode.clientHeight; //17
    var scrollspeed = (offset.right + xb) - (poffset.right - scrollbarwidth);
    if (scrollspeed > 0) {
      this.scrollLeft(parentNode, scrollLeft + scrollspeed);
    }
    scrollspeed = offset.left - (xb + poffset.left);
    if (scrollspeed < 0) {
      this.scrollLeft(parentNode, scrollLeft + scrollspeed);
    }
    scrollspeed = (offset.bottom + scrollbarheight + yb) - (poffset.bottom);
    if (scrollspeed > 0) {
      this.scrollTop(parentNode, scrollTop + scrollspeed);
    }
    scrollspeed = offset.top - (yb + poffset.top);
    if (scrollspeed < 0) {
      this.scrollTop(parentNode, scrollTop + scrollspeed);
    }
  }
};

【讨论】:

    【解决方案3】:

    如果你想使用 dragable 你应该知道它现在是 HTML 5 特性,它的 jQuery,所以在这里查看 http://jqueryui.com/draggable/..

    这样使用

    $( "#draggable" ).draggable();
    

    http://jsfiddle.net/dFPVr/7/

    【讨论】:

    • 我知道你可以在 jQuery 中做到这一点,但我说的也是真的。他们在 HTML5 标准中添加了拖放功能。见html5rocks.com/en/tutorials/dnd/basics。我不想用jQuery来做,我想实现HTML5标准。
    • 是的,他们添加了拖放功能,但如果您不想要 JQ,则需要使用 JS,因为拖动对象时滚动不可用
    猜你喜欢
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多