截图框如何实现

320 阅读3分钟

如图所示,使用jquery简单实现,也是一个思路:

index.html

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>选择框</title>    <link rel="stylesheet" href="css.css"></head><body ><script src="jquery-3.2.1.min.js"></script><div class="clip">    <img class="photo" src="./assets/img/04.jpg" />    <img class="showClip" src="./assets/img/04.jpg" />    <div class="clipBorder">        <span class="minBlock nw"></span>        <span class="minBlock n"></span>        <span class="minBlock ne"></span>        <span class="minBlock w"></span>        <span class="minBlock sw"></span>        <span class="minBlock e"></span>        <span class="minBlock se"></span>        <span class="minBlock s"></span>    </div>    <div class="pr">        <img src="./assets/img/04.jpg" class="prPhoto">    </div></div><script src="js.js"></script></body></html>

js.js

window.onload=function () {    var clip = document.getElementsByClassName("clip")[0];    var clipBorder = document.getElementsByClassName("clipBorder")[0];    var width = clipBorder.offsetWidth;    var height = clipBorder.offsetHeight;    var left = 0;    var top = 0;    var e = document.getElementsByClassName('e')[0];    var w = document.getElementsByClassName('w')[0];    var s = document.getElementsByClassName('s')[0];    var n = document.getElementsByClassName('n')[0];    var ne = document.getElementsByClassName('ne')[0];    var sw = document.getElementsByClassName('sw')[0];    var se = document.getElementsByClassName('se')[0];    var nw = document.getElementsByClassName('nw')[0];    var isDown = false;    var fix = {};    var p = "";    e.onmousedown =function (ev) {        getInit(ev);        p = "e";    };    w.onmousedown =function (ev) {        getInit(ev);        p = "w";    }    n.onmousedown =function (ev) {        getInit(ev);        p = "n";    }    ne.onmousedown =function (ev) {        getInit(ev);        p = "ne";    }    sw.onmousedown =function (ev) {        getInit(ev);        p = "sw";    }    se.onmousedown =function (ev) {        getInit(ev);        p = "se";    }    nw.onmousedown =function (ev) {        getInit(ev);        p = "nw";    }    s.onmousedown =function (ev) {        getInit(ev);        p = "s";    }    function getInit(ev) {        isDown = true;        fix = getPoint(ev);        console.log(fix);        width= clipBorder.offsetWidth-2;        height = clipBorder.offsetHeight-2;        left = parseInt(getStyle(clipBorder,"left"));        top = parseInt(getStyle(clipBorder,"top"));    }    clip.onmousemove  = function (ev) {        if(isDown){            switch(p)            {                case "n":                    nlong(ev);                    getClip();                    break;                case "w":                    wlong(ev);                    getClip();                    break;                case "s":                    slong(ev);                    getClip();                    break;                case "e":                    elong(ev);                    getClip();                    break;                case "sw":                    slong(ev);                    wlong(ev);                    getClip();                    break;                case "se":                    slong(ev);                    elong(ev);                    getClip();                    break;                case "ne":                    nlong(ev);                    elong(ev);                    getClip();                    break;                case "nw":                    nlong(ev);                    wlong(ev);                    getClip();                    break;            }        }    }    clip.onmouseup =function (ev) {        isDown = false;    }    function elong(ev) {        var pointX = getPoint(ev);        var addWidth=pointX.x-fix.x;        clipBorder.style.width = width+addWidth+"px";    }    function wlong(ev) {        var pointX = getPoint(ev);        var addWidth=pointX.x-fix.x;        clipBorder.style.width = width-addWidth+"px";        if(left>0){            clipBorder.style.left = left+addWidth+"px";        }else{            clipBorder.style.left = addWidth+"px";        }    }    function nlong(ev) {        var pointY = getPoint(ev);        var addHeight=pointY.y-fix.y;        clipBorder.style.height = height-addHeight+"px";         if(top>0){             clipBorder.style.top = top+addHeight+"px";         }else {             clipBorder.style.top = addHeight+"px";         }    }    function slong(ev) {        var pointY = getPoint(ev);        var  addHeight=pointY.y-fix.y;        clipBorder.style.height = height+addHeight+"px";    }    function getClip() {        var photo = document.getElementsByClassName("photo")[0];        var showClip = document.getElementsByClassName("showClip")[0];        var top = parseInt(getStyle(clipBorder,"top"));        var left = parseInt(getStyle(clipBorder,"left"));        var right = clipBorder.offsetWidth+left;        var bottom = clipBorder.offsetHeight+top;        console.log(top,left,right,bottom);        showClip.style.clip = "rect("+top+"px,"+right+"px,"+bottom+"px,"+left+"px)";        prClip();    }    function prClip() {        var prPhoto = document.getElementsByClassName("prPhoto")[0];        var top = parseInt(getStyle(clipBorder,"top"));        var left = parseInt(getStyle(clipBorder,"left"));        var right = clipBorder.offsetWidth+left;        var bottom = clipBorder.offsetHeight+top;        console.log(top,left,right,bottom);        prPhoto.style.left=-left+"px";        prPhoto.style.top = -top+"px";        prPhoto.style.clip = "rect("+top+"px,"+right+"px,"+bottom+"px,"+left+"px)";        prPhoto.style.display="block";    }    function getWithinFix(ev,e) {        var ev = ev || window.event;        var borderLeft = parseInt(getStyle(e,"borderLeftWidth")) || ((e.style.borderLeftStyle && e.style.borderLeftStyle !== "none")? 3:0);        var borderTop =  parseInt(getStyle(e,"borderTopWidth")) || ((e.style.borderTopStyle && e.style.borderTopStyle !== "none")? 3:0);        //一般浏览器获得鼠标偏移值        var x = ev.offsetX || (ev.layerX - e.offsetLeft - borderLeft);        //兼容Mozilla类型浏览器,减去边框宽度        var y = ev.offsetY || (ev.layerY - e.offsetTop - borderTop);        //获取浏览器的用户数据        var userAgent = navigator.userAgent;        if(            (userAgent.indexOf("KHTML")>-1) ||            (userAgent.indexOf("Konqueror")>-1) ||            (userAgent.indexOf("AppleWebKit")>-1)        ){            //如果是Safari浏览器,则减去边框的影响            x -=borderLeft;            y -=borderTop;        }        //返回兼容不同浏览器的鼠标位置坐标,以元素边框内壁左上角为定位原点        return {            x:x,            y:y        };    }    function parentNode(e,node,cal) {        var x = y = 0;        while (e.offsetParent !== node){            x += e.offsetLeft;            y += e.offsetTop;            e = e.offsetParent;        }       cal(           {               x:x+4,               y:y+4           }       );    }    function getParent(e) {        //判断offsetParent属性是否指向父元素        if(e.parentNode === e.offsetParent){            var x = e.offsetLeft;            var y = e.offsetTop;        }else{            //调用getWidth()扩展函数获取当前元素和父元素的x坐标,并返回差值            var  nodeFix= getNodeFix(e);            var parentFix = getNodeFix(e.parentNode);            var x = nodeFix.x - parentFix.x;            var y = nodeFix.y - parentFix.y;        }        return {            x:x,            y:y        };    }    function getNodeFix(e) {        var x = y = 0 ;        while (e.offsetParent){            x += e.offsetLeft;            y += e.offsetTop;            e = e.offsetParent;        }        //遍历到body元素后停止循环        return {            x:x,            y:y        };    }    function getStyle(e,name) {        if(e.style[name]){            return e.style[name];        }else if(e.currentStyle){            return e.currentStyle[name];        }else if(document.defaultView && document.defaultView.getComputedStyle){            name = name.replace(/([A-Z])/g,"-$1");            name = name.toLowerCase();            var style = document.defaultView.getComputedStyle(e,null);            if(style){                return style.getPropertyValue(name);            }        }else {            return null;        }    }    //获取元素的页面坐标    function getPoint(event) {        var posx = 0,posY = 0;        var event = event || window.event;        if(event.pageX || event.pageY){            posx = event.pageX;            posY = event.pageY;        }else if(event.clientX || event.clientY){            posx = event.clientX+document.documentElement.scrollLeft+document.body.scrollLeft;            posY = event.clientY+document.documentElement.scrollTop+document.body.scrollTop;        }        return {            x:posx,            y:posY        };    }document.onselectstart=new Function("return false");    

css.css

body{    background: #263238;}.photo{    opacity: 0.5;    height: auto;    width: 500px;}.clip{    margin: 200px;    position: relative;}.clip:after{    clear: both;    content: "";    visibility: hidden;}.showClip{    height: auto;    width: 500px;    position: absolute;    top: 0;    left: 0;    clip: rect(0,200px,200px,0);}.clipBorder{    width: 200px;    height: 200px;    position: absolute;    top:0;    left: 0;        margin-left: -1px;    margin-top: -1px;}.minBlock{    height: 8px;    width: 8px;    background:#fff;    position: absolute;}.nw{    left: -4px;    top: -4px;    cursor:nw-resize ;}.n{    left: 50%;    margin-left: -4px;    top: -4px;    cursor: n-resize;}.ne{    left: 100%;    margin-left: -4px;    top: -4px;    cursor: ne-resize;}.w{     top: 50%;     margin-top: -4px;     left: -4px;     cursor: w-resize;}.sw{    top: 100%;    margin-top: -4px;    left: -4px;    cursor: sw-resize;}.e{       left: 100%;       margin-left: -4px;       top: 50%;       margin-top: -4px;       cursor: e-resize;   }.se{    left: 100%;    margin-left: -4px;    top: 100%;    margin-top: -4px;    cursor: se-resize;}.s{     left: 50%;     margin-top: -4px;     margin-left: -4px;     top: 100%;     cursor: s-resize; }.pr{    float: right;    position: relative;    width: 300px;    height: 200px;}.prPhoto{    display: none;    position: absolute;    left: 0;    top:0;    width: 500px;    height: auto;}