我想重新创建循环滚动框,如下面的GIF所示,

我不认为如果使用css创建一个循环滚动框是可能的,所以我想将padding-left添加到ul的每个子程序中,以使滚动框看起来是循环的。
为了达到这个目的,
将0 0px的填充添加到li-1
将2 2px的填充添加到li-2中
将4px的填充添加到li-3
将6px的填充添加到li-4中
在li-5中添加8 8px的填充。
将6px的填充添加到li-6中
将4px的填充添加到li-7中
将2 2px的填充添加到li-8中
将0 0px的填充添加到li-9中
在滚动填充可以更改为添加填充0px到li-2。
将2 2px的填充添加到li-3中
在li-4中添加4px的填充
将6px的填充添加到li-5中
在li-6中添加8 8px的填充。
将6px的填充添加到li-7中
在li-8中添加4px的填充
将2 2px的填充添加到li-9中
将0px的填充添加到li-10中,等等.
我的代码的问题是,当滚动框通过鼠标滚轮滚动时,它的行为是正确的,但是当用户使用滚动条中的滚动选项卡/滚动按钮时,填充量急剧增加。
到目前为止我的代码是:
var scrollBox = $(".circularScrollbox"),
num = $(".scrollboxList li").length,
vjListItem = $(".vjListItem"),
max = num * 3,
padding = 0,
currentPadding = padding,
scrollPos = scrollBox.scrollTop();
scrollBox.scroll(function() {
if (scrollPos < scrollBox.scrollTop() && currentPadding < max) {
currentPadding += 2;
vjListItem.css("padding", "0 0 0 " + currentPadding + "px");
} else if (scrollPos > scrollBox.scrollTop() && currentPadding > padding) {
currentPadding -= 2;
vjListItem.css("padding", "0 0 0 " + currentPadding + "px");
}
if (scrollBox.scrollTop() == 0) vjListItem.css("padding", padding + "px");
scrollPos = scrollBox.scrollTop();
});body {
display: flex;
flex-direction: column;
height: 95vh;
justify-content: center;
align-items: center;
background: #222;
color: #eee;
font-family: 'Ubuntu Mono', monospace;
}
.circularScrollbox {
width: 200px;
height: 10.6em;
padding: 0 2em;
overflow-Y: scroll;
background: #161616;
border: 2px solid aqua;
}
.circularScrollbox>ol {
list-style-type: none;
padding-left: 0;
}<head>
<link href="https://fonts.googleapis.com/css?family=Ubuntu+Mono" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<div class='circularScrollbox'>
<ol class='scrollboxList'>
<li class="vjListItem">Item 01</li>
<li class="vjListItem">Item 02</li>
<li class="vjListItem">Item 03</li>
<li class="vjListItem">Item 04</li>
<li class="vjListItem">Item 05</li>
<li class="vjListItem">Item 06</li>
<li class="vjListItem">Item 07</li>
<li class="vjListItem">Item 08</li>
<li class="vjListItem">Item 09</li>
<li class="vjListItem">Item 10</li>
<li class="vjListItem">Item 11</li>
<li class="vjListItem">Item 12</li>
<li class="vjListItem">Item 13</li>
<li class="vjListItem">Item 14</li>
<li class="vjListItem">Item 15</li>
<li class="vjListItem">Item 16</li>
<li class="vjListItem">Item 17</li>
<li class="vjListItem">Item 18</li>
<li class="vjListItem">Item 19</li>
<li class="vjListItem">Item 20</li>
<li class="vjListItem">Item 21</li>
<li class="vjListItem">Item 22</li>
<li class="vjListItem">Item 23</li>
<li class="vjListItem">Item 24</li>
<li class="vjListItem">Item 25</li>
<li class="vjListItem">Item 26</li>
<li class="vjListItem">Item 27</li>
<li class="vjListItem">Item 28</li>
<li class="vjListItem">Item 29</li>
<li class="vjListItem">Item 30</li>
<li class="vjListItem">Item 31</li>
<li class="vjListItem">Item 32</li>
<li class="vjListItem">Item 33</li>
<li class="vjListItem">Item 34</li>
<li class="vjListItem">Item 35</li>
<li class="vjListItem">Item 36</li>
<li class="vjListItem">Item 37</li>
<li class="vjListItem">Item 38</li>
<li class="vjListItem">Item 39</li>
<li class="vjListItem">Item 40</li>
</ol>
</div>
</body>
我肯定我把这个问题弄得太复杂了。是否有更容易达到这个效果的方法?
发布于 2019-03-02 21:29:09
这里有一个依赖于CSS的解决方案,只有很少的JS。诀窍是考虑shape-outside有曲线,JS只用于调整滚动体上形状的位置。
这是一个非常简单的方法,但您需要注意浏览器支持(https://caniuse.com/#feat=css-shapes)
var shape = document.querySelector(".left");
document.querySelector(".circularScrollbox").onscroll=function() {
shape.style.marginTop = this.scrollTop+"px";
};body {
display: flex;
flex-direction: column;
height: 95vh;
justify-content: center;
align-items: center;
background: #222;
color: #eee;
font-family: 'Ubuntu Mono', monospace;
}
.circularScrollbox {
width: 200px;
height: 10.6em;
padding: 0 2em;
overflow-Y: scroll;
background: #161616;
border: 2px solid aqua;
}
.circularScrollbox>ol {
list-style-type: none;
padding-left: 0;
}
.left {
float: left;
shape-outside: ellipse(50px 85px at 0% calc(100% - 85px));
width: 100px;
height: 100%;
margin-top:0;
}<link href="https://fonts.googleapis.com/css?family=Ubuntu+Mono" rel="stylesheet">
<div class='circularScrollbox'>
<div class="left"></div>
<ol class='scrollboxList'>
<li class="vjListItem">Item 01</li>
<li class="vjListItem">Item 02</li>
<li class="vjListItem">Item 03</li>
<li class="vjListItem">Item 04</li>
<li class="vjListItem">Item 05</li>
<li class="vjListItem">Item 06</li>
<li class="vjListItem">Item 07</li>
<li class="vjListItem">Item 08</li>
<li class="vjListItem">Item 09</li>
<li class="vjListItem">Item 10</li>
<li class="vjListItem">Item 11</li>
<li class="vjListItem">Item 12</li>
<li class="vjListItem">Item 13</li>
<li class="vjListItem">Item 14</li>
<li class="vjListItem">Item 15</li>
<li class="vjListItem">Item 16</li>
<li class="vjListItem">Item 17</li>
<li class="vjListItem">Item 18</li>
<li class="vjListItem">Item 19</li>
<li class="vjListItem">Item 20</li>
<li class="vjListItem">Item 21</li>
<li class="vjListItem">Item 22</li>
<li class="vjListItem">Item 23</li>
<li class="vjListItem">Item 24</li>
<li class="vjListItem">Item 25</li>
<li class="vjListItem">Item 26</li>
<li class="vjListItem">Item 27</li>
<li class="vjListItem">Item 28</li>
<li class="vjListItem">Item 29</li>
<li class="vjListItem">Item 30</li>
<li class="vjListItem">Item 31</li>
<li class="vjListItem">Item 32</li>
<li class="vjListItem">Item 33</li>
<li class="vjListItem">Item 34</li>
<li class="vjListItem">Item 35</li>
<li class="vjListItem">Item 36</li>
<li class="vjListItem">Item 37</li>
<li class="vjListItem">Item 38</li>
<li class="vjListItem">Item 39</li>
<li class="vjListItem">Item 40</li>
</ol>
</div>
发布于 2019-03-02 18:07:52
对于列表中的每一项,填充量取决于:
使用jQuery,$item.offset().top为您提供页面中项目的Y位置。
这包括滚动,因此当滚动框时,值就会下降。
现在$item.offset().top - $box.offset().top表示相对于盒子顶部的位置。
如果您滚动了框,以便项目23位于顶部,则其值将为0,而位于底部(但仍可见)的任何项的值都将是框的高度。
除以高度:($item.offset().top - $box.offset().top) / $box.height()
现在,每个(可见的)项都有一个介于0到1之间的值,它告诉您当前是在框的顶部、底部还是中间的某个位置!
然后,您可以使用如下三角函数:Math.sin(value*Math.PI) * maxPadding
https://stackoverflow.com/questions/54960845
复制相似问题