Fork me on GitHub

截取图片组件

css:

body{background: #333;margin:0;padding:0;}
            .clipImgBox{position: absolute;top:0;left:0;width:460px;height:360px;}
            .clipImgBox .clipImgBoxmain{position: absolute;width: 200px;height: 200px;border:1px solid #fff;z-index: 2;cursor: move}
            .clipImgBox .minDiv{width:8px;height:8px;background: #fff;font-size: 0;position: absolute;}
            .clipImgBox .minDiv.left-up{top:-4px;left: -4px;cursor:nw-resize;}
            .clipImgBox .minDiv.left{top:50%;margin-top:-4px;left: -4px;cursor:e-resize;}
            .clipImgBox .minDiv.left-down{bottom:-4px;left: -4px;cursor:sw-resize;}
            .clipImgBox .minDiv.top{top:-4px;left: 50%;margin-left:-4px;cursor:n-resize;}
            .clipImgBox .minDiv.right-up{top:-4px;right: -4px;cursor:ne-resize;}
            .clipImgBox .minDiv.right{top:50%;margin-top:-4px;right: -4px;cursor:e-resize;}
            .clipImgBox .minDiv.right-down{bottom:-4px;right: -4px;cursor:se-resize;}
            .clipImgBox .minDiv.bottom{bottom:-4px;left: 50%;margin-left:-4px;cursor:s-resize;}
            
            .clipImgBox-preview img,.clipImgBox img{position: absolute;z-index: 1}
            .clipImgBox .img1{opacity: 0.5}
            .clipImgBox .img2{clip:rect(0px,20px,100px,100px);}

            .clipImgBox-preview{position: absolute;top:100px;top:0;left:0;height:360px;}
            .clipImgBox-preview #img3{position: absolute;top:0;left:0;}

 

js:

/**
*  参数:
    imgPath  图片路径
    getPosObj:  数组  两个参数  触发对象String  触发函数function
    boxPosition: 容器的定位方式,相当于css的position
    返回截取位置对象,左上角坐标和宽高
**/

;(function(factory){
    'use strict';
    if(typeof define == 'function' && (define.amd||define.cmd)){
        define(["jquery","jqeryUI"],factory);
    }else if(typeof exports == "object"){
        module.exports=factory();
    }else{
        factory()
    }
})(function(){
    //禁止选中
    document.onselectstart=new Function('event.returnValue=false;');

    function init($this,option){
        //初始化位置
    var imgW=$this.find(".img1").width(),
        imgH=$this.find(".img1").height();
    $this.find(".clipImgBox").width(imgW);
    $this.find(".clipImgBox").height(imgH);
    $this.find("#clipImgBox-preview").css({left:$this.find(".clipImgBox").offset().left+imgW+10});

    var boxPosition=option.boxPosition||"relative";
    $this.css({"height":imgH,"position":boxPosition});

    //截取位置
    var jPos={};

    var boxDiv = $this.find(".clipImgBox")[0];//外层容器
    var mainDiv = $this.find('.clipImgBoxmain')[0];//选择层
    var leftUpDiv = $this.find('#left-up')[0];//坐上角触点
    var leftDiv = $this.find('#left')[0];//左中间触点
    var leftDownDiv = $this.find('#left-down')[0];//左下角触点
    var upDiv = $this.find('#up')[0];//上中间触点
    var downDiv = $this.find('#down')[0];//下中间触点
    var rightUpDiv = $this.find('#right-up')[0];//右上角触点
    var rightDiv = $this.find('#right')[0];//右中间触点
    var rightDownDiv = $this.find('#right-down')[0];//右下角触点


    var ifBool = false;//判断鼠标是否按下
    var contact = "";//当前拖动的触点

/*
        事件区
*/
    $this.find(".clipImgBoxmain").draggable({ containment: 'parent' ,drag: setChoice});
    //鼠标按下-左上角
    $(leftUpDiv).on("mousedown",function(e){
        ifBool = true;
        contact = "leftUp";
        wMoveAndUp();
        return false;
    });
    //鼠标按下-左中间
    $(leftDiv).on("mousedown",function(e){
        
        ifBool = true;
        contact = "left";
        wMoveAndUp();
        return false;
    });
    //鼠标按下-左下角
    $(leftDownDiv).on("mousedown",function(e){
        
        ifBool = true;
        contact = "leftDown";
        wMoveAndUp();
        return false;
    });
    //鼠标按下-上边
    $(upDiv).on("mousedown" ,function(e){
        
        ifBool = true;
        contact = "up";
        wMoveAndUp();
        return false;
    });
    //鼠标按下-下边
    $(downDiv).on("mousedown" ,function(e){
        
        ifBool = true;
        contact = "down";
        wMoveAndUp();
        return false;
    });
    //鼠标按下-右上角
    $(rightUpDiv).on("mousedown" ,function(e){
        
        ifBool = true;
        contact = "rightUp";
        wMoveAndUp();
        return false;
    });
    //鼠标按下-右中间
    $(rightDiv).on("mousedown",function(e){
        
        ifBool = true;
        contact = "right";
        wMoveAndUp()
        return false;
    });
    //鼠标按下-右下角
    $(rightDownDiv).on("mousedown",function(e){
        ifBool = true;
        contact = "rightDown";
        wMoveAndUp();
        return false;
    });
    function wMoveAndUp(){
        //拖动
        $(dcument).on("mousemove.win",function(e){
            
            if(ifBool){
                switch(contact){
                    case "leftUp":leftMove(e);upMove(e);break;
                    case "left":leftMove(e);break;
                    case "leftDown":leftMove(e);downMove(e);break;
                    case "up":upMove(e);break;
                    case "down":downMove(e);break;
                    case "rightUp":rightMove(e);upMove(e);break;
                    case "right":rightMove(e);break;
                    case "rightDown":rightMove(e);downMove(e);break;
                    default:alert("操作错误!");
                }
            var width = mainDiv.offsetWidth;
            var height = mainDiv.offsetHeight;
            setChoice();
            }
            return false;
        });
        //鼠标松开
        $(dcument).on("mouseup.win",function(e){
            ifBool = false;
            contact = "";
            $(dcument).off(".win");
            return false;
        });
    }
    setChoice();//初始化选择区域可见





/*
        函数区
*/

        //左边拖动
        function leftMove(e){
            var x = e.clientX;//鼠标横坐标
            if(x < getPosition(boxDiv).left){
                x = getPosition(boxDiv).left;
            }
            var width = mainDiv.offsetWidth - 2;//选择层宽度
            var mainX = getPosition(leftUpDiv).left + 4;//左上角横坐标
            var addWidth = mainX - x;//拖动后应该增加的宽度

            //设置拖动后的宽高和位置
            mainDiv.style.width = (width + addWidth) + "px";
            mainDiv.style.left = mainDiv.offsetLeft - mainX + x + "px";
        }
        //上边拖动
        function upMove(e){
            var y = e.clientY;//鼠标纵坐标
            if(y < getPosition(boxDiv).top){
                y = getPosition(boxDiv).top;
            }
            var height = mainDiv.offsetHeight - 2;//选择层的高度
            var mainY = getPosition(leftUpDiv).top + 4;//左上角纵坐标
            var addHeight = mainY - y;//拖动后应该增加的高度
            
            //设置拖动后的宽高和位置
            mainDiv.style.height = (height + addHeight) + "px";
            mainDiv.style.top = mainDiv.offsetTop - mainY + y + "px"; //纵坐标减去增加的高度
        }
        //下边拖动
        function downMove(e){
            var y = e.clientY;//鼠标纵坐标
            if(y > getPosition(boxDiv).top + boxDiv.offsetHeight){
                y = getPosition(boxDiv).top + boxDiv.offsetHeight;
            }
            var height = mainDiv.offsetHeight - 2;//选择层的高度
            var mainY = getPosition(leftUpDiv).top + 4;//左上角纵坐标
            var addHeight = y - mainY - height;//拖动后应该增加的高度
            mainDiv.style.height = (height + addHeight) + "px";
        }
        //右边拖动
        function rightMove(e){
            var x = e.clientX;//鼠标横坐标
            if(x > getPosition(boxDiv).left + boxDiv.offsetWidth){
                x = getPosition(boxDiv).left + boxDiv.offsetWidth;
            }
            var width = mainDiv.offsetWidth - 2;//选择层宽度
            var mainX = getPosition(leftUpDiv).left + 4;//左上角横坐标
            var addWidth = x - width - mainX;//拖动后应该增加的宽度

            //设置拖动后的宽高和位置
            mainDiv.style.width = (width + addWidth) + "px";
        }
        //设置选择区域可见
        function setChoice(){
            var top = mainDiv.offsetTop;
            var right = mainDiv.offsetLeft + mainDiv.offsetWidth;
            var bottom = mainDiv.offsetTop + mainDiv.offsetHeight;
            var left = mainDiv.offsetLeft;
            $this.find("#img2")[0].style.clip = "rect("+top+"px,"+right+"px,"+bottom+"px,"+left+"px)";
            preview({"top":top,"right":right,"bottom":bottom,"left":left});

        }
        //获取元素的绝对位置
        function getPosition(node){
            var left = node.offsetLeft;
            var top = node.offsetTop;
            current = node.offsetParent; // 取得元素的offsetParent
             // 一直循环直到根元素
          while (current != null) {
              left += current.offsetLeft;
              top += current.offsetTop;
              current = current.offsetParent;
          }
            return {"left":left,"top":top};
        }

        //预览
        function preview(view){
            jPos=view;
            var previewImg = $this.find("#img3")[0];
            previewImg.style.top = -view.top + "px";
            previewImg.style.left = -view.left + "px";
            previewImg.style.clip = "rect("+view.top+"px,"+view.right+"px,"+view.bottom+"px,"+view.left+"px)";
        }

        function getJpos(){
            var obj={};
            obj["top"]=jPos["top"]||0;
            obj["left"]=jPos["left"]||0;
            obj["height"]=(jPos["bottom"]||0)-(jPos["top"]||0);
            obj["width"]=(jPos["right"]||0)-(jPos["left"]||0);
            return obj;
        }
        if(option.getPosObj&&option.getPosObj.length==2){
            var optFn,optObj;
            for(var i=0;i<option.getPosObj.length;i++){
                if(typeof option.getPosObj[i]=="string"){
                    optObj=option.getPosObj[i];
                }else if(typeof option.getPosObj[i]=="function"){
                    optFn=option.getPosObj[i];
                }
            }
            if(!optFn||!optObj){
                return ;
            }
            $(optObj).on("click",function(){
                optFn(getJpos());
            });
    }
    }

    function htmlTemp($this,opt){
        var str='<div class="clipImgBox">\
            <img class="img1" src="_src_"/>\
            <img id="img2" class="img2" src="_src_"/>\
            <div class="clipImgBoxmain" >\
                <div id="left-up" class="minDiv left-up"></div>\
                <div id="left" class="minDiv left"></div>\
                <div id="left-down" class="minDiv left-down"></div>\
                <div id="up" class="minDiv top"></div>\
                <div id="right-up" class="minDiv right-up"></div>\
                <div id="right" class="minDiv right"></div>\
                <div id="right-down" class="minDiv right-down"></div>\
                <div id="down" class="minDiv bottom"></div>\
            </div>\
        </div>\
        <div id="clipImgBox-preview" class="clipImgBox-preview">\
            <img id="img3" class="img3" src="_src_"/>\
        </div>';
        $this.html(str.replace(/_src_/g,opt.imgPath||""));
        init($this,opt);
    }

    function imgLoading($this,opt){
        var oImg=$("<img />");
            oImg.attr("src",opt.imgPath||"");
            oImg.on("load",function(){
                htmlTemp($this,opt);
            });
            oImg.on("error",function(){
                console.error("图片路径错误!");
            });
    }

    $.fn.clipImg=function(option){
        if(!option){
            console.error("缺少参数!!!");
            return ;
        }
        imgLoading($(this),option);
    }
    return imgLoading;
});

 

例子:

<!DOCTYPE html>
<html lang="zh-cn">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>效果图</title>
        <script type="text/javascript" src="jquery-1.8.1.min.js"></script>
        <script type="text/javascript" src="jquery-ui-1.10.4.custom.min.js"></script>
        <script type="text/javascript" src="main.js"></script>
        <style type="text/css">
            body{background: #333;margin:0;padding:0;}
            .clipImgBox{position: absolute;top:0;left:0;width:460px;height:360px;}
            .clipImgBox .clipImgBoxmain{position: absolute;width: 200px;height: 200px;border:1px solid #fff;z-index: 2;cursor: move}
            .clipImgBox .minDiv{width:8px;height:8px;background: #fff;font-size: 0;position: absolute;}
            .clipImgBox .minDiv.left-up{top:-4px;left: -4px;cursor:nw-resize;}
            .clipImgBox .minDiv.left{top:50%;margin-top:-4px;left: -4px;cursor:e-resize;}
            .clipImgBox .minDiv.left-down{bottom:-4px;left: -4px;cursor:sw-resize;}
            .clipImgBox .minDiv.top{top:-4px;left: 50%;margin-left:-4px;cursor:n-resize;}
            .clipImgBox .minDiv.right-up{top:-4px;right: -4px;cursor:ne-resize;}
            .clipImgBox .minDiv.right{top:50%;margin-top:-4px;right: -4px;cursor:e-resize;}
            .clipImgBox .minDiv.right-down{bottom:-4px;right: -4px;cursor:se-resize;}
            .clipImgBox .minDiv.bottom{bottom:-4px;left: 50%;margin-left:-4px;cursor:s-resize;}
            
            .clipImgBox-preview img,.clipImgBox img{position: absolute;z-index: 1}
            .clipImgBox .img1{opacity: 0.5}
            .clipImgBox .img2{clip:rect(0px,20px,100px,100px);}

            .clipImgBox-preview{position: absolute;top:100px;top:0;left:0;height:360px;}
            .clipImgBox-preview #img3{position: absolute;top:0;left:0;}
        </style>
    </head>
    <body>
    <div id="box">
    </div>
        <button id="getPos">获取</button>
<div id="box2">
    </div>
        <button id="getPos2">获取</button>

    </body>
</html>
<script>
function getPos(obj){
    console.log(obj);
}
function getPos2(obj){
    console.log(obj);
}

    $("#box").clipImg({imgPath:"1.jpg",getPosObj:[getPos,"#getPos"]});
    $("#box2").clipImg({imgPath:"2.jpg",getPosObj:[getPos2,"#getPos2"]});
</script>

它是基于jquery和jQueryUI做的。

使用jQueryUI是为了拖拽。

 

posted @ 2017-09-16 15:49  小数点就是问题  阅读(231)  评论(0编辑  收藏  举报