JS实现校内网"图片圈人"功能效果

  在之前写的文章Javascript Resize和Drag类,基于jQuery 的回复中,skyaspnet问我可否用这两个类实现校内网的“图片圈人”。当时我并不知道什么是“图片圈人”,就去校内网查看了一番,试用了这个功能,发现我可以实现这个功能。所以就实现了这个效果,并与大家分享讨论。

效果演示

 

实现原理

  使用DragResize类,获取选区的左上角位置和高宽,将它存到数据库,鼠标移动到标签上时,使用已经获取到的数据在图片上显示一个框。

  这里我记录下选区位置是的是相对于容器内部左上角的。

  这个程序只是一个效果,没有将数据存储到数据库。

代码

  photoTag类用来在图片上显示(show方法)和隐藏(hide方法)选区,发送请求并添加(add方法)一个选区和标签到数据库,删除(remove方法)一个选区和标签。

photoTag

 

  下面代码为该程序主要部分:在图片上单击一下就可以开始添加一个标签

 

Code
$(function(){

var is_started = false
;
// 选区左上角,和高宽

var info = {'left':0,'top':0,'width':0,'height':0};
var origin = {x:$('#enclose-wrapper').offset().left + (parseInt($('#enclose-wrapper').css('border-left-width'))||0
),
              y:$(
'#enclose-wrapper').offset().top  + (parseInt($('#enclose-wrapper').css('border-top-width'))||0
)};
var dnr = new DragResize($('#select-area-box')[0
], {
    minWidth:
20
,
    minHeight:
20
,
    bound:{left:
0,top:0,right:9999,bottom:9999
},
    callback:
function
(i) {
        
// 7为左(上)边两个边框的宽度的和, 4为左右(上下)篮色边框宽度的和

        info= {'left':i.left + 7,'top':i.top + 7,'width':i.width - 4,'height':i.height - 4};
        $(
'#select-area'
).width(info.width).height(info.height);
        
// 将添加标签的表单定位在选区的右边

        $('#form-add-tag').css({'left':i.left + i.width + 10'top':i.top});
    }                
});
// 拖动选区

$('#select-area').mousedown(function(e){
    dnr.drag(e);
});
// 调整选区大小

$('#select-area-box span').mousedown(function(e){
    dnr.resize(e, 
this.className.replace('-resize'''
));
});
// 在图片上点击一下,开始获取选区

$('#photo').mousedown(function(e){
    
if(is_started) return
;
    is_started 
= true
;
    
var left = e.pageX - origin.x - 50 - 7
;
    
var top  = e.pageY - origin.y - 50 - 7
 ;

    info
= {'left':left + 7,'top':top + 7,'width':100,'height':100
};
    photoTag.show(info.left, info.top, info.width, info.height, 
true
);
    $(
'#form-add-tag').show().css({'left':left + 100 + 4 + 10'top'
:top});
});
// 鼠标进入图片内时,显示选区

$('#photo').bind('mouseenter',function(e){
    
if(!is_started) return
;
    photoTag.show(info.left, info.top, info.width, info.height, 
true
);
});
// 确定添加一个标签,或取消

$('#btn-add-tag, #btn-cancel').click(function(e){
    
if(this.id == 'btn-cancel'
) {
        $(
'#form-add-tag, #select-area-box'
).hide();
        is_started 
= false
;
        
return false
;
    }
    
if(!$('#tag-name'
).val()) {
        alert(
'标签名不能为空!'
);
        
return false
;
    }
    
// 添加标签

    photoTag.add($('#tag-name').val(), info.left, info.top, info.width, info.height);
    
// 隐藏选区和表单

    $('#form-add-tag, #select-area-box').hide();
    is_started 
= false
;
});
photoTag.hide();

});

  

  下面是HTML:

Code

 

    你也可以到这里查看该程序的演示。

 

posted @ 2009-03-03 13:48 czy1121 阅读(7052) 评论(25) 编辑 收藏

 回复 引用 查看   
#1楼2009-03-03 15:15 | 魔尊年少时      
恩不错的
 回复 引用 查看   
#2楼2009-03-03 15:26 | 姜荣昌      
不错,支持
 回复 引用 查看   
#3楼[楼主]2009-03-03 15:30 | czy1121      
@魔尊年少时
@姜荣昌
谢谢支持:)

 回复 引用   
#4楼2009-03-03 15:32 | fly_thinking[未注册用户]
不错
 回复 引用 查看   
#5楼[楼主]2009-03-03 16:23 | czy1121      
@fly_thinking
谢谢支持:)

 回复 引用 查看   
#6楼2009-03-03 16:24 | Leepy      
不错,正需要这
 回复 引用 查看   
#7楼[楼主]2009-03-03 16:42 | czy1121      
@Leepy
谢谢支持:)

 回复 引用 查看   
#8楼2009-03-03 16:45 | collum      
问好:
请问楼主能不能实现用鼠标拉出矩形框实现这个效果啊?

 回复 引用 查看   
#9楼[楼主]2009-03-03 16:53 | czy1121      
@collum
可以的,在鼠标点击图片的时候,调用DragResize类的select方法
关于select方法,请看"DragResize - Resize和Drag类的合并优化版"

 回复 引用 查看   
#10楼2009-03-03 17:16 | 玉开      
挺好的哟。
 回复 引用 查看   
#11楼[楼主]2009-03-03 18:00 | czy1121      
@玉开
谢谢支持:)

 回复 引用 查看   
#12楼2009-03-03 18:41 | soulfjq      
不错,支持
 回复 引用 查看   
#13楼2009-03-03 21:00 | laosan      
非常感谢,学习了
 回复 引用 查看   
#14楼2009-03-03 21:18 | skyaspnet      
非常厉害, 佩服, 向您多学习
 回复 引用   
#15楼2009-03-03 23:15 | 钱途无梁
向你学习中,,,
 回复 引用 查看   
#16楼2009-03-04 07:35 | Ryan Gene      
webkit下,框的位置有偏差
 回复 引用 查看   
#17楼2009-03-04 08:37 | cloudgamer      
好像没有范围限制啊
 回复 引用   
#18楼2009-03-04 08:53 | 无业[未注册用户]
看看这边收录的,有的功能绝对强大:
http://www.open-open.com/ajax/ImageCropper.htm

 回复 引用 查看   
#19楼[楼主]2009-03-04 10:13 | czy1121      
@Ryan Gene
我的电脑上只有FF2和IE6,所以不清楚webkit下是什么情况,但我感觉应该是CSS引起的
@cloudgamer
你看漏了哦
在调用时我它bound设成了bound:{left:0,top:0,right:9999,bottom:9999}
@无业
哈哈,确实强大,收藏了.

 回复 引用 查看   
#20楼2009-03-04 13:07 | AlexLiu      
想法非常不错。支持了。
写的很细致,虽然对js不怎么懂。。。。

 回复 引用 查看   
#21楼[楼主]2009-03-04 15:25 | czy1121      
@AlexLiu
过奖了,谢谢支持:)

 回复 引用 查看   
#22楼2009-03-05 13:11 | 天涯个人居      
做的是一个Demo
 回复 引用   
#23楼2009-03-12 21:31 | wubin[未注册用户]
您好,在IE下,某些图片,点击图片后,没有出现选取,IE7显示参数无效,IE6显示错误84,FF下正常。IE仅某些图片不正常,有时,刷新后可正常,有时,刷新也不能解决。请问什么原因?谢谢
 回复 引用   
#24楼2009-06-12 19:50 | xjlone[未注册用户]
楼主的例子非常棒,不过还是有些bug,在ff下 圈人区域和输入标签不在一起,拖动下才在一起,而且拖动区域是满屏拖动,这个汗一个…… 既然是圈人应该只能在图像区域拖动才对.

俺刚学js不久,膜拜下lz,希望lz能完善这个圈人功能。网上搜到的都是转载lz的而且还没注明出处,真tmd操蛋,bs下。
除了lz的网上根本找不到类似的圈人功能,是没人会做还是藏着掖着怕人偷师这就不得而知了,反正我很敬佩lz这种精神,如果中国多点lz这样的人那么中国程序员的水平又会上一个层次……

 回复 引用   
#25楼2009-06-12 19:54 | xjlone[未注册用户]
--引用--------------------------------------------------
wubin: 您好,在IE下,某些图片,点击图片后,没有出现选取,IE7显示参数无效,IE6显示错误84,FF下正常。IE仅某些图片不正常,有时,刷新后可正常,有时,刷新也不能解决。请问什么原因?谢谢
--------------------------------------------------------

你传到服务器上就没这个情况了,在本地测试ie就会出这个问题,我也不知道为啥,等lz解答了……