当前位置: 首页 > 面试题库 >

使用jQuery在拖动时滚动页面

王伯寅
2023-03-14
问题内容

我已经尝试过使用dynamic.js和下面的代码,但是,当我在IE11中尝试此操作时,每次滚动时它都会一直跳到顶部:

$("html").kinetic();

我想使页面在平板电脑,IE10和11上可滚动,以便用户可以像在移动设备上一样向上推动页面以向下滚动。

如何在不跳到顶部的情况下在纯JS或jQuery中做到这一点?


问题答案:

您可以通过记录单击时鼠标的位置以及被拖动时的当前位置来非常简单地完成此操作。尝试这个:

var clicked = false, clickY;
$(document).on({
    'mousemove': function(e) {
        clicked && updateScrollPos(e);
    },
    'mousedown': function(e) {
        clicked = true;
        clickY = e.pageY;
    },
    'mouseup': function() {
        clicked = false;
        $('html').css('cursor', 'auto');
    }
});

var updateScrollPos = function(e) {
    $('html').css('cursor', 'row-resize');
    $(window).scrollTop($(window).scrollTop() + (clickY - e.pageY));
}

为了防止拖动时选择文本,请添加以下CSS:

body {
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
}

更新资料

这是上述版本的jQuery插件,已扩展为允许通过设置进行垂直和水平滚动。它还允许您更改已cursor使用的。

(function($) {

  $.dragScroll = function(options) {

    var settings = $.extend({

      scrollVertical: true,

      scrollHorizontal: true,

      cursor: null

    }, options);



    var clicked = false,

      clickY, clickX;



    var getCursor = function() {

      if (settings.cursor) return settings.cursor;

      if (settings.scrollVertical && settings.scrollHorizontal) return 'move';

      if (settings.scrollVertical) return 'row-resize';

      if (settings.scrollHorizontal) return 'col-resize';

    }



    var updateScrollPos = function(e, el) {

      $('html').css('cursor', getCursor());

      var $el = $(el);

      settings.scrollVertical && $el.scrollTop($el.scrollTop() + (clickY - e.pageY));

      settings.scrollHorizontal && $el.scrollLeft($el.scrollLeft() + (clickX - e.pageX));

    }



    $(document).on({

      'mousemove': function(e) {

        clicked && updateScrollPos(e, this);

      },

      'mousedown': function(e) {

        clicked = true;

        clickY = e.pageY;

        clickX = e.pageX;

      },

      'mouseup': function() {

        clicked = false;

        $('html').css('cursor', 'auto');

      }

    });

  }

}(jQuery))



$.dragScroll();


/* Note: CSS is not relevant to the solution.

   This is only needed for this demonstration */



body,

html {

  padding: 0;

  margin: 0;

}



div {

  height: 1000px;

  width: 2000px;

  border-bottom: 3px dashed #EEE;

  /* gradient is only to make the scroll movement more obvious */

  background: rgba(201, 2, 2, 1);

  background: -moz-linear-gradient(-125deg, rgba(201, 2, 2, 1) 0%, rgba(204, 0, 204, 1) 16%, rgba(94, 0, 201, 1) 31%, rgba(0, 153, 199, 1) 43%, rgba(0, 199, 119, 1) 56%, rgba(136, 199, 0, 1) 69%, rgba(199, 133, 0, 1) 83%, rgba(107, 0, 0, 1) 100%);

  background: -webkit-gradient(left top, right bottom, color-stop(0%, rgba(201, 2, 2, 1)), color-stop(16%, rgba(204, 0, 204, 1)), color-stop(31%, rgba(94, 0, 201, 1)), color-stop(43%, rgba(0, 153, 199, 1)), color-stop(56%, rgba(0, 199, 119, 1)), color-stop(69%, rgba(136, 199, 0, 1)), color-stop(83%, rgba(199, 133, 0, 1)), color-stop(100%, rgba(107, 0, 0, 1)));

  background: -webkit-linear-gradient(-125deg, rgba(201, 2, 2, 1) 0%, rgba(204, 0, 204, 1) 16%, rgba(94, 0, 201, 1) 31%, rgba(0, 153, 199, 1) 43%, rgba(0, 199, 119, 1) 56%, rgba(136, 199, 0, 1) 69%, rgba(199, 133, 0, 1) 83%, rgba(107, 0, 0, 1) 100%);

  background: -o-linear-gradient(-125deg, rgba(201, 2, 2, 1) 0%, rgba(204, 0, 204, 1) 16%, rgba(94, 0, 201, 1) 31%, rgba(0, 153, 199, 1) 43%, rgba(0, 199, 119, 1) 56%, rgba(136, 199, 0, 1) 69%, rgba(199, 133, 0, 1) 83%, rgba(107, 0, 0, 1) 100%);

  background: -ms-linear-gradient(-125deg, rgba(201, 2, 2, 1) 0%, rgba(204, 0, 204, 1) 16%, rgba(94, 0, 201, 1) 31%, rgba(0, 153, 199, 1) 43%, rgba(0, 199, 119, 1) 56%, rgba(136, 199, 0, 1) 69%, rgba(199, 133, 0, 1) 83%, rgba(107, 0, 0, 1) 100%);

  background: linear-gradient(-110deg, rgba(201, 2, 2, 1) 0%, rgba(204, 0, 204, 1) 16%, rgba(94, 0, 201, 1) 31%, rgba(0, 153, 199, 1) 43%, rgba(0, 199, 119, 1) 56%, rgba(136, 199, 0, 1) 69%, rgba(199, 133, 0, 1) 83%, rgba(107, 0, 0, 1) 100%);

  filter: progid: DXImageTransform.Microsoft.gradient( startColorstr='#c90202', endColorstr='#6b0000', GradientType=1);

  color: #EEE;

  padding: 20px;

  font-size: 2em;

}



