js+jquery实现图片裁剪功能
2023-06-13 09:15:38 时间
现在我们在使用各大网站的个人中心时,都有个上传个人头像的功能。用户在上传了个人照片之后,可能不符合网站的要求,于是要求用户对照片进行裁剪,最终根据用户裁剪的尺寸生成头像。这个功能真是太棒了,原来不懂js的时候,感觉很神奇,太神奇了。心想哪天要是自己也能搞明白这里面的技术,那该多牛呀~大家是不是也有何我一样的想法呀~哈哈~~
下面我们就来用javascript来实现这个功能吧。
<!DOCTYPEhtml>
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/>
<title>clip</title>
<styletype="text/css">
*{padding:0;margin:0;}
ul{list-style-type:none;overflow:hidden;zoom:1;width:1000px;margin:30pxauto;}
li{float:left;width:500px;}
#container{width:480px;height:480px;margin:0auto;border:1pxsolid#999;position:relative;background:url(http://images.cnblogs.com/cnblogs_com/wtcsy/192373/r_xx.jpg);}
#container.block{height:100px;width:100px;border:1pxsolid#000000;position:absolute;left:50px;top:50px;background:#fff;filter:alpha(opacity=30);opacity:0.3;cursor:move;}
#container.tips{position:absolute;padding:5px;border:1pxsolid#ccc;background:#fff;filter:alpha(opacity=60);opacity:0.6;display:none;font-size:12px;color:#333;;}
.tipsspan{display:inline-block;zoom:1;width:28px;}
.rRightDown,.rLeftDown,.rLeftUp,.rRightUp,.rRight,.rLeft,.rUp,.rDown{
position:absolute;background:#f00;width:6px;height:6px;z-index:5;font-size:0;}
.rLeftDown,.rRightUp{cursor:ne-resize;}
.rRightDown,.rLeftUp{cursor:nw-resize;}
.rRight,.rLeft{cursor:e-resize;}
.rUp,.rDown{cursor:n-resize;}
.rRightDown{bottom:-3px;right:-3px;}
.rLeftDown{bottom:-3px;left:-3px;}
.rRightUp{top:-3px;right:-3px;}
.rLeftUp{top:-3px;left:-3px;}
.rRight{right:-3px;top:50%}
.rLeft{left:-3px;top:50%}
.rUp{top:-3px;left:50%}
.rDown{bottom:-3px;left:50%}
#imgC{border:1pxsolid#CCC;width:0;height:0;margin:0auto;background:url(http://images.cnblogs.com/cnblogs_com/wtcsy/192373/r_xx.jpg);}
.code{
background:nonerepeatscroll00#E3F4F9;
border:1pxsolid#BAE2F0;
font:12px"CourierNew",Courier,monospace;
margin:30pxauto;
padding:10px10px40px;
width:980px;
}
.codep{height:24px;line-height:24px;}
.codespan{display:inline-block;zoom:1;margin-right:5px;width:85px;font-weight:bold;color:#00F}
</style>
</head>
<body>
<divclass="code">
<divclass="how">使用方法</div>
<p>$("#container").clip({
imgC:$("#imgC"),
blockClass:"block",
tipsClass :"tips"
});</p>
<p><span>imgC:</span>表示裁剪图片的容器,也就是右边的图</p>
<p><span>blockClass:</span>block的样式名 也就是页面上的可以拖动的滑块的样式因为怕和别的页面上的样式重名 默认是block</p>
<p><span>tipsClass :</span>tips的样式名 也就是页面上显示leftwidthheighttop的那个span的样式名默认是tips</p>
</div>
<ul>
<li>
<divid="container"></div>
</li>
<li>
<divid="imgC"></div>
</li>
</ul>
<scripttype="text/javascript"src="http://common.cnblogs.com/script/jquery.js"></script>
<scripttype="text/javascript">
(function(){
vardBody=document.body,
dDoc=document.documentElement,
ie =$.browser.msie;
ie&&($.browser.version=="6.0")
&&document.execCommand("BackgroundImageCache",false,true);
var clip= function(options){
this.init.call(this,options);
}
clip.prototype={
options:{
moveCallBack:function(){},
blockClass:"block",
tipsClass :"tips"
},
init:function(options){
$.extend(this,this.options,options||{});
if(!this.container||!this.imgC){
return;
}
this.container=$(this.container);
varself=this;
this.block=$("<divclass=""+this.blockClass+"">\
<divaction="rightDown"class="rRightDown"></div>\
<divaction="leftDown"class="rLeftDown"></div>\
<divaction="rightUp"class="rRightUp"></div>\
<divaction="leftUp"class="rLeftUp"></div>\
<divaction="right"class="rRight"></div>\
<divaction="left"class="rLeft"></div>\
<divaction="up"class="rUp"></div>\
<divaction="down"class="rDown"></div>\
</div>")
.bind("mousedown.r",function(e){self.start(e)})
.appendTo(this.container[0]);
this.tips=$("<spanclass=""+this.tipsClass+""/>").appendTo(this.container[0]);
this.setImg();
},
setImg:function(){
varblock=this.block;
varleft =block.css("left"),
top =block.css("top"),
height=block.height(),
width =block.width();
this.imgC.css({
height:height,
width:width,
"background-position":"-"+left+"-"+top
});
this.tips.html("left:<span>"+parseInt(left)+"</span>top:<span>"++parseInt(top)+"</span>width:<span>"+width+"</span>height:<span>"+height+"</span>");
},
start:function(e){
var$elem =$(e.target),
block =this.block,
self =this,
move =false,
container=this.container,
action =$elem.attr("action");
//这个每次都要计算基本dom结构的改变浏览器的缩放都会让里面的值发生改变
this.offset=$.extend({height:container.height(),width:container.width()},container.offset());
this.blockOriginal={height:block.height(),width:block.width(),left:parseInt(block.css("left")),top:parseInt(block.css("top"))};
if(action){
this.fun=this[action];
}else{
this.x=e.clientX-this.offset.left-this.blockOriginal.left;
this.y=e.clientY-this.offset.top-this.blockOriginal.top;
move=true;
}
ie
&&this.block[0].setCapture();
this.tips.show();
$(document)
.bind("mousemove.r",function(e){self.move(e,move)})
.bind("mouseup.r",function(){self.end()});
},
end :function(){
$(document)
.unbind("mousemove.r")
.unbind("mouseup.r");
ie
&&this.block[0].releaseCapture();
this.tips.hide();
},
move:function(e,isMove){
window.getSelection
?window.getSelection().removeAllRanges()
:document.selection.empty();
varblock=this.block;
if(isMove){
varleft=Math.max(0,e.clientX-this.offset.left-this.x);
left=Math.min(left,this.offset.width-this.blockOriginal.width);
vartop=Math.max(0,e.clientY-this.offset.top-this.y);
top=Math.min(top,this.offset.height-this.blockOriginal.height);
block.css({left:left,top:top});
}else{
varoffset=this.fun(e);
block.css(offset);
}
this.setImg();
this.moveCallBack();
},
down:function(e){
varblockOriginal=this.blockOriginal,
sTop=Math.max(dBody.scrollTop,dDoc.scrollTop),//出现垂直方向滚动条时候要计算这个
offset=this.offset;
if(e.clientY-offset.top>=blockOriginal.top-sTop){
varheight=Math.min(offset.height-blockOriginal.top,e.clientY-offset.top-blockOriginal.top+sTop),
top=blockOriginal.top;
}else{
varheight=Math.min(offset.top+blockOriginal.top-e.clientY-sTop,blockOriginal.top),
top=Math.max(e.clientY-offset.top+sTop,0);
}
return{height:height,top:top};
},
up:function(e){
varblockOriginal=this.blockOriginal,
sTop=Math.max(dBody.scrollTop,dDoc.scrollTop),
offset=this.offset;
if(e.clientY-offset.top-blockOriginal.height<=blockOriginal.top-sTop){
vartop=Math.max(e.clientY-offset.top+sTop,0),
maxHeight=blockOriginal.top+blockOriginal.height,
height=Math.min(maxHeight,blockOriginal.top+blockOriginal.height-(e.clientY-offset.top)-sTop);
}else{
varheight=Math.min(e.clientY-offset.top-blockOriginal.top-blockOriginal.height+sTop,offset.height-blockOriginal.top-blockOriginal.height),
top=blockOriginal.top+blockOriginal.height;
}
return{height:height,top:top};
},
left:function(e){
varblockOriginal=this.blockOriginal,
offset=this.offset;
if(e.clientX-offset.left-blockOriginal.width-blockOriginal.left<=0){
varleft =Math.max(e.clientX-offset.left,0),
width=Math.min(blockOriginal.left+blockOriginal.width,blockOriginal.left+blockOriginal.width-(e.clientX-offset.left));
}else{
varwidth=Math.min(e.clientX-offset.left-blockOriginal.left-blockOriginal.width,offset.width-blockOriginal.left-blockOriginal.width),
left =blockOriginal.left+blockOriginal.width;
}
return{left:left, width:width};
},
right:function(e){
varblockOriginal=this.blockOriginal,
offset=this.offset;
if(e.clientX-offset.left>=blockOriginal.left){
varwidth=Math.min(offset.width-blockOriginal.left,e.clientX-offset.left-blockOriginal.left),
left =blockOriginal.left;
}else{
varwidth=Math.min(offset.left+blockOriginal.left-e.clientX,blockOriginal.left),
left =Math.max(e.clientX-offset.left,0);
}
return{left:left, width:width};
},
rightDown:function(e){
return$.extend(this.right(e),this.down(e));
},
leftDown:function(e){
return$.extend(this.left(e),this.down(e));
},
rightUp:function(e){
return$.extend(this.right(e),this.up(e));
},
leftUp:function(e){
return$.extend(this.left(e),this.up(e));
},
getValue:function(){
varblock=this.block;
return{
left :parseInt(block.css("left")),
top :parseInt(block.css("top")),
width :block.width(),
height:block.height()
}
}
}
$.fn.clip=function(options){
options.container=this;
returnnewclip(options);
}
})();
xx=$("#container").clip({
imgC:$("#imgC")
})
</script>
</body>
</html>
是不是很炫酷啊,小伙伴们,学学本示例的思路吧。
相关文章
- js书写原生ajax,JS 原生ajax写法
- 原生 JS 实现 HTML 转 Markdown,以及其实现逻辑(html2md.js 或 html2markdown.js)
- 正在加载中-js/jQuery功能实现详解编程语言
- 使用 JS 操作 Redis:实现强大数据存储.(js调用redis)
- 使用JS在网页中连接Oracle数据库(js网页链接oracle)
- JS函数验证总结(方便js客户端输入验证)
- js,jQuery排序的实现代码,网页标签排序的实现,标签排序
- 利用jquery的获取JS文件中的字符串内容
- js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
- jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
- jquery.blockUI.js上传滚动等待效果实现思路及代码
- jQuery学习笔记(2)--用jquery实现各种模态提示框代码及项目构架
- JS加jquery简单实现标签元素的显示或隐藏
- js或jquery实现页面打印可局部打印
- Jquery+asp.net后台数据传到前台js进行解析的方法
- Jquery操作js数组及对象示例代码
- AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
- js制作简易年历完整实例
- jQuery及JS实现循环中暂停的方法