【问题标题】:jQuery scrollLeft not working with angularjQuery scrollLeft 不适用于 Angular
【发布时间】:2013-11-21 17:15:00
【问题描述】:

我正在尝试以编程方式滚动一个 div,水平溢出。我很有信心我的最终结果代码应该是这样的:

  var $element = $('#widgetRow');//or maybe $('#widgetRow').parent();
  //With 1 or more parent()'s

  var scrollLeft = $element.scrollLeft();
  $element.animate({'scrollLeft':scrollLeft + delta},10);

但我似乎找不到合适的元素,所以它不起作用,所以我写了这个小片段来测试所有父元素的滚动。

  $('#someDeepWidget').parents().each(function(){
     $(this).animate({'scrollLeft':300},10);
  });

有些元素滚动了,但不是我需要的。但是,正确的元素会水平滚动:

  $('#someDeepWidget').parents().each(function(){
    $(this).animate({'scrollTop':300},10);
  });

但我似乎无法弄清楚哪个元素会做出反应。我一直在我的 HTML 中放置 id 并定位它们,但是 scrollLeft 在我需要的元素上仍然失败。

我正在使用 Angular,但我不知道这是否会以某种方式产生干扰。

【问题讨论】:

    标签: javascript jquery css angularjs scroll


    【解决方案1】:

    Nehat(来自www.lin.net.nz: Problem: jQuery ScrollLeft Chrome Hidden Div)指出,这有时可以用

    来解决
      element.css({'overflow': 'auto'}).scrollLeft();
      element.css({'overflow': 'hidden'});
    

    这让我想知道,这行得通吗?

     $('#someDeepWidget').parents().each(function(){
       $(this).css({'overflow': 'auto'}).animate({'scrollLeft':300},10);
       $(this).css({'overflow': 'hidden'});
     });
    

    就像魔术一样滚动内容!

    有了这些知识,我在 Chrome 中逐步提高了 HTML 的元素,在我修改我的 html 文档并尝试解决方案之前,在 Chrome 中我注意到 Angular 正在向我的页面添加这个元素:

    <div data-role="page" data-url="/" tabindex="0" class="ui-page ui-page-theme-a ui-page-active">
    

    所以我为这个新发现的元素添加了一个 css 规则:

    [data-role="page"]{
      overflow:auto;
    }
    

    最终代码如下所示:

    app.directive("gphBubbleHorizontalScrolling", function($swipe) {
      'use strict';
      return {
        restrict: 'EA',
        link: function(scope, ele, attrs, ctrl) {
          $swipe.bind(ele, {
            'start': function(coords,event) {
              startX = coords.x;
              startY = coords.y;
            },
            'move': function(coords) {
              pointX = coords.x;
              pointY = coords.y;
              if(pointY < startY + 20 && pointY > startY - 20){
                var delta =  startX - pointX;
                $('[data-role="page"]').animate({'scrollLeft':scrollLeft + delta},10);
                var scrollLeft = $('[data-role="page"]').scrollLeft();
              }
            }
          });
        }
      }
    }
    

    【讨论】:

    • 奇怪,这确实有效!我也在使用 angular 并尝试使用 scrollLeft 并且无法使其工作,但将其设置为 auto,然后 scrollLeft 然后隐藏工作。但它在 IE 11 中闪烁非常糟糕。
    【解决方案2】:

    加载页面时,我必须水平滚动到网格上 2/3 的特定列,并且我有固定数量的列,所以我采用了一种非常简单的方法。

    $(".ngViewport").scrollLeft(($("#datagrid").width())/4);
    
    1. 我毫不费力地使用了来自 jQuery 的 ngViewportscrollLeft.ngViewport 以任何 ng 网格为目标。我使用#datagrid 并转换了宽度值。
    2. 在加载我的数据网格时,我除以 4 得到中间的列,并且我的数据具有固定数量的列,因此我的工作就像一个魅力。

    【讨论】:

      猜你喜欢
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      • 1970-01-01
      • 2016-08-18
      相关资源
      最近更新 更多