Javascript 很难让旋转器按我需要的方式工作

Javascript 很难让旋转器按我需要的方式工作,javascript,jquery,Javascript,Jquery,我已经在这个微调器控件上工作了几天,虽然我没有太多的运气让它按我需要的方式工作。它最初是我在别处找到的代码,并根据我自己的需要重新调整了用途——所以我有点不知所措 HTML: <ul class="picker"> <li class="pickerItem"><span class="value">1st Item Test</span></li> <li class="pickerItem"><sp

我已经在这个微调器控件上工作了几天,虽然我没有太多的运气让它按我需要的方式工作。它最初是我在别处找到的代码,并根据我自己的需要重新调整了用途——所以我有点不知所措

HTML:

<ul class="picker">
    <li class="pickerItem"><span class="value">1st Item Test</span></li>
    <li class="pickerItem"><span class="value">2nd Item Test</span></li>
    <li class="pickerItem"><span class="value">3rd Item Test</span></li>
    <li class="pickerItem win"><span class="value">4th Item Test</span></li>
    <li class="pickerItem"><span class="value">5th Item Test</span></li>
    <li class="pickerItem"><span class="value">6th Item Test</span></li>
    <li class="pickerItem"><span class="value">7th Item Test</span></li>
    <li class="pickerItem"><span class="value">8th Item Test</span></li>
    <li class="pickerItem"><span class="value">9th Item Test</span></li>
    <li class="pickerItem"><span class="value">10th Item Test</span></li>
    <li class="pickerItem last"><span class="value">11th Item Test</span></li>
</ul>
<div class="clear"></div>
<p><a href="#" id="start">start</a></p>
<p>Position: <span id="position">0</span></p>
<p>Speed: <span id="speed">0</span></p>
<p>Deceleration: <span id="deceleration">0</span></p>
  • 第一项测试
  • 第二项测试 第三项测试 第四项测试 第五项测试 第六项测试
  • 第7项测试
  • 第八项测试 第9项测试
  • 第10项测试
  • 第11项测试

职位:0

速度:0

减速度:0

Javascript:

var marqueeRunning = false;
var winElement;
var fullSpeed = 60;
var speed = fullSpeed;
var deceleration = 3;
var rotationTotal = 10;
var currentRotation = 0;

$(document).ready(function() {

winElement = $(".pickerItem.win");
$(".pickerItem").last().addClass("last");
$(".picker").each(function() {
    var i = 0;
    $(this).find(".pickerItem").each(function() {
        var $this = $(this);
        $this.css("top", i);
        i += $this.height();
    });
});

$('#start').click(function() {
    if (!marqueeRunning) {
        speed = fullSpeed;
        $("#speed").html(speed);
        //marqueeRunning = true;                
        var countScrolls = $('.picker .pickerItem').length;

        marqueeRunning = true;
        for (var i = 0; i < countScrolls; i++) {
            doScroll($('.picker .pickerItem:nth-child(' + i + ')'));
        }

        setTimeout
        (
            function()
            {
                marqueeRunning = false;
            }, 
            1000
        );
    }
});
});

function slowDown()
{
var currentTop = Math.floor(winElement.css("top").replace("px",""));
/* -- Bounce Effect
if (currentTop != 0)
{
    newSpeed = speed;
    if (Math.abs(currentTop) < Math.abs(speed *4)) newSpeed = Math.floor(Math.abs(speed) - deceleration);
    if (newSpeed === 0)
    {
        newSpeed = speed;
    }
    if (currentTop > 0)
    {
       speed = Math.floor(Math.abs(newSpeed));
    }
    else
    {
       speed = -Math.floor(Math.abs(newSpeed));
    }
    if (Math.abs(currentTop) < 3 && Math.abs(speed) === 3) speed = currentTop;
}
*/
$("#speed").html(speed);
if (currentTop === 0)
{
    speed = 0;
    $("#speed").html(speed + " (complete)");
}
}

function doScroll($ele) {
//alert($ele.css("top"));
var top = parseInt($ele.css("top"));
//console.log(' Outside - ' + top + ' < -' + 3*fullSpeed);

if (top < -(3 * fullSpeed)) { //bit arbitrary!
//console.log(' Inside - ' + top + ' < -' + 3*fullSpeed);
    var $lastEle = $ele.closest('.picker').find(".last");
    $lastEle.removeClass("last");
    $ele.addClass("last");
    var top = (parseInt($lastEle.css("top")) + $lastEle.height());
    $ele.css("top", top);
}
$ele.animate({
    top: (parseInt(top) - speed)
}, 100, 'linear', function() {
    $("#position").html(winElement.css("top"));
    if ($ele.get(0) === winElement.get(0) && marqueeRunning === false) setTimeout(slowDown, 10);
    if (marqueeRunning || (Math.floor(winElement.css("top").replace("px","")) !== 0 && speed !== 0)) doScroll($(this))
});
 }
var marqueeRunning=false;
var-winElement;
var全速=60;
var速度=全速;
减速度=3;
var rotationTotal=10;
var currentRotation=0;
$(文档).ready(函数(){
winElement=$(“.pickerItem.win”);
$(“.pickerItem”).last().addClass(“last”);
$(“.picker”)。每个(函数(){
var i=0;
$(this.find(“.pickerItem”).each(function(){
var$this=$(this);
$this.css(“top”,i);
i+=$this.height();
});
});
$(“#开始”)。单击(函数(){
如果(!选框运行){
速度=全速;
$(“#速度”).html(速度);
//选框运行=真;
var countScrolls=$('.picker.pickerItem').length;
选框运行=真;
对于(变量i=0;i0)
{
速度=数学地板(数学abs(新闻速度));
}
其他的
{
速度=-Math.floor(Math.abs(newSpeed));
}
如果(数学abs(currentTop)<3&&Math.abs(速度)==3)速度=当前Top;
}
*/
$(“#速度”).html(速度);
如果(currentTop==0)
{
速度=0;
$(“#speed”).html(speed+”(complete)”;
}
}
函数doscorl($ele){
//警报($ele.css(“顶部”));
var top=parseInt($ele.css(“top”));
//console.log('Outside-'+top+'<-'+3*全速);
如果(top<-(3*全速)){//位任意!
//console.log('Inside-'+top+'<-'+3*全速);
var$lastEle=$ele.closest(“.picker”).find(“.last”);
$lastEle.removeClass(“last”);
$ele.addClass(“最后”);
var top=(parseInt($lastEle.css(“top”)+$lastEle.height());
$ele.css(“顶部”,顶部);
}
$ele.animate({
顶部:(parseInt(顶部)-速度)
},100,'线性',函数(){
$(“#position”).html(winElement.css(“top”);
if($ele.get(0)==winElement.get(0)&&marqueeRunning==false)设置超时(减速,10);
如果(选框运行| | |(Math.floor(winElement.css(“top”).replace(“px”)和“)!==0和速度!==0))多克罗尔($(此))
});
}
​ 您可以在此处查看当前版本:

我想做的是让纺纱机旋转,然后在5-6次旋转之后,减速到中间的“Win”类的列表项目。有人能给我指一下正确的方向吗。另外,我也不知道为什么,但它在第一组项目之后就出现了一个缺口,我不知道如何摆脱它

非常感谢您的帮助。

我使用scrollTo创建了无限循环,在滚动窗口和完成滚动到最后一个获奖项目时,我复制了您的项目数:

HTML几乎与您的

CSS:

JS

$.easing.elasout=函数(x、t、b、c、d){
var s=1.70158;var p=0;var a=c;
if(t==0)返回b;if((t/=d)==1)返回b+c;if(!p)p=d*0.3;
如果(a

初始脚本最大的问题是弄乱了全局范围,并且很难做简单的事情。

应该像:?很多奇怪的代码…差不多-只是稍微居中一点,旋转几圈后。绝对是在正确的方向上…尝试一下很棒!!只是好奇,有没有办法让它慢到正确的速度,而不是停下来“弹跳”?我想你可以为此选择/编写缓解插件,
p {
 padding: 0px;
 margin: 0px;
}
.pickerItem {
 height:60px;
 width:298px;
 color: #000;
 border: 1px solid #ccc;
 text-align: center;
 font-size: 1.2em;
 font-weight: bold;
 list-style: none;
 margin: 0px;
 padding: 0px;
}

.value {
  display: block;
  margin-top: 15px; 
  padding: 0px;
}

.picker {
  margin: 0px;
  height: 220px;
  width:300px;
  border: solid 1px black;
  position: relative;
  overflow: hidden;
  background-image: url(http://i.imgur.com/hMWRu.jpg);
  padding: 0px;
}
.clear {
  clear:both;
}
.win span{
 background:blue; 
}
$.easing.elasout = function(x, t, b, c, d) {
        var s=1.70158;var p=0;var a=c;
        if (t===0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*0.3;
        if (a < Math.abs(c)) { a=c;  s=p/4; }
        else s = p/(2*Math.PI) * Math.asin (c/a);
        return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
    };




$(function() {
  var picker=$('.picker');
  var added_items=picker.children('li').clone(true);
  picker.append(added_items);
  var last=picker.children().last();
  var first=picker.children().first();
  var stop=false;
  var win=$('.picker .win').last();
  var start=function() {
    $(this).unbind('click');
    stop=false;
  scroll();  
    setTimeout(function() {
     stop=true; 
    },1000);
  };
  var scroll=function()   {
    picker.scrollTo(last,500,{ onAfter: nextstep});
  };
  var nextstep=function() {
    if (stop) {
      picker.scrollTo(first);
      picker.scrollTo(win.prev(),2000,{easing: 'elasout'});
      $('#start').click(start);
      return;
    }
    picker.scrollTo(first);
    scroll();

  };
  $('#start').click(start);


});