jq自定义裁剪,代码超级简单,易修改

Posted 小结巴巴吧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jq自定义裁剪,代码超级简单,易修改相关的知识,希望对你有一定的参考价值。

1.自定义宽高效果

 

  1.html 代码  index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./jquery-1.12.4.min.js"></script>
</head>
<body>
<img class="source" src="./test2.jpg" alt="">
<img src="" class="target" alt="">

</body>
</html>

  

  2.添加插件代码

 (function ($) {
        $.fn.photoCrop=function (option) {
            var opt={
                img:\'\',
                fixedScale:9/5,
                isHead:null,
                maxWidth:\'1400\',
                maxHeight:\'800\',
                callBack:function () {}
            }
            opt=$.extend(opt,option);
            var _this=this;
            var imgSrc=opt.img ? opt.img:_this.attr(\'src\');
            var photoCropBox=$(\'<div id="photoCropBox" style="position: fixed;width: 100%;height: 100%;top: 0;left: 0;background: rgba(0,0,0,0.5);z-index: 99999;padding: 20px;">\' +
                \'<canvas id="cropCanvas" style="position: absolute;opacity:1;left: 0;top: 0;z-index: 100"></canvas><img  id="dataImg" src="\'+imgSrc+\'" style="opacity: 0;position: absolute" alt=""><div id="photoCropBox-panel-box" style="position: relative;width: 100%;height: 100%;">\' +
                \'<div id="photoCropBox-panel" style="opacity:0;background: #eee;border-radius: 5px;max-width: \'+opt.maxWidth+\'px;max-height: \'+opt.maxHeight+\'px;position: absolute;text-align: center"><div id="photoCropBox-img" style="margin: 40px 60px 20px;display: inline-block;position: relative">\' +
                \'<img src="\'+imgSrc+\'" style="max-width: 100%;display: block;max-height: 100%;max-height: \'+(opt.maxHeight-110)+\'px;" alt=""></div><div id="photoCropBox-option" style="text-align: right;padding-right: 50px;padding-bottom: 20px;position: relative;z-index: 2"><span id="photoCropBox-end">裁剪</span><span id="photoCropBox-start">手动裁剪</span><span id="photoCropBox-cancel">取消</span></div></div>\' +
                \'</div></div>\');
            $(\'body\').append(photoCropBox);
            var _box=$(\'#photoCropBox-img\');
            var imgWidth=_box.find(\'img\').width();

            $(\'#photoCropBox-option span\').css({
                lineHeight:\'30px\',
                background:\'#000\',
                color:\'#fff\',
                display:\'inline-block\',
                paddingLeft:\'20px\',
                paddingRight:\'20px\',
                marginRight:\'5px\',
                cursor:\'pointer\'
            })

            var cropBox=$(\'<div id="photoCropBox-cropBox" style="position: absolute;z-index: 5;cursor: Move;display: none">\' +
                \'<div id="cropBoxLine" style="overflow: hidden;position: absolute;width: 100%;height: 100%;">\' +
                \'<img src="\'+imgSrc+\'" style="display: block;width: \'+_box.find(\'img\').width()+\'px;position: absolute;max-height: none;max-width: none" alt="">\' +
                \'<div class="top line" style="width: 100%;height: 1px;top: 0;left: 0;"></div><div class="right line" style="height: 100%;width: 1px;top: 0;right: 0"></div>\' +
                \'<div class="line bottom" style="width: 100%;height: 1px;bottom: 0px;left: 0"></div><div class="left line" style="height: 100%;width: 1px;top: 0;left: 0"></div></div>\' +
                \'<div id="cropBoxLine2"><div class="left line2" style="height: 100%;width: 1px;top: 0;left: 0;cursor: w-resize"></div><div class="right line2" style="height: 100%;width: 1px;top: 0;right: 0;cursor: e-resize"></div><div class="top line2" style="width: 100%;height: 1px;top: 0;left: 0;cursor: n-resize;position: absolute"></div><div class="bottom line2" style="width: 100%;height: 1px;bottom: 0px;left: 0;cursor: s-resize"></div>\' +
                \'<div class="left bot" style="left: -3px;top: 50%;margin-top: -4px;cursor: w-resize"></div><div class="right bot" style="right: -3px;top: 50%;margin-top: -4px;cursor: e-resize"></div><div class="bottom bot" style="bottom: -3px;left: 50%;margin-left: -4px;cursor: s-resize"></div><div class="top bot" style="top: -3px;left: 50%;margin-left: -4px;cursor: n-resize"></div>\' +
                \'<div class="left-top bot" style="left: -3px;top: -3px;cursor: nw-resize"></div><div class="left-bottom bot" style="left: -3px;bottom: -3px;cursor: sw-resize"></div><div class="right-top bot" style="right: -3px;top: -3px;cursor: ne-resize"></div><div class="right-bottom bot"style="right: -3px;bottom: -3px;cursor: se-resize"></div></div></div>\');
            var screen=$(\'<div id="photoCropBox-bg" style="background: rgba(0,0,0,.5);position: absolute;left: 0;top: 0;width: 100%;height: 100%;z-index: 4;cursor: crosshair;display: none"></div>\')
            _box.append(cropBox);
            _box.append(screen);
            var _corp=$(\'#photoCropBox-cropBox\');
            var cropBoxLine=$(\'#cropBoxLine\');
            setTimeout(function () {
                console.log(imgWidth)
                cropBoxLine.find(\'img\').css(\'width\',_box.find(\'img\').width()+\'px\')
            },20)
            if(opt.isHead){
                cropBoxLine.css({borderRadius:\'100%\'})
            }
            $(\'#photoCropBox-cropBox .line,#photoCropBox-cropBox .line2\').css({
                background:\'url(./img/Jcrop.gif)\',
                position:\'absolute\',
                opacity:.5
            })
            $(\'#photoCropBox-cropBox .bot\').css({
                background:\'rgba(0,0,0,0.5)\',
                position:\'absolute\',
                width:7,
                height:7,
                border:\'1px #999 solid\'
            })
            setTimeout(function () {
                init();
            },10)
            $(window).on(\'resize\',function () {
                setPosition();
            })
            $(\'#photoCropBox-cancel\').on(\'click\',function () {
                closeBox();
            })
            $(\'#photoCropBox-bg\').on(\'mousedown\',function (e) {
                if(opt.fixedScale) return  //固定
                $(\'#cropBoxLine2\').hide();
                var _this=$(this);
                var _sx=e.pageX,_sy=e.pageY;
                var _tx=_this.offset().left;
                var _ty=_this.offset().top;
                $(document).on(\'mousemove\',function (e) {
                    e.preventDefault();
                    var _ex=e.pageX,_ey=e.pageY;
                    getPosition(_ex,_ey,_ty,_tx,_sx,_sy,_this)
                })
                $(document).on(\'mouseup\',function () {
                    $(document).unbind(\'mousemove\');
                    $(\'#cropBoxLine2\').show();
                })
            })
            var lock=false;
            _corp.on(\'mousedown\',function (e) {
                if(lock){return}
                var _sx=e.pageX,_sy=e.pageY;
                var pW=$(\'#photoCropBox-bg\').width(),pH=$(\'#photoCropBox-bg\').height();
                var _this=$(this),_thisX=parseInt(_this.css(\'left\')),_thisY=parseInt(_this.css(\'top\')),_thisW=parseInt(_this.css(\'width\')),_thisH=parseInt(_this.css(\'height\'));
                $(document).on(\'mousemove\',function (e) {
                    e.preventDefault();
                    var _ex=e.pageX,_ey=e.pageY;
                    var _x=_ex-_sx,_y=_ey-_sy;
                    _x+=_thisX;_y+=_thisY;
                    if(_x<0) _x=0;
                    if(_y<0) _y=0;
                    if(_y>pH-_thisH) _y=pH-_thisH;
                    if(_x>pW-_thisW) _x=pW-_thisW;
                    resizeCropBox("","",_y,_x,true)
                })
                $(document).on(\'mouseup\',function () {
                    $(document).unbind(\'mousemove\');
                })
            })
            //控制大小
            $(\'#cropBoxLine2 .bot\').on("mousedown",function (e) {
                lock=true;
                var _esx=e.pageX,_esy=e.pageY;
                var _that=$(this);
                var _this=$(\'#photoCropBox-bg\');
                var _tx=_this.offset().left;
                var _ty=_this.offset().top;
                var _sx=_corp.offset().left,_sy=_corp.offset().top;//裁剪框
                if(_that.hasClass(\'right-top\')) _sy+=_corp.height();
                if(_that.hasClass(\'left-top\')){
                    _sy+=_corp.height();
                    _sx+=_corp.width();
                }
                if(_that.hasClass(\'left-bottom\')) _sx+=_corp.width();
                $(document).on(\'mousemove\',function (e) {
                    e.preventDefault();
                    var _ex=e.pageX,_ey=e.pageY;
                    if(opt.fixedScale){
                        _ey=(_ex-_esx)/opt.fixedScale+_esy;
                        if(_that.hasClass(\'right-top\') || _that.hasClass(\'left-bottom\')){
                            _ey=(_esx-_ex)/opt.fixedScale+_esy;
                        }
                    }
                    getPosition(_ex,_ey,_ty,_tx,_sx,_sy,_this)
                })
                $(document).on(\'mouseup\',function () {
                    $(document).unbind(\'mousemove\');
                    lock=false;
                })
            })
            $(\'#cropBoxLine2 .left,#cropBoxLine2 .top,#cropBoxLine2 .right,#cropBoxLine2 .bottom\').on(\'mousedown\',function (e) {
                if(opt.fixedScale) return  //固定
                lock=true;
                var _that=$(this);
                var _this=$(\'#photoCropBox-bg\');
                var _tx=_this.offset().left;//
                var _ty=_this.offset().top;
                var _sx=_corp.offset().left,_sy=_corp.offset().top;
                var ch=_corp.height(),cw=_corp.width();
                if(_that.hasClass(\'top\')){
                    _sy+=ch;
                }else if(_that.hasClass(\'left\')) {
                    _sx+=cw;
                }
                $(document).on(\'mousemove\',function (e) {
                    e.preventDefault();
                    var _ex=e.pageX,_ey=e.pageY;
                    if(_that.hasClass(\'top\') || _that.hasClass(\'bottom\')){
                        if(!(_ey-_sy>0)){
                            var _x=_sx-_tx,_y=_ey-_ty,_w=cw,_h=-(_ey-_sy);
                            if(_y<0) {_y=0;_h=_sy-_ty;}
                        }else{
                            var _x=_sx-_tx,_y=_sy-_ty,_w=cw,_h=_ey-_sy;
                            if(_h>_this.height()-_y) _h=_this.height()-_y;
                        }
                    }else {
                        if(_ex-_sx>0 && _ey-_sy>0){
                            var _x=_sx-_tx,_y=_sy-_ty,_w=_ex-_sx,_h=ch;
                            if(_w>_this.width()-_x) _w=_this.width()-_x;
                        }else if(!(_ex-_sx>0) && _ey-_sy>0){
                            var _x=_ex-_tx,_y=_sy-_ty,_w=-(_ex-_sx),_h=ch;
                            if(_x<0) {_x=0;_w=_sx-_tx;}
                        }
                    }
                    resizeCropBox(_w,_h,_y,_x);
                })

                $(document).on(\'mouseup\',function () {
                    $(document).unbind(\'mousemove\');
                    lock=false;
                })
            })

            $(\'#photoCropBox-start\').on(\'click\',function () {
                _corp.css(\'display\',\'block\')
                $(\'#photoCropBox-bg\').css(\'display\',\'block\')
            })
            $(\'#photoCropBox-end\').on(\'click\',function () {
                getImage()
                closeBox()
            })
            function init() {
                setPosition()
                if(opt.fixedScale){
                    if((_box.height()-_box.width()/opt.fixedScale/2)<0){
                        resizeCropBox(_box.height()*opt.fixedScale,_box.height(),0,(_box.width()-_box.height()*opt.fixedScale)/2)
                    }else {
                        resizeCropBox(_box.width()/2,_box.width()/opt.fixedScale/2,(_box.height()-_box.width()/opt.fixedScale/2)/2,_box.width()/4)
                    }
                }else {
                    resizeCropBox(_box.width()/2,_box.height()/2,_box.height()/4,_box.width()/4)
                }

                if(opt.fixedScale) {
                    $(\'.bot.top,.bot.left,.bot.bottom,.bot.right\').remove();//固定
                }
            }
            function setPosition() {
                $(\'#photoCropBox-panel\').css({
                    top:($(\'#photoCropBox-panel-box\').height()-$(\'#photoCropBox-panel\').height())/2+\'px\',
                    left:($(\'#photoCropBox-panel-box\').width()-$(\'#photoCropBox-panel\').width())/2+\'px\',
                    opacity:1
                })
            }
            //结束x,y  背景x,y
            function getPosition(_ex,_ey,_ty,_tx,_sx,_sy,_this) {
                if(_ex-_sx>0 && _ey-_sy>0){
                    var _x=_sx-_tx,_y=_sy-_ty,_w=_ex-_sx,_h=_ey-_sy;
                    if(_w>_this.width()-_x) _w=_this.width()-_x;
                    if(_h>_this.height()-_y) _h=_this.height()-_y;
                }else if(!(_ex-_sx>0) && _ey-_sy>0){
                    var _x=_ex-_tx,_y=_sy-_ty,_w=-(_ex-_sx),_h=_ey-_sy;
                    if(_x<0) {_x=0;_w=_sx-_tx;}
                    if(_h>_this.height()-_y) _h=_this.height()-_y;
                }else if(!(_ex-_sx>0) && !(_ey-_sy>0)){
                    var _x=_ex-_tx,_y=_ey-_ty,_w=-(_ex-_sx),_h=-(_ey-_sy);
                    if(_x<0) {_x=0;_w=_sx-_tx;}
                    if(_y<0) {_y=0;_h=_sy-_ty;}
                }else if(_ex-_sx>0 && !(_ey-_sy>0)){
                    var _x=_sx-_tx,_y=_ey-_ty,_w=_ex-_sx,_h=-(_ey-_sy);
                    if(_y<0) {_y=0;_h=_sy-_ty;}
                    if(_w>_this.width()-_x) _w=_this.width()-_x;
                }
                if(opt.fixedScale){
                    if(_w/opt.fixedScale>_h){
                        _w=_h*opt.fixedScale
                    }else if (_w<opt.fixedScale*_h){
                        _h=_w/opt.fixedScale
                    }
                }
                resizeCropBox(_w,_h,_y,_x);
            }
            var c=document.getElementById("cropCanvas");
            var ctx=c.getContext("2d");
            var img=$(\'#dataImg\');
            function getImage() {
                var scale=$(\'#photoCropBox-img\').width()/$(\'#dataImg\').width();
                var sx=parseInt(_corp.css(\'left\'))/scale;
                var sy=parseInt(_corp.css(\'top\'))/scale;
                var swidth=parseInt(_corp.css(\'width\'))/scale;
                var sheight=parseInt(_corp.css(\'height\'))/scale;
                var c_img = new Image;
                c_img.onload = function () {
                    ctx.drawImage(c_img,sx,sy,swidth,sheight,0,0,swidth,sheight);
                    var url=c.toDataURL("image/jpeg");
                    opt.callBack(url);
                };
                c_img.crossOrigin = \'anonymous\'; //可选值:anonymous,*
                c_img.src = imgSrc
                c.width = swidth;
                c.height = sheight;

            }
            //宽,高,top,left,m-是否是拖拽
            function resizeCropBox(w,h,t,l,m) {
                _corp.css(prefix()+\'transition\',\'all 0s\');
                if(!m){
                    _corp.css({
                        width:w,
                        height:h,
                        top:t+\'px\',
                        left:l+\'px\'
                    })
                }else {
                    _corp.css({
                        top:t+\'px\',
                        left:l+\'px\'
                    })
                }
                cropBoxLine.find(\'img\').css({
                    top:-t+\'px\',
                    left:-l+\'px\'
                })
            }
            function closeBox() {
                $(\'#photoCropBox\').remove();
            }
            function prefix() {
                var prefixes=[\'\',\'-ms-\',\'-moz-\',\'-webkit-\',\'-o-\'],i=0;
                while (i < prefixes.length){
                    if($(\'body\').css(prefixes[i]+\'transition\')){
                        return prefixes[i];
                    }
                    i++;
                }
            }

        }
    })(jQuery)

  

  3.绑定代码

   $(function () {
        $(\'.source\').on(\'click\',function () {
            $(this).photoCrop({
                fixedScale:false,
                isHead:false,
                callBack:function(url){
                    $(\'.target\').attr(\'src\',url)
                },
            });
        })

    })

  

 

2.宽高比例固定效果

 

  代码:

  $(function () {
        $(\'.source\').on(\'click\',function () {
            $(this).photoCrop({
                fixedScale:5/6,
                isHead:false,
                callBack:function(url){
                    $(\'.target\').attr(\'src\',url)
                },
            });
        })
    })

  

3.头像裁剪效果

 

  代码:

  $(function () {
        $(\'.source\').on(\'click\',function () {
            $(this).photoCrop({
                fixedScale:1,
                isHead:true,
                callBack:function(url){
                    $(\'.target\').attr(\'src\',url)
                },
            });
        })
    })

  

以上代码易修改,大家可以自行扩展。

个人博客 :很多好用的 npm 包 , 可以看看  https://gilea.cn/ 

http://www.cnblogs.com/jiebba    我的博客,来看吧!

 

以上是关于jq自定义裁剪,代码超级简单,易修改的主要内容,如果未能解决你的问题,请参考以下文章

易语言读sqlserver2008日期型字段

查看发票组代码后的总结和有感

VSCode插件开发全攻略代码片段设置自定义欢迎页

SQL Prompt7.2下载及破解教程

手写简单的jq雪花飘落

VSCode自定义代码片段——CSS选择器