【问题标题】:Programmatically scroll ng-repeat with overflow:hidden以编程方式滚动 ng-repeat 并溢出:隐藏
【发布时间】:2014-04-25 23:03:52
【问题描述】:

我正在使用以下标记 (JADE) 使用 AngularJS 和 Foundation 构建分页。

ul.pagination
    li.arrow: a «
    li(ng-repeat="month in months | orderBy:'_id'" ng-class="month._id === shownMonth ? 'current' : ''")
        a(ng-href="#/months/{{month._id}}") {{ month._id | monthid:'short' }}   
    li.arrow#right-arrow: a »

在 CSS 中,我设置了 overflow: hidden。这让我明白了:

到目前为止完美,但显然这可能会很长。

当用户点击末尾的小箭头符号时,如何进行滚动?

我尝试过像 $(...).animate({left: '-=20'}) 这样的东西,但它只是被忽略了(我猜是因为 Foundation css)。有什么想法吗?

更新

我有一个半有效的解决方案,但它很难看。

我已将ng-show 条件附加到重复的列表项中:

li(ng-repeat="month in months | orderBy:'_id'" ng-class="month._id === shownMonth ? 'current' : ''" ng-show="month._id >= min && month._id <= max")

加载我的数据后我会这样做

$timeout(function() {
    var availableWidth = $('ul.pagination').width() - 2 * $('ul li.arrow').width();
    var itemWidth = $('li:not(.arrow)').width();
    var total = Math.floor(availableWidth / itemWidth);
    $scope.min = $scope.shownMonth - Math.floor(total / 2);
    $scope.max = $scope.shownMonth + Math.floor(total / 2);
});

然后我基本上只需要在箭头按钮的ng-click 处理程序中调整minmax。这或多或少是有效的,但由于某种原因,availableWidth 的计算结果比实际可用的空间要小得多 - 大约相差 600 像素!为什么?

【问题讨论】:

    标签: css angularjs scroll zurb-foundation angularjs-ng-repeat


    【解决方案1】:

    动画左侧位置没有意义。你想要动画的是水平滚动位置(element.scrollLeft)。

    另外,请考虑将您的箭头从月份列表中删除。它们在该列表中的语义上没有意义,当您只想滚动月份但将箭头留在原处时,它们最终会限制您。

    编辑添加小提琴:http://jsfiddle.net/R9QcB/5/ 我用 jQuery 做这个是为了快速,但 scrollLeft 是一个原生的 javascript 属性。

    这里实际上比 javascript 更重要的是 CSS:

    #pagination {
        text-align: center;
    }
        .nav {
            display: inline-block;
            vertical-align: middle;
        }
        ul {
            display: inline-block;
            vertical-align: middle;
            max-width: 75%;
            overflow: hidden;
            white-space: nowrap;
        }
            li {
                display: inline-block;
                list-style: none;
                color: #fff;
                background: #aaa;
                padding: 0.25em 0.5em;
                margin: 0 0.5em;
            }
    

    基本上,您需要一个可以更新其 scrollLeft 位置的包含元素。该包含元素有一个 overflow: hidden ,因此它的子元素位于容器内的一系列中(这是 white-space: nowrap 的结果)。

    【讨论】:

    • 我先尝试过,但是 scrollLeft 没有做任何事情 - 它只是被忽略了。我在ul 中有箭头,所以它们成为分页的一部分。
    • 是的,我认为 CSS 可能是关键,但 CSS 绝对不是我的强项。无论哪种方式,我都想避免绕过基础 CSS,所以我试图将您发布的内容整合到我拥有的内容中。而且,再次被忽视......你的魔法发生在哪里?你能再解释一下吗?
    • 神奇之处在于理解 CSS 的溢出属性以及 javascript 的 scrollTop 和 scrollLeft 属性。这是一个非常基本的示例:jsfiddle.net/9VajK #overflow-frame div 将具有一个可以轮询(以获取其位置)或更新(以设置其位置)的 scrollLeft 属性。在 jQuery 中,这个方法是 $.scrollLeft()。
    • 哈,我明白了!我开始在 Firefox 开发人员工具中手动禁用 Foundation 的 CSS 规则,直到它开始工作。结果他们在分页中对lis 应用了float: left。我不知道足够多的 CSS 来理解为什么它无法工作,但是将 float: none !important; 添加到我自己的样式表中就可以了。感谢您为我指明正确的方向!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    相关资源
    最近更新 更多