[关闭]
@kirkzwy 2015-10-13T04:08:37.000000Z 字数 5225 阅读 1357

关于stickek.js的分析

coding 学习


库地址

stickerjs

库的特点

文件结构分析

全局变量

_direction 记录触发的方向
_savePos 记录element的定位信息
_prefixes 浏览器前缀的记录数组
_aniTrans css trasnlate的属性值
_setTrans 重置css trasnlate的属性值为0
newStyle 新建一个style标签,入面记录各个方向的阴影值

全局函数

vendor(el, prop) 在相应的标签上相关的属性添加浏览器前缀
css(el, prop) 在相应的标签上设置css
createEl(tag, prop) 生成新的标签
checkDerection(e, pos, sizeQ) 检测事件发生时的进入方向
checkPos(e, pos, size) 记录相关的位置信息
onEnter(e, value) 事件进入时的处理函数
onLeave(e, value) 事件离开时的处理函数
onMove(e, value) 事件移动时的处理函数
sticker.init(dom) 当dom为string时返回相应的的标签,再创建相关的标签进行挂载

sticker.init函数调用顺序

Created with Raphaël 2.1.2sticker.init(dom)dom is string?返回相应的class的element创建一系列element调用createEl函数createEl函数调用css函数css函数调用vendor函数创建出container、mask、move、front、back、backImg、backShadow、depth element并设置相应的css 将container挂载到根element上将mask挂载到container上将move挂载到mask上 将front、depth、back依次挂载到move上将backImg、backShadow依次挂载到back上在front上添加sticker-img sticker-front两个classname在backImg上添加sticker-img sticker-back两个classname在backShadow和depth上添加sticker-shadow classname创建value变量记录相关值对mouseenter、mouseleave、mousemove挂载相应的事件处理函数onEnter、onLeave、onMove模块化处理yesno

创建的element层次

onEnter函数调用过程

1.cpos变量记录container相对于视口的位置及宽高
2.mpos变量记录container相对于document的left和top值

  1. var cpos = value.container.getBoundingClientRect(),
  2. mpos = {x:cpos.left + window.pageXOffset, y:cpos.top + window.pageYOffset};

3.调用checkDerection函数确定事件发生的进入方向
4.调用checkPos函数记录位置信息

  1. _savePos = checkPos(e, mpos, value.size);
  2. _savePos.pos = mpos;

5.根据获得的_savePos值设置相应的css的值

  1. var bx = _savePos.bx, by = _savePos.by, sx = _savePos.sx, sy = _savePos.sy, bs = _savePos.bs;
  2. value.backShadow.className = value.depth.className = 'sticker-shadow ' + bs;
  3. css(value.mask, {
  4. transition: _setTrans,
  5. width: value.size + 'px',
  6. height: value.size + 'px',
  7. transform: 'translate(' + 0 + 'px, ' + 0 + 'px)'
  8. });
  9. css(value.move, {
  10. transition: _setTrans,
  11. transform: 'translate(' + 0 + 'px, ' + 0 + 'px)'
  12. });
  13. css(value.back, {
  14. transition: _setTrans,
  15. transform: 'translate(' + bx + 'px, ' + by + 'px)'
  16. });
  17. css(value.backImg, {
  18. transform: 'scaleX(' + sx + ') scaleY(' + sy + ')'
  19. });
  20. css(value.depth, {
  21. transform: 'translate(' + -10000 + 'px, ' + -10000 + 'px)'
  22. });

onLeave函数调用过程

1.检测_savePos是否为null,是则返回

  1. if (_savePos == null) return;

2.重设为onEnter的初始状态

  1. var bx = _savePos.bx, by = _savePos.by;
  2. css(value.mask, {
  3. transition: _aniTrans,
  4. width: value.size + 'px',
  5. height: value.size + 'px',
  6. transform: 'translate(' + 0 + 'px, ' + 0 + 'px)'
  7. });
  8. css(value.move, {
  9. transition: _aniTrans,
  10. transform: 'translate(' + 0 + 'px, ' + 0 + 'px)'
  11. });
  12. css(value.back, {
  13. transition: _aniTrans,
  14. transform: 'translate(' + bx + 'px, ' + by + 'px)'
  15. });
  16. css(value.depth, {
  17. transform: 'translate(' + -10000 + 'px, ' + -10000 + 'px)'
  18. });

3.设置_savePosnull

  1. _savePos = null;

onMove函数调用过程

checkPos函数的运行过程

1.传人的pos参数记录发生事件对象的element元素相对于document的x和y值
2.
fx为contanier相对于document的x值;
fy为contanier相对于document的x值;
tx为事件对象发相对于document的x值与fx的差,即事件发生对象距离相关的element元素的x值;
ty为事件对象发相对于document的y值与fy的差,即事件发生对象距离相关的element元素的y值;
a为相关element元素的大小与tx的差值,即事件发生对象与相关element元素右边的距离的正4负值;
b为相关element元素的大小与ty的差值,即事件发生对象与相关element元素下边的距离的负值;
c d e ftx ty a b相应值的一半;

  1. var fx = pos.x, fy = pos.y, tx = e.pageX - fx, ty = e.pageY - fy, value,
  2. a = size - tx, b = size - ty, c = tx >> 1, d = ty >> 1, e = a >> 1, f = b >> 1;

3.通过不同的_direction值,即不同的事件发生位置计算value的值

4.返回value值


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注