當滾動的內容很多,例如鬧鐘裡設定秒,一共有60項。讓使用者從59ms滾回01ms是一件很痛苦的事情,所以:
在列表項目太多的情況下,我們希望能夠有個無限循環的滾動。 00ms和01ms是無縫連結起來的。如下圖所示:
#http://www.php.cn/
<link rel="stylesheet" href="select.css" /><script src="../../transformjs/transform.js"></script><script src="../../alloy_touch.js"></script><script src="alloy_touch.select.infinite.js"></script>
然後:
var i = 0, options = [];for (; i < 60; i++) { options.push({ value: i, text: i < 10 ? "0" + i+" ms" : i + " ms" });}var iselect = new AlloyTouch.Select({ options: options, selectedIndex: 11, change: function (item, index) { }, complete: function (item, index) { document.body.insertAdjacentHTML("beforeEnd", "<br/>选了第" + index + "项<br/>value:" + item.value + "<br/>text:" + item.text); }})iselect.show();核心原理在看原理之前,我們看下dom裡面的
屬性變化。
new AlloyTouch({ touch: container, target: { y: -1 * preSelectedIndex * step }, property: "y", vertical: true, step: step, change: function (value) { correction(value); }, touchStart: function (evt, value) { }, touchMove: function (evt, value) { }, touchEnd: function (evt, value) { }, tap: function (evt, value) { }, pressMove: function (evt, value) { }, animationEnd: function (value) { }})function correction(value) { value %= scrollerHeight; if (Math.abs(value) > scrollerHeight-90) { if (value > 0) { value -= scrollerHeight; } else { value += scrollerHeight; } } scroll.translateY = value - scrollerHeight;}可以看到初始化AlloyTouch實例的時候已經不存在min和max的參數,因為不需要回彈。
透過correction去產生跳動週期的效果。 (注意:雖然值會跳一個週期,但是dom的渲染表現是看不出跳動的)
其中target是一個包含y屬性的
物件字面量,scroll是滾動的對象,被mix過transfrom的相關屬性,所以可以直接透過scroll.translateY 設定其垂直方向上的位移。
後續還會帶給大家:
以上是AlloyTouch無限循環select插件的詳細內容。更多資訊請關注PHP中文網其他相關文章!