how i develop carousel module

76
我是这样开发 CAROUSEL 的 明城

Upload: -

Post on 20-Jan-2015

1.025 views

Category:

Technology


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: How I Develop Carousel Module

我是这样开发 CAROUSEL 的明城

Page 2: How I Develop Carousel Module

LIFE IS HARD

Page 3: How I Develop Carousel Module

“明城,别光顾着看蝇头小报了!”

Page 4: How I Develop Carousel Module

“赶紧快给我写代码⋯”

Page 5: How I Develop Carousel Module

“我们新首页需要个脚本⋯”

Page 6: How I Develop Carousel Module

“这块、这块⋯ 噢还有这块归你了!”

Page 7: How I Develop Carousel Module

“噢!开始了!”

Page 8: How I Develop Carousel Module

以 Carousel(旋转木马)为例

Page 9: How I Develop Carousel Module

等等⋯

Page 10: How I Develop Carousel Module

所谓大师,在写脚本之前都会⋯

Page 11: How I Develop Carousel Module

都会看看前人怎么写

Page 12: How I Develop Carousel Module

Tbra 1.0 的 SimpleScroll

它足够老,但是至少还能工作

配置项有些少,感觉不够灵活

没用动画组件,效果有些少

不够 “KISSY”

assets:/tbra/1.0/build/widget/simplecroll.js

Page 13: How I Develop Carousel Module

YUI 2.x 的 Carousel 组件

有些过于庞大,代码太多懒得看

组件与组件之间层层继承“辈分太小”

新版首页上不适合

http://developer.yahoo.com/yui/carousel/

Page 14: How I Develop Carousel Module

I HAVE A DREAM

Page 15: How I Develop Carousel Module

我理想中的 Carousel 组件

Page 16: How I Develop Carousel Module

精简、简单小巧

接口弹性高,定制方便

具有一定的容错能力

效果要好

Page 17: How I Develop Carousel Module

需求遵循 8/2 原则

Page 18: How I Develop Carousel Module

Page 19: How I Develop Carousel Module

“说你那,别流口水了,赶紧敲键盘”

“痛⋯痛⋯555⋯”

Page 20: How I Develop Carousel Module

分解组件要素

Page 21: How I Develop Carousel Module

想到我那凄惨的童年,555…

Page 22: How I Develop Carousel Module

木马 ~ 元素

旋转速度 ~ 定时器间隔

旋转花样 ~ 滚动效果

音乐 ~ 装饰性的回调

Page 23: How I Develop Carousel Module

接口很重要

Page 24: How I Develop Carousel Module

