先來一個簡單的
<style>
.sweepstake {
color: orange;
font-size: 24px;
font-weight: bold;
}
</style>
<script src="http://files.cnblogs.com/rubylouvre/avalon2014123.js">
</script>
<script>
var id
var vm = avalon.define({
$id: "test",
number: 100,
click: function() {
if (!id) {
id = setInterval(function() {
vm.number--
if (vm.number === 0) {
clearInterval(id)
id = null
}
}, 100)
}
}
})
</script>
<div ms-controller="test">
<p class="sweepstake">{{number}}
</p>
<p><button type="button" ms-click="click">xxx</button></p>
</div>
{{number}}
再來一個復雜的有動畫效果的柏青哥
<!DOCTYPE html>
<html>
<head>
<title>TODO supply a title</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<script src="avalon.js">
</script>
<style>
.pachinko{
height: 40px;
width: 245px;
border: 5px solid black;
padding: 15px;
}
.pachinko .cell{
margin-right: 20px;
position: relative;
float: left;
border: 1px solid blueviolet;
width: 30px;
height: 40px;
overflow:hidden
}
.pachinko .cell.last{
margin-right: 0px;
}
.pachinko .cell .top{
position: absolute;
display: block;
top: 0px;
left: 0px;
text-align: center;
line-height: 40px;
width: 30px;
height: 40px;
}
.pachinko .cell .middle{
position: absolute;
display: block;
top: -40px;
left: 0px;
text-align: center;
line-height: 40px;
width: 30px;
height: 40px;
}
</style>
<script>
var id
var vm = avalon.define({
$id: "test",
array: [{number: 9}, {number: 9}, {number: 9}, {number: 9}, {number: 9}],
subtractOne: function(a) {
var a = a - 1
if (a < 0) {
a = 9
}
return a
},
distance: 0, //0-40 每個格子都高40px, 那么top的移動距離也是40, 其初始值為0
start: function() {
for (var i = 0, n = vm.array.length; i < n; i++) {
vm.array[i].number = Math.floor(Math.random() * 10)
}
if (!id) {
id = setInterval(function() {
vm.distance += 5
if (vm.distance > 50) {
vm.distance = 0
for (var i = 0, n = vm.array.length; i < n; i++) {
vm.array[i].number += 1
if(vm.array[i].number > 9){
vm.array[i].number = 0
}
}
}
}, 20)
}
},
stop: function() {
if (id) {
clearInterval(id)
id = null
}
vm.distance = 0
}
})
</script>
</head>
<body ms-controller="test">
<div class="pachinko">
<div ms-repeat="array" class="cell" ms-class="last: $last">
<span class="top" ms-css-top="distance-40">{{subtractOne(el.number)}}</span>
<span class="middle" ms-css-top="distance">{{el.number}}</span>
</div>
</div>
<p><button type="button" ms-click="start">start</button><button type="button" ms-click="stop">stop</button></p>
</body>
</html>
{{subtractOne(el.number)}}
{{el.number}}
簡單說一下原理,表面上只有五個格子,其實為了出現更好的過渡效果,總共有10個格子。其中有五個位於另五個的上方,然后動畫就是改變格子的top樣式值就行了。對應avalon,就是改vm中的distance屬性值, 它會在定時器里面快速地遞加,一直加到50就歸零。而格子里面的值,在第一次點擊時進行第一次洗牌,然后每當格子快跌出可視區后再遞增一,當它大於10時,就變回0。這樣不斷變啊變,直到用戶點了stop按鈕就才得結果。