body {

  -webkit-touch-callout: none;

  -webkit-user-select: none;

  -khtml-user-select: none;

  -moz-user-select: none;

  -ms-user-select: none;

  user-select: none;

}


<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div>First...</div>



<div>Second...</div>


 类似资料:
  • 我的Webapp中的滚动条应该只滚动“内容”部分。但是一旦我滚动到内容的末尾或顶部,滚动条就会滚动页眉或页脚。页面也会被拖动,看起来很难看。 以下是一些图片: http://imgur.com/1xNLenx、5EVjBuH、WDo0UAa、Kd3bzy5#0 页眉和页脚位置固定。 标题: 页脚: 我如何防止这种行为?谢谢你。

  • 我尝试在JTable中捕获鼠标滚轮事件。不拖动时,它接收MouseWheelMove事件,但拖动时,它什么也不接收。我的猜测是鼠标滚轮事件被传递给与TransferHandler相关的东西,而不是JTable。 如何在拖动时检测鼠标滚轮运动?只要达到我的目的,任何其他方法都是受欢迎的。

  • 我有一个问题与自动滚动在滚动视图。 在我的例子中,有两个Recyclerview。第一个循环视图,水平滚动,第二个垂直滚动。第一个循环视图仅用于拖动,第二个循环视图只用于拖放。两个循环视图都在ScrollView中,所以我在第二个循环视图中禁用了垂直滚动。我在第二个Recyclerview的项目中添加了DragListener。每个项目都有一个拖动侦听器,因此我在拖放项目时添加/替换项目。 所以我

  • 本文向大家介绍jQuery实现页面滚动时智能浮动定位,包括了jQuery实现页面滚动时智能浮动定位的使用技巧和注意事项,需要的朋友参考一下 话不多说,请看代码: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • 我目前正在使用JavaFX ScrollBar控件,它本身运行良好-但是我对拖动拇指时的“动画”不满意。 更具体地说: 当我快速拖动拇指时,快速加速-拇指动画不会立即跟随,但有点“滞后”-当我停止拖动拇指时的相同行为。。。拇指真正开始/追上预定位置需要一秒钟的时间 这不是繁重的布局计算之类的问题,因为我只是单独渲染ScrollBar而没有任何内容。 是否有一些选项可以让这个“加速动画”/“滞后”消

  • 问题内容: 我已经设置了一个片段,当单击该片段时会将页面部分滚动到视图中,问题是,如果用户想在动画中间滚动,则滚动会有点断断续续。 如果用户手动滚动,如何停止jquery动画? 问题答案: 将功能更改为此: 这将: 如果用户手动滚动(仅在动画过程中),则停止动画 不会妨碍您正常的jQuery动画,例如其他一些答案 一些额外的信息: 您为什么要绑定所有这些事件?“滚动鼠标滚轮等…” 有许多不同类型的