/** * @fileoverview 图片放大效果 ImageZoom. * @author 玉伯, 乔花 * @see silde.html */ KISSY.add('imagezoom/base', function(S, DOM, Event, UA, Anim, UIBase, Node, Zoomer, undefined) { var IMAGEZOOM_ICON_TMPL = "", IMAGEZOOM_WRAP_TMPL = "
"; function require(s) { return S.require("uibase/" + s); } function show(obj) { obj && obj.show(); } function hide(obj) { obj && obj.hide(); } return UIBase.create([require("boxrender"), require("contentboxrender"), require("positionrender"), require("loadingrender"), UA['ie'] == 6 ? require("shimrender") : null, require("align"), require("maskrender"), Zoomer ], { initializer:function() { var self = this, tmp; tmp = self.image = self.get('imageNode'); // 在小图加载完毕时初始化 tmp && Zoomer.__imgOnLoad(tmp, function() { if (!self.imageWrap) { self._render(); self._bind(); } }); }, /*renderUI:function() { }, syncUI:function() { }, bindUI: function() { },*/ destructor: function() { var self = this; self.image.detach(); }, _render: function() { var self = this, wrap, image = self.image, elem = image.parent(); if (elem.css('display') !== 'inline') { elem = image; } self.imageWrap = new Node(S.substitute(IMAGEZOOM_WRAP_TMPL, { wrapClass: self.get('wrapClass') })).insertBefore(elem); self.imageWrap.prepend(elem); if (self.get('showIcon')) { self.icon = new Node(S.substitute(IMAGEZOOM_ICON_TMPL, { iconClass: self.get("iconClass") })); self.imageWrap.append(self.icon); } }, /** * 绑定鼠标进入/离开/移动事件, 只有进入, 才响应鼠标移动事件 * @private */ _bind: function() { var self = this, timer; self.image.on('mouseenter', function(ev) { if (!self.get('hasZoom')) return; timer = S.later(function() { self.set('currentMouse', ev); if (self._fresh) { self.set('align', self._fresh); self._fresh = undefined; } self.show(); timer = undefined; }, 50); }).on('mouseleave', function() { if (timer) { timer.cancel(); timer = undefined; } }); self.on('afterVisibleChange', function(ev) { var isVisible = ev.newVal; if (isVisible) { hide(self.icon); } else { show(self.icon); } }); }, _uiSetHasZoom: function(v) { if (v) { show(this.icon); } else { hide(this.icon); } } }, { ATTRS:{ imageNode: { setter: function(el) { return Node.one(el); } }, wrapClass: { value: 'ks-imagezoom-wrap' }, imageWidth: { valueFn: function() { var img = this.get('imageNode'); img = img && img.width(); return img || 400; } }, imageHeight: { valueFn: function() { var img = this.get('imageNode'); img = img && img.height(); return img || 400; } }, imageLeft: { valueFn: function() { var img = this.get('imageNode'); img = img && img.offset().left; return img || 400; } }, imageTop: { valueFn: function() { var img = this.get('imageNode'); img = img && img.offset().top; return img || 400; } }, /** * 显示放大区域标志 * @type {boolean} */ hasZoom: { value: true, setter: function(v) { return !!v; } }, /** * 是否显示放大镜提示图标 * @type {boolean} */ showIcon: { value: true }, iconClass: { value: 'ks-imagezoom-icon' }, prefixCls:{ value: 'ks-' } } }); }, { requires: ['dom','event', 'ua', 'anim', 'uibase', 'node', 'imagezoom/zoomer'] }); /** * NOTES: * 201101 * - 重构代码, 基于 UIBase * */