how i develop carousel module
DESCRIPTION
TRANSCRIPT
![Page 1: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/1.jpg)
我是这样开发 CAROUSEL 的明城
![Page 2: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/2.jpg)
LIFE IS HARD
![Page 3: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/3.jpg)
“明城,别光顾着看蝇头小报了!”
![Page 4: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/4.jpg)
“赶紧快给我写代码⋯”
![Page 5: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/5.jpg)
“我们新首页需要个脚本⋯”
![Page 6: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/6.jpg)
“这块、这块⋯ 噢还有这块归你了!”
![Page 7: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/7.jpg)
“噢!开始了!”
![Page 8: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/8.jpg)
以 Carousel(旋转木马)为例
![Page 9: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/9.jpg)
等等⋯
![Page 10: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/10.jpg)
所谓大师,在写脚本之前都会⋯
![Page 11: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/11.jpg)
都会看看前人怎么写
![Page 12: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/12.jpg)
Tbra 1.0 的 SimpleScroll
它足够老,但是至少还能工作
配置项有些少,感觉不够灵活
没用动画组件,效果有些少
不够 “KISSY”
assets:/tbra/1.0/build/widget/simplecroll.js
![Page 13: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/13.jpg)
YUI 2.x 的 Carousel 组件
有些过于庞大,代码太多懒得看
组件与组件之间层层继承“辈分太小”
新版首页上不适合
http://developer.yahoo.com/yui/carousel/
![Page 14: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/14.jpg)
I HAVE A DREAM
![Page 15: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/15.jpg)
我理想中的 Carousel 组件
![Page 16: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/16.jpg)
精简、简单小巧
接口弹性高,定制方便
具有一定的容错能力
效果要好
![Page 17: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/17.jpg)
需求遵循 8/2 原则
![Page 18: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/18.jpg)
⋯
![Page 19: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/19.jpg)
“说你那,别流口水了,赶紧敲键盘”
“痛⋯痛⋯555⋯”
![Page 20: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/20.jpg)
分解组件要素
![Page 21: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/21.jpg)
想到我那凄惨的童年,555…
![Page 22: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/22.jpg)
木马 ~ 元素
旋转速度 ~ 定时器间隔
旋转花样 ~ 滚动效果
音乐 ~ 装饰性的回调
![Page 23: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/23.jpg)
接口很重要
![Page 24: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/24.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/25.jpg)
开始编写代码
![Page 26: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/26.jpg)
第一版
![Page 27: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/27.jpg)
嗯,实现是实现了,但是⋯
![Page 28: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/28.jpg)
代码还是有些臃肿,将近 270 行(好数字)
ie 下有 Bug,滚动有误差
一些变量命名拿捏不好
代码注释很“无力”
![Page 29: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/29.jpg)
呃,人生总是充满着杯具
![Page 30: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/30.jpg)
第二版
![Page 31: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/31.jpg)
继续改进代码逻辑以及接口
![Page 32: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/32.jpg)
呼,看起来好多了⋯
![Page 33: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/33.jpg)
但是,代码反而更长了⋯
![Page 34: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/34.jpg)
看看增加了哪些“废话”
![Page 35: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/35.jpg)
增加初始化容错判断
增加“海量”注释- 就怕别人以及以后的自己看不懂
修改变量命名以便更容易理解
![Page 36: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/36.jpg)
有时候,代码“又臭又长”不见得就是件坏事
![Page 37: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/37.jpg)
这时,看出来有两个地方代码功能明显重复 jumpTo 和 play 方法
![Page 38: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/38.jpg)
悟
![Page 39: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/39.jpg)
不要过早优化,代码结构和实现逻辑优先
![Page 40: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/40.jpg)
组件的变量命名很重要
![Page 41: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/41.jpg)
优化和改进犹如牙膏,挤挤总会有
![Page 42: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/42.jpg)
第三版
![Page 43: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/43.jpg)
剔除重复的代码,代码行数骤减
再次更改变量名,不耍宝了⋯
注释还是继续加,剔除些废话
![Page 44: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/44.jpg)
接口还是要改改⋯
![Page 45: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/45.jpg)
将回调(callback)抽离配置项
![Page 46: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/46.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/47.jpg)
简简单单,完成回调
KISSY.augment(ScrollView, Y.EventProvider);
![Page 48: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/48.jpg)
“有些事儿没法说细⋯”
![Page 49: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/49.jpg)
呼,似乎看起来差不多了⋯
![Page 50: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/50.jpg)
等等,还有 ie 下的 Bug 没搞定呢
![Page 51: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/51.jpg)
我恨 Internet Explorer
![Page 52: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/52.jpg)
信 Google ,上本科!
![Page 53: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/53.jpg)
解决 ie 下的 offsetLeft 计算误差
![Page 54: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/54.jpg)
在父元素具有 padding 的情况下,会造成子元
素 offsetLeft/offsetHeight 计算有误差
![Page 55: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/55.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/56.jpg)
呼,似乎大功告成
![Page 57: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/57.jpg)
什么?还有⋯
![Page 58: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/58.jpg)
最终稳定版
![Page 59: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/59.jpg)
代码要对“压缩友好”,代码挤挤总会变小的
![Page 60: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/60.jpg)
如何“压缩友好”代码
将频繁出现的常量扔到个变量中
将 this 等关键字也一样扔到个变量中- 以后闭包中用得到- 处于绑定作用域的习惯
DOM 的 getElementByXX 系列又臭又长
![Page 61: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/61.jpg)
如何给变量好的命名?
![Page 62: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/62.jpg)
好的变量命名应该是⋯
简短、一针见血
没有“装逼”的专有名词
看起来都是爹妈生的 -- 就坚持用一种命名法则
类名、属性名用“名词”或者“动名词”如:Woman、money
方法用“动词 + 名词”的方式如:getNextOffsetByParent 表打我⋯
![Page 64: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/64.jpg)
下一步计划
![Page 65: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/65.jpg)
更 “KISSY”,灵活度更高
![Page 66: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/66.jpg)
⋯
![Page 67: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/67.jpg)
追播广告
![Page 68: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/68.jpg)
云谦 和 玉伯 的幻灯更精彩!
云谦: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](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/69.jpg)
KISSY 项目地址: http://code.google.com/p/kissy/
![Page 70: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/70.jpg)
感谢是发自肺腑的
![Page 71: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/71.jpg)
感谢 玉伯 几乎过了每行的代码
场下的表羡慕
![Page 72: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/72.jpg)
信伯哥,上本科
![Page 73: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/73.jpg)
感谢 云谦 容忍我几番的频繁更改
![Page 74: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/74.jpg)
感谢 谠 和组织给我那么宽松的环境发展
![Page 75: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/75.jpg)
最后,感谢 大家 能容忍我讲了那么多废话
![Page 76: How I Develop Carousel Module](https://reader033.vdocuments.site/reader033/viewer/2022051612/54bd87ca4a795932488b4584/html5/thumbnails/76.jpg)