私はこのスピナーコントロールに数日取り組んできましたが、必要な方法で機能させることができませんでした。もともとは他の場所で見つけたコードであり、自分のニーズに合わせて再利用されていたので、少し頭がおかしいだけです。
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>
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))
});
}
現在のバージョンはここで確認できます:http: //jsfiddle.net/STLCajun/FYWtb/
私がやろうとしているのは、スピナーを回転させ、5〜6回転した後、クラス「win」が中央にあるリストアイテムまでスローダウンすることです。誰かが私を正しい方向に向けることができますか?また、理由はわかりませんが、最初のアイテムのセットの後にギャップが生じており、どのようにそれを取り除くのかわかりません。
どんな助けでも大歓迎です。