一个图片浏览的小组件,支持全方位调整和拖拽

[b]功能:[/b]双击页面图片弹出一个内含图片窗口,可进行全方位调整和拖拽
[b]特点:[/b]
[list]
[*]基于Ext-core,面向组件形式开发,不会与其它JS发生冲突
[*]支持主流浏览器,已测试ie6、FF、chrome
[*]全局单例模式,部分组件重用,事件注册优化,最大限度降低内存消耗
[*]精心布局,考虑了页面存在滚动条的情况
[*]使用特别简单
[/list]
[b]使用方法:[/b]
1.让页面加载完毕后执行初始化函数:

Ext.onReady(function(){
Ext.ux.ImageView.init();
});

2.为需要提供图片浏览功能的img添加class:resizable

<img src="wow.jpg" class="resizable"/>

[b]预览:[/b]
[img]http://dl.iteye.com/upload/attachment/242907/233b2868-f71a-3ada-bd7b-80a01b96c056.png[/img]

附件例子可直接使用浏览器打开查看


//扩展下Ext.Element
(function(){
var D = Ext.lib.Dom;
Ext.apply(Ext.Element.prototype, {
//全屏幕居中,该元素必须为body的直接子元素,且为绝对定位;
center: function(){
var xy = [D.getViewportWidth(), D.getViewportHeight()];
var x = Ext.getBody().getScroll().left + (xy[0] - this.getWidth()) / 2;
var y = Ext.getBody().getScroll().top + (xy[1] - this.getHeight()) / 2;
this.setXY([x, y]);
}
});
}())

/**
* 功能:双击页面图片弹出一个内含图片窗口,可进行全方位调整和拖拽
*
* @author chemzqm@gmail.com
* @version 1.0
* @since 2010-4-30
*/
Ext.ns('Ext.ux');

Ext.ux.ImageView = function(){

return {
init: function(){
this.initMask();
Ext.getBody().on('dblclick', function(e, t, o){
var img = Ext.fly(t);
if (img.hasClass('resizable')) {
this.viewImg = Ext.getBody().createChild({
tag: 'img',
cls: 'dd-view'
});
this.viewImg.dom.src = img.getAttribute('src');
this.el = this.viewImg.wrap({
tag: 'div',
id: 'mywrap'
});
this.el.setWidth(img.getWidth());
this.el.setHeight(img.getHeight());
this.el.setStyle({
position: 'absolute',
zIndex: 3000,
cursor: 'move'
});
this.el.center();
this.createMakeUp();
this.initEvent();
}
}, this, {
delegate: 'img'
});
}
}
}();

Ext.apply(Ext.ux.ImageView, {
initMask: function(){
var d = Ext.lib.Dom, w = d.getViewWidth(true), h = d.getViewHeight(true);
this.mask = Ext.getBody().createChild({
cls: 'dd-mask'
});
this.mask.setWidth(w);
this.mask.setHeight(h);
this.frame = Ext.DomHelper.insertBefore(this.mask, '<iframe class="dd-frame" frameborder="0"></iframe>', true);//创建夹层
this.frame.setWidth(w);
this.frame.setHeight(h);
this.mask.hide();
this.frame.hide();
},
createMakeUp: function(){
this.mask.show();
this.frame.show();
var head = this.el.createChild({
cls: 'dd-header'
});
this.closeEl = head.createChild({
tag: 'button',
cls: 'dd-close',
html: '关闭'
});
this.creatProxy(this.el);
},
initEvent: function(){
this.closeEl.on('click', this.onDestroy, this);
Ext.getBody().on('mousedown', this.onMousedown, this, {
delegate: 'span'
});
Ext.getBody().on('mouseup', this.onMouseup, this);
Ext.getBody().on('click', this.onMouseup, this);
this.el.on('mousedown', this.stratMove, this);
this.el.on('mouseup', this.endMove, this);
this.el.on('click', this.endMove, this);
this.el.on('mousemove', this.onMove, this);
},
stratMove: function(e, t, o){
if (!Ext.fly(t).hasClass('dd-inner')) {
return;
}
this.begin = {
x: e.getPageX(),
y: e.getPageY(),
ex: this.el.getLeft(),
ey: this.el.getTop()
}
this.moving = true;
this.el.on('mousemove', this.onMove, this);
},
onMove: function(e, t, o){
if (!this.moving) {
return false;
}
e.preventDefault();
var dx = e.getPageX() - this.begin.x;
var dy = e.getPageY() - this.begin.y;
this.el.setX(this.begin.ex + dx);
this.el.setY(this.begin.ey + dy);
this.el.focus();
},
endMove: function(){
this.moving = false;
},
onMousedown: function(e, t, o){
e.preventDefault();
this.begin = {
x: e.getPageX(),
y: e.getPageY(),
ex: this.el.getLeft(),
ey: this.el.getTop(),
ew: this.el.getWidth(),
eh: this.el.getHeight(),
id: t.id
};
this.handler = Ext.get(t);
Ext.getBody().on('mousemove', this.onMouseMove, this);
},
onMouseMove: function(e, t, o){
e.preventDefault();
var dx = e.getPageX() - this.begin.x;
var dy = e.getPageY() - this.begin.y;
this.resize(this.begin.id, dx, dy);
this.adjustInner();
},
onMouseup: function(e, t, o){
Ext.getBody().un('mousemove', this.onMouseMove, this);
},
//让内部区调整宽高
adjustInner: function(){
this.proxy.setHeight(this.el.getHeight() + 10);
this.proxy.setWidth(this.el.getWidth() + 10);
},
resize: function(type, dx, dy){
var x = this.begin.ex;
var y = this.begin.ey;
var w = this.begin.ew;
var h = this.begin.eh;
var me = this.el;
var lx = dx > 0 ? true : false;
var ly = dy > 0 ? true : false;
switch (type) {
case 'tl':{
if (lx !== ly) {
return;
}
me.setStyle('left', x + dx + 'px');
me.setStyle('top', y + dy + 'px');
me.setWidth(w - dx);
me.setHeight(h - dy);
break;
}
case 'tr':{
if (lx === ly) {
return;
}
me.setStyle('top', y + dy + 'px');
me.setWidth(w + dx);
me.setHeight(h - dy);
break;
}
case 'bl':{
if (lx === ly) {
return;
}
me.setStyle('left', x + dx + 'px');
me.setWidth(w - dx);
me.setHeight(h + dy);
break;
}
case 'br':{
if (lx !== ly) {
return;
}
me.setWidth(w + dx);
me.setHeight(h + dy);
break;
}
case 't':{
me.setStyle('top', y + dy + 'px');
me.setHeight(h - dy);
break;
}
case 'b':{
me.setHeight(h + dy);
break;
}
case 'l':{
me.setStyle('left', x + dx + 'px');
me.setWidth(w - dx);
break;
}
case 'r':{
me.setWidth(w + dx);
break;
}

}
if (Ext.isIE6) {//垃圾ie6,子元素高度不会自适应
var eh = this.el.getHeight();
this.viewImg.setHeight(eh);
}
return;
},
creatProxy: function(el){
this.proxy = el.createChild({
cls: 'dd-proxy',
children: [{
cls: 'dd-inner'//ie需要一个透明元素遮挡,否则选定元素不一样
}, {
id: 'tl',
tag: 'span',
cls: 'dd-anchor dd-anchor-tl'
}, {
id: 'tr',
tag: 'span',
cls: 'dd-anchor dd-anchor-tr'
}, {
id: 'bl',
tag: 'span',
cls: 'dd-anchor dd-anchor-bl'
}, {
id: 'br',
tag: 'span',
cls: 'dd-anchor dd-anchor-br'
}, {
id: 'l',
tag: 'span',
cls: 'dd-handler dd-border-l'
}, {
id: 'r',
tag: 'span',
cls: 'dd-handler dd-border-r'
}, {
tag: 'span',
id: 't',
cls: 'dd-handler dd-border-t'
}, {
id: 'b',
tag: 'span',
cls: 'dd-handler dd-border-b'
}]
});
this.adjustInner();
},
onDestroy: function(){
this.closeEl.un('click', this.onDestroy, this);
Ext.getBody().un('mousedown', this.onMousedown, this, {
delegate: '.dd-handler'
});
Ext.getBody().un('mouseup', this.onMouseup, this);
Ext.getBody().un('click', this.onMouseup, this);
this.el.removeAllListeners();
this.mask.hide();
this.frame.hide();
this.el.remove();
}

});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值