希望各位高手指点一下小弟,把下面js的代码作一下注释,越详细越好(希望重点说明一下实现左右切换区域内的页面的代码是哪段以及代码的意思)
下面代码实现的是在一个区域内鼠标移动到该区域左右移动可以切换页面,就像ipad移动切换页面一样,下面两张图片是实现的效果图,但我不明白js的代码意思,希望高手指点一下,希望重点说明一下实现左右切换区域内的页面的代码是哪段以及代码的意思。
index.html源码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>iOS Home Screen with CoffeeScript | Tutorialzine Demo</title>
<!-- Our CSS stylesheet file -->
<link rel="stylesheet" href="assets/css/styles.css" />
<!--[if lt IE 9]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>
<body>
<section id="homeScreen">
<div id="mask" >
<div id="allScreens"></div>
</div>
<ul id="indicators"></ul>
<div id="dock"></div>
</section>
<footer>
<h2><i>Tutorial:</i> Creating an iOS-like Home Screen with CoffeeScript</h2>
<a class="tzine" href="http://tutorialzine.com/2011/10/ios-homescreen-coffeescript/">Head on to <i>Tutorial<b>zine</b></i> to download this example</a>
</footer>
<!-- JavaScript includes -->
<script src="http://code.jquery.com/jquery-1.6.3.min.js"></script>
<script src="assets/js/touchable.js"></script>
<script src="assets/js/coffee-script.js"></script>
<script type="text/coffeescript">
# The Icon class.
class Icon
# The constructor. The -> arrow signifies
# a function definition.
constructor: (@id, @title, @url) ->
# @ is synonymous for "this". The id and title parameters
# of the construtor are automatically added as this.id and this.title
# @markup holds the HTML of the icon. It is
# transformed to this.markup behind the scenes.
@markup = "<a class='icon' style='background-image:url(assets/img/icons/#{@id}.png)' title='#{@title}' href='#{@url}'></a>"
# The DockIcon class inherits from Icon
class DockIcon extends Icon
constructor: (id, title, url)->
# This calls the constructor if Icon
super(id, title, url)
# Changing the class name of the generated HTML
@markup = @markup.replace("class='icon'","class='dockicon'")
# The Screen Class
class Screen
# Function arguments can have default parameters
constructor: (icons = [])->
@icons = icons
attachIcons: (icons = [])->
Array.prototype.push.apply(@icons, icons)
generate: ->
markup = []
# Looping through the @icons array
markup.push(icon.markup) for icon in @icons
# The last line of every function is implicitly returned
"<div class='screen'>#{markup.join('')}</div>"
class Stage
# The width of our "device" screen. This is
# basically the width of the #mask div. 最要的宽度是mask层的宽度
screenWidth: 550
constructor: (icons)->
@currentScreen = 0
@screens = []
# Calculating the number of screens 计算屏幕图标的数量
# necessary to display all the icons 必须显示所有的图标
num = Math.ceil(icons.length / 15)
i = 0
while num--
# we pass a slice of the icons array
s = new Screen(icons[i...i+15])
# adding the screen to the local screens array
@screens.push(s)
i+=15
# This method populates the passed element with HTML
addScreensTo: (element)->
@element = $(element)
@element.width(@screens.length*@screenWidth)
for screen in @screens
@element.append(screen.generate())
addIndicatorsTo: (elem)->
# This method creates the small
# circular indicatiors
@ul = $(elem)
for screen in @screens
@ul.append('<li>')
@ul.find('li:first').addClass('active');
goTo: (screenNum)->
# This method animates the allScreen div in
# order to expose the needed screen in #mask
if @element.is(':animated')
return false
# if this is the first or last screen,
# run the end of scroll animation
if @currentScreen == screenNum
# Parallel assignment:
[from, to] = ['+=15','-=15']
if @currentScreen != 0
[from, to] = [to, from]
@element.animate( { marginLeft : from }, 150 )
.animate( { marginLeft : to }, 150 )
else
# If everything is ok, animate the transition between the screens.
# The fat arrow => preserves the context of "this"
@element.animate( { marginLeft:-screenNum*@screenWidth }, => @currentScreen = screenNum )
@ul.find('li').removeClass('active').eq(screenNum).addClass('active');
next: ->
toShow = @currentScreen+1
# If there is no next screen, show
# the current one
if toShow == @screens.length
toShow = @screens.length - 1
@goTo(toShow)
previous: ->
toShow = @currentScreen-1
# If there is no previous screen,
# show the current one
if toShow == -1
toShow = 0
@goTo(toShow)
# This is equivalent to $('document').ready(function(){}):
$ ->
allIcons = [
new Icon('Photos', 'Photo Gallery','http://www.qq.com'), new Icon('Maps', 'Google Maps','http://www.163.com')
new Icon('Chuzzle', 'Chuzzle', 'http://www.qq.com'), new Icon('Safari', 'Safari' ,'http://www.qq.com')
new Icon('Photos', 'Photo Gallery','http://www.qq.com'), new Icon('Maps', 'Google Maps','http://www.qq.com')
new Icon('Chuzzle', 'Chuzzle', 'http://www.qq.com'), new Icon('Safari', 'Safari' ,'http://www.qq.com')
new Icon('Photos', 'Photo Gallery','http://www.qq.com'), new Icon('Maps', 'Google Maps','http://www.qq.com')
new Icon('Chuzzle', 'Chuzzle', 'http://www.qq.com'), new Icon('Safari', 'Safari' ,'http://www.qq.com')
new Icon('Photos', 'Photo Gallery','http://www.qq.com'), new Icon('Maps', 'Google Maps','http://www.qq.com')
new Icon('Chuzzle', 'Chuzzle', 'http://www.qq.com'), new Icon('Safari', 'Safari' ,'http://www.qq.com')
new Icon('Photos', 'Photo Gallery','http://www.qq.com'), new Icon('Maps', 'Google Maps','http://www.qq.com')
new Icon('Chuzzle', 'Chuzzle', 'http://www.qq.com'), new Icon('Safari', 'Safari' ,'http://www.qq.com')
new Icon('Photos', 'Photo Gallery','http://www.qq.com'), new Icon('Maps', 'Google Maps','http://www.qq.com')
new Icon('Chuzzle', 'Chuzzle', 'http://www.qq.com'), new Icon('Safari', 'Safari' ,'http://www.qq.com')
new Icon('Photos', 'Photo Gallery','http://www.qq.com'), new Icon('Maps', 'Google Maps','http://www.qq.com')
new Icon('Chuzzle', 'Chuzzle', 'http://www.qq.com'), new Icon('Safari', 'Safari' ,'http://www.qq.com')
new Icon('Photos', 'Photo Gallery','http://www.qq.com'), new Icon('Maps', 'Google Maps','http://www.qq.com')
new Icon('Chuzzle', 'Chuzzle', 'http://www.qq.com'), new Icon('Safari', 'Safari' ,'http://www.qq.com')
]
dockIcons = [
new DockIcon('Camera', 'Camera' ,'http://www.qq.com')
new DockIcon('iPod', 'iPod' ,'http://www.qq.com')
new DockIcon('Calculator', 'Calculator' ,'http://www.qq.com')
new DockIcon('Camera', 'Camera' ,'http://www.qq.com')
new DockIcon('iPod', 'iPod' ,'http://www.qq.com')
]
allScreens = $('#allScreens')
# Using the Touchable plugin to listen for
# touch based events:
allScreens.Touchable();
# Creating a new stage object
stage = new Stage(allIcons)
stage.addScreensTo(allScreens)
stage.addIndicatorsTo('#indicators')
# Listening for the touchablemove event.
# Notice the callback function
allScreens.bind 'touchablemove', (e,touch)->
stage.next() if touch.currentDelta.x < -5
stage.previous() if touch.currentDelta.x > 5
# Adding the dock icons:
dock = $('#dock')
for icon in dockIcons
dock.append(icon.markup)
</script>
</body>
</html>