123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- /**
- * @fileoverview 图片放大效果 ImageZoom.
- * @author 玉伯<lifesinger@gmail.com>, 乔花<qiaohua@taobao.com>
- * @see silde.html
- */
- KISSY.add('imagezoom/base', function(S, DOM, Event, UA, Anim, UIBase, Node, Zoomer, undefined) {
- var IMAGEZOOM_ICON_TMPL = "<span class='{iconClass}'></span>",
- IMAGEZOOM_WRAP_TMPL = "<div class='{wrapClass}'></div>";
- 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
- *
- */
|