首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在jquery中创建垂直滚动div?

问如何在jquery中创建垂直滚动div?
EN

Stack Overflow用户
提问于 2019-04-26 18:33:12
回答 2查看 3.1K关注 0票数 6

我正在创建垂直自动滚动div使用jquery与动画..。我已经完成了它的创建,但是唯一的问题是当我向下滚动到列表div的中间时,div正在滚动,它将窗口推上滚动列表div。我不知道问题出在哪里。然而,当我试图给列表div宽度(以像素为单位)时,它不会向上推.

试着向下滚动到滚动列表div的中间。你会明白问题出在哪里。谢谢..。

​

代码语言:javascript
复制
setInterval(function(){
  $('#list').stop().animate({scrollTop:40}, 400, 'swing', function(){
    $(this).scrollTop(0).find('div:last').after($('div:first', this));
  });
}, 1000);
代码语言:javascript
复制
* {
  box-sizing: border-box;
}

body {
  height: 1000px;
}

#list {
  overflow: hidden;
  width: 100%;
  height: 250px;
  background: red;
  padding: 10px;
  margin-top: 100px;
}

#list div {
  display: block;
  height: 30px;
  padding: 10px 10px;
  margin-bottom: 10px;
  background: yellow;
}

.item:last-child {
  margin-bottom: 0px;
}
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id="list">
  <div>Item 1</div>
  <div>Item 2</div>
  <div>Item 3</div>
  <div>Item 4</div>
  <div>Item 5</div>
  <div>Item 6</div>
  <div>Item 7</div>
  <div>Item 8</div>
  <div>Item 9</div>
  <div>Item 10</div>   
</div>

​

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-30 09:14:59

多奇怪的虫子啊。据我所知,由于第一个元素的removal/insertion到列表的末尾,这会导致Chrome重新呈现列表,从而导致scrollY偏移量的更改。

就我个人而言,我可以想出两种方法来解决这个问题。

1)从DOM流.中删除div (#list)

注意:这需要将#list元素包装在containing元素中。

因为将元素移除/追加到#list元素,这将导致重流发生(?)。最初,我认为使用position: absolute可以解决这个问题,因为您不再影响DOM流。但是,即使是position: absolute也会导致滚动位置跳转。

然后我看了看position: fixed,它确实工作(因为它基本上是坐在所有的上面)--这显然是行不通的,因为您希望列表与页面一起滚动!那么,我们怎样才能避开这一切呢?

transform去营救!

让我们利用一下transform quirk!通常,当一个元素是position: fixed时,它相对于视图端口。但是,如果一个祖先元素有一个transformation,那么fixed定位的元素将相对于转换的元素。让我们试试看!

正如我提到的,您需要应用包装/包含元素来进行转换。在下面的代码片段中,我用一个新的#list包装了您的div#transformed元素。

CSS的更改是直接的,看起来如下:

代码语言:javascript
复制
#transformed { transform: translateZ(0); }
#list { position: fixed; }

就这样!请查看下面的代码片段,以查看它在运行中的情况。

​

代码语言:javascript
复制
setInterval(function(){
  $('#list').stop().animate({scrollTop:40}, 400, 'swing', function(){
    $(this).find('div:last').after($('div:first', this));
  });
}, 1000);
代码语言:javascript
复制
* {
  box-sizing: border-box;
}

body {
  height: 1000px;
}

#transformed {
  transform: translateZ(0);
}

#list {
  position: fixed;
  overflow: hidden;
  width: 100%;
  height: 250px;
  background: red;
  padding: 10px;
  margin-top: 100px;
}

#list div {
  display: block;
  height: 30px;
  padding: 10px 10px;
  margin-bottom: 10px;
  background: yellow;
}

.item:last-child {
  margin-bottom: 0px;
}
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="transformed">
  <div id="list">
    <div>Item 1</div>
    <div>Item 2</div>
    <div>Item 3</div>
    <div>Item 4</div>
    <div>Item 5</div>
    <div>Item 6</div>
    <div>Item 7</div>
    <div>Item 8</div>
    <div>Item 9</div>
    <div>Item 10</div>   
  </div>
</div>

​

2)滑动层

至于解决这一问题的第二种方法,这更多的是关于如何处理这个问题的讨论/意见(因此,不幸的是,无法提供代码)。

与其操作scrollTop,我将研究一种“滑动”层方法(使用transformY或top)。

你会发现基于JS的传送带采用类似的方法(够有趣的是,传送带倾向于使用滚动-偏移方式-类似于这个问题,或者“滑动”层方法!)他们只是倾向于水平地去做)

至于您操作的层,我再次建议从DOM流(所以是position: absolute)中删除它。理论上,操作这一层不应影响滚动偏移量..。

无论如何,希望这是有帮助的,并且position: fixed方法对您有用:)

编辑

关于您的评论,您可以通过反转您的setInterval逻辑来实现“向下”滚动。但是,您需要将要滚动的元素移动到列表的顶部,偏移scrollTop,然后滚动到列表的底部,而不是滚动并移动刚才滚动到列表底部的项。

下面是一个演示的片段:

​

代码语言:javascript
复制
setInterval(function(){
    $('#list')
        .find('div:first')
        .before($('div:last', '#list'))
        .end()
        .scrollTop(40)
        .stop()
    .animate({scrollTop:0}, 400, 'swing');
}, 1000);
代码语言:javascript
复制
* {
  box-sizing: border-box;
}

body {
  height: 1000px;
}

#transformed {
  transform: translateZ(0);
}

#list {
  position: fixed;
  overflow: hidden;
  width: 100%;
  height: 250px;
  background: red;
  padding: 10px;
  margin-top: 100px;
}

#list div {
  display: block;
  height: 30px;
  padding: 10px 10px;
  margin-bottom: 10px;
  background: yellow;
}

.item:last-child {
  margin-bottom: 0px;
}
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="transformed">
  <div id="list">
    <div>Item 1</div>
    <div>Item 2</div>
    <div>Item 3</div>
    <div>Item 4</div>
    <div>Item 5</div>
    <div>Item 6</div>
    <div>Item 7</div>
    <div>Item 8</div>
    <div>Item 9</div>
    <div>Item 10</div>
  </div>
</div>

​

编辑2:

关于上/下按钮,您可以轻松地通过组合我们到目前为止编写的两个脚本来实现这一点!以下是两个当您单击时向上/向下动画的片段(第一个将在每次单击时滚动,第二个片段将更改动画方向):

​

代码语言:javascript
复制
function animateList(direction) {
if (direction === 'down') {
    $('#list')
        .find('div:first')
        .before($('div:last', '#list'))
        .end()
        .scrollTop(40)
        .stop()
        .animate({scrollTop:0}, 400, 'swing');
} else {
    $('#list')
        .animate({scrollTop:40}, 400, 'swing', function(){
            $(this)
                .find('div:last')
                .after($('div:first', this));
        });
}
}

$('button').on('click', function () {
var direction = $(this).attr('id');
animateList(direction);
});
代码语言:javascript
复制
* {
  box-sizing: border-box;
}

body {
  height: 1000px;
}

#transformed {
  transform: translateZ(0);
}

#list {
  position: fixed;
  overflow: hidden;
  width: 100%;
  height: 250px;
  background: red;
  padding: 10px;
  margin-top: 100px;
}

#list div {
  display: block;
  height: 30px;
  padding: 10px 10px;
  margin-bottom: 10px;
  background: yellow;
}

.item:last-child {
  margin-bottom: 0px;
}
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="transformed">
  <div id="list">
    <div>Item 1</div>
    <div>Item 2</div>
    <div>Item 3</div>
    <div>Item 4</div>
    <div>Item 5</div>
    <div>Item 6</div>
    <div>Item 7</div>
    <div>Item 8</div>
    <div>Item 9</div>
    <div>Item 10</div>
  </div>
</div>

<button id="up">Scroll Up</button>
<button id="down">Scroll Down</button>

​

以及改变方向的片段:

​

代码语言:javascript
复制
var interval;
function animateList(direction) {
    // Reset interval
    if (interval) {
        clearInterval(interval);
    }
    if (direction === 'down') {
        interval = setInterval(function () {
            $('#list')
                .find('div:first')
                .before($('div:last', '#list'))
                .end()
                .scrollTop(40)
                .stop()
                .animate({scrollTop:0}, 400, 'swing');
        }, 1000);
    } else {
        interval = setInterval(function () {
            $('#list')
                .animate({scrollTop:40}, 400, 'swing', function(){
                    $(this)
                        .find('div:last')
                        .after($('div:first', this));
                });

        }, 1000);
    }
}
$('button').on('click', function () {
    var direction = $(this).attr('id');
    animateList(direction);
});

// Initial animation
animateList('up');
代码语言:javascript
复制
* {
  box-sizing: border-box;
}

body {
  height: 1000px;
}

#transformed {
  transform: translateZ(0);
}

#list {
  position: fixed;
  overflow: hidden;
  width: 100%;
  height: 250px;
  background: red;
  padding: 10px;
  margin-top: 100px;
}

#list div {
  display: block;
  height: 30px;
  padding: 10px 10px;
  margin-bottom: 10px;
  background: yellow;
}

.item:last-child {
  margin-bottom: 0px;
}
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="transformed">
  <div id="list">
    <div>Item 1</div>
    <div>Item 2</div>
    <div>Item 3</div>
    <div>Item 4</div>
    <div>Item 5</div>
    <div>Item 6</div>
    <div>Item 7</div>
    <div>Item 8</div>
    <div>Item 9</div>
    <div>Item 10</div>
  </div>
</div>

<button id="up">Scroll Up</button>
<button id="down">Scroll Down</button>

​

票数 3
EN

Stack Overflow用户

发布于 2019-04-26 19:13:07

我已经把你的内心世界变成了一个无序的列表。我最初添加了一个overflow-y:scroll,它也起作用,但在看到您的评论时将其更改为overflow-y:hidden。我找到了但两样都有用。如果您向下滚动页面,然后向上滚动,它不会“重新开始”(除非它有时间迭代所有的10个列表项)。您可能需要调整css/box的高度,以获得底部的红色边框,但这将留给您处理。

希望这能有所帮助

溢出-隐藏:

​

代码语言:javascript
复制
setInterval(function() {
  $('#ulList').stop().animate({
    scrollTop: 40
  }, 400, 'swing', function() {
    $(this).scrollTop(0).find('li:last').after($('li:first', this));
  });
}, 1000);
代码语言:javascript
复制
* {
  box-sizing: border-box;
}

body {
  height: 1000px;
}

#list {
  overflow-y:hidden;
  width: 100%;
  height: 250px;
  background: red;
  padding: 10px;
  margin-top: 100px;
}

#list ul {
  margin: 10px 10px;
  padding: 10px 0px;
}

#list ul li {
  display: block;
  height: 30px;
  margin-bottom: 10px;
  background: yellow;
}

.item:last-child {
  margin-bottom: 0px;
}
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="list">
  <ul id="ulList">
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
    <li>Item 4</li>
    <li>Item 5</li>
    <li>Item 6</li>
    <li>Item 7</li>
    <li>Item 8</li>
    <li>Item 9</li>
    <li>Item 10</li>
  </ul>

</div>

​

溢出:滚动

​

代码语言:javascript
复制
setInterval(function() {
  $('#ulList').stop().animate({
    scrollTop: 40
  }, 400, 'swing', function() {
    $(this).scrollTop(0).find('li:last').after($('li:first', this));
  });
}, 1000);
代码语言:javascript
复制
* {
  box-sizing: border-box;
}

body {
  height: 1000px;
}

#list {
  overflow-y:scroll;
  width: 100%;
  height: 250px;
  background: red;
  padding: 10px;
  margin-top: 100px;
}

#list ul {
  margin: 10px 10px;
  padding: 10px 0px;
}

#list ul li {
  display: block;
  height: 30px;
  margin-bottom: 10px;
  background: yellow;
}

.item:last-child {
  margin-bottom: 0px;
}
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="list">
  <ul id="ulList">
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
    <li>Item 4</li>
    <li>Item 5</li>
    <li>Item 6</li>
    <li>Item 7</li>
    <li>Item 8</li>
    <li>Item 9</li>
    <li>Item 10</li>
  </ul>

</div>

​

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55873215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档