KISSY().use("carousel", function(S) { var handle = new S.Carousel('sample', { direction: 'h', autoStart: false, speed: 500, scrollWidth: 400, onBeforeScroll: function() { // ... } });

// handle.next(); // handle.prev(); // handle.jumpTo();});

Page 25: How I Develop Carousel Module

开始编写代码

Page 26: How I Develop Carousel Module

第一版

Page 27: How I Develop Carousel Module

嗯,实现是实现了,但是⋯

Page 28: How I Develop Carousel Module

代码还是有些臃肿,将近 270 行(好数字)

ie 下有 Bug,滚动有误差

一些变量命名拿捏不好

代码注释很“无力”

Page 29: How I Develop Carousel Module

呃,人生总是充满着杯具

Page 30: How I Develop Carousel Module

第二版

Page 31: How I Develop Carousel Module

继续改进代码逻辑以及接口

Page 32: How I Develop Carousel Module

呼,看起来好多了⋯

Page 33: How I Develop Carousel Module

但是,代码反而更长了⋯

Page 34: How I Develop Carousel Module

看看增加了哪些“废话”

Page 35: How I Develop Carousel Module

增加初始化容错判断

增加“海量”注释- 就怕别人以及以后的自己看不懂

修改变量命名以便更容易理解

Page 36: How I Develop Carousel Module

有时候,代码“又臭又长”不见得就是件坏事

Page 37: How I Develop Carousel Module

这时,看出来有两个地方代码功能明显重复 jumpTo 和 play 方法

Page 38: How I Develop Carousel Module

Page 39: How I Develop Carousel Module

不要过早优化,代码结构和实现逻辑优先

Page 40: How I Develop Carousel Module

组件的变量命名很重要

Page 41: How I Develop Carousel Module

优化和改进犹如牙膏,挤挤总会有

Page 42: How I Develop Carousel Module

第三版

Page 43: How I Develop Carousel Module

剔除重复的代码,代码行数骤减

再次更改变量名,不耍宝了⋯

注释还是继续加,剔除些废话

Page 44: How I Develop Carousel Module

接口还是要改改⋯

Page 45: How I Develop Carousel Module

将回调(callback)抽离配置项

Page 46: How I Develop Carousel Module

KISSY().use("slideview", function(S) {

var slideView = new S.SlideView("sample", {

autoPlay: false,

effectType: "scrollx",

activeTriggerCls: "current"

});

slideView.subscribe("onSwitch", function(index) {

// ...

});

});

Page 47: How I Develop Carousel Module

简简单单,完成回调

KISSY.augment(ScrollView, Y.EventProvider);

Page 48: How I Develop Carousel Module

“有些事儿没法说细⋯”

Page 49: How I Develop Carousel Module

呼,似乎看起来差不多了⋯

Page 50: How I Develop Carousel Module

等等,还有 ie 下的 Bug 没搞定呢

Page 51: How I Develop Carousel Module

我恨 Internet Explorer

Page 52: How I Develop Carousel Module

信 Google ,上本科!

Page 53: How I Develop Carousel Module

解决 ie 下的 offsetLeft 计算误差

Page 54: How I Develop Carousel Module

在父元素具有 padding 的情况下,会造成子元

素 offsetLeft/offsetHeight 计算有误差

Page 55: How I Develop Carousel Module

var getRealOffset = function(elem) {

var elem = Dom.get(elem), leftOffset = elem.offsetLeft,

topOffset = elem.offsetTop, parent = elem.offsetParent;

// fix IE offsetLeft bug, see

// http://www.gtalbot.org/BrowserBugsSection/MSIE6Bugs/

while(parent) {

leftOffset += parent.offsetLeft;

topOffset += parent.offsetTop;

parent = parent.offsetParent;

}

return { top: topOffset, left: leftOffset };

}

Page 56: How I Develop Carousel Module

呼,似乎大功告成

Page 57: How I Develop Carousel Module

什么?还有⋯

Page 58: How I Develop Carousel Module

最终稳定版

Page 59: How I Develop Carousel Module

代码要对“压缩友好”,代码挤挤总会变小的

Page 60: How I Develop Carousel Module

如何“压缩友好”代码

将频繁出现的常量扔到个变量中

将 this 等关键字也一样扔到个变量中- 以后闭包中用得到- 处于绑定作用域的习惯

DOM 的 getElementByXX 系列又臭又长

Page 61: How I Develop Carousel Module

如何给变量好的命名?

Page 62: How I Develop Carousel Module

好的变量命名应该是⋯

简短、一针见血

没有“装逼”的专有名词

看起来都是爹妈生的 -- 就坚持用一种命名法则

类名、属性名用“名词”或者“动名词”如:Woman、money

方法用“动词 + 名词”的方式如:getNextOffsetByParent 表打我⋯

Page 63: How I Develop Carousel Module

更多参见: http://coolshell.cn/?p=1990

Page 64: How I Develop Carousel Module

下一步计划

Page 65: How I Develop Carousel Module

更 “KISSY”,灵活度更高

Page 66: How I Develop Carousel Module

Page 67: How I Develop Carousel Module

追播广告

Page 68: How I Develop Carousel Module

云谦 和 玉伯 的幻灯更精彩!

云谦:http://www.chencheng.org/blog/2010/01/05/dev-share-for-taobao-new-homepage/

玉伯: http://lifesinger.org/blog/2010/01/the-beauty-of-refactoring/

Page 69: How I Develop Carousel Module

KISSY 项目地址: http://code.google.com/p/kissy/

Page 70: How I Develop Carousel Module

感谢是发自肺腑的

Page 71: How I Develop Carousel Module

感谢 玉伯 几乎过了每行的代码

场下的表羡慕

Page 72: How I Develop Carousel Module

信伯哥,上本科

Page 73: How I Develop Carousel Module

感谢 云谦 容忍我几番的频繁更改

Page 74: How I Develop Carousel Module

感谢 谠 和组织给我那么宽松的环境发展

Page 75: How I Develop Carousel Module

最后,感谢 大家 能容忍我讲了那么多废话

Page 76: How I Develop Carousel Module