第一篇博文,把今天写的一个实现图片剪切效果的JS脚本发上来
基本思路:
三层结构,第一层为透明度是0.7的图片,第二层为正常的图片,第三层使用一个DIV作为选取框,采用CSS中的绝对定位进行覆盖
HTML代码
<div id="box"> <img id="img-1" src="imgs/cat-1.jpg"/> <img id="img-2" src="imgs/cat-2.jpg"/> <div id="main"> <div class="minDiv left-top" id="leftTop"></div> <div class="minDiv top" id="top"></div> <div class="minDiv right-top" id="rightTop"></div> <div class="minDiv right" id="right"></div> <div class="minDiv right-bottom" id="rightBottom"></div> <div class="minDiv bottom" id="bottom"></div> <div class="minDiv left-bottom" id="leftBottom"></div> <div class="minDiv left" id="left"></div> </div> </div>
CSS代码
body{ background-color:#333; } #box{ width:522px; height:595px; margin:5px auto; position:relative; } #img-1{ position:absolute; left:0; top:0; opacity:0.7; } #img-2{ position:absolute; top:0; left:0; clip:rect(0 200px 200px 0); } #main{ width:200px; height:200px; border:1px solid #FFF; cursor:move; position:absolute; top:0; left:0; } .minDiv{ width:8px; height:8px; background-color:#996633; position:absolute; } .left-top{ top:-4px; left:-4px; cursor:nw-resize; } .top{ top:-4px; left:50%; margin-left:-4px; cursor:n-resize; } .right-top{ top:-4px; right:-4px; cursor:ne-resize; } .right{ top:50%; margin-top:-4px; right:-4px; cursor:e-resize; } .right-bottom{ bottom:-4px; right:-4px; cursor:se-resize; } .bottom{ bottom:-4px; left:50%; margin-left:-4px; cursor:s-resize; } .left-bottom{ bottom:-4px; left:-4px; cursor:sw-resize; } .left{ left:-4px; top:50%; margin-top:-4px; cursor:w-resize; }
JS代码
function $(id){ //通过id获取元素 return document.getElementById(id); } function getPosition(node){ //获取元素距离视窗的left和top值 var left=node.offsetLeft; var top=node.offsetTop; var parent=node.offsetParent; //获取元素的父元素 while(parent!=null){ left+=parent.offsetLeft; top+=parent.offsetTop; parent=parent.offsetParent; } return {"left":left,"top":top}; //采用对象的形式返回元素距离视窗的left和top值 } function setChoice(mainDiv){ // 设置选中区域高亮 var top=mainDiv.offsetTop; var right=mainDiv.offsetLeft+mainDiv.offsetWidth; var bottom=mainDiv.offsetTop+mainDiv.offsetHeight; var left=mainDiv.offsetLeft; var img_2=$("img-2"); img_2.style.clip="rect("+top+"px "+right+"px "+bottom+"px "+left+"px)" } window.onload=function( ){ document.onselectstart=function(){return false;} //禁止图片被选中 var mainDiv=$("main"); var boxDiv=$("box");//获取id为box的元素 var boxLeft=getPosition(boxDiv).left;//获取id为box的元素距离视窗左边的距离 var boxTop=getPosition(boxDiv).top;//获取id为box的元素距离视窗顶部的距离 //获取id为box的元素的宽度和高度 var boxWidth=boxDiv.offsetWidth; var boxHeight=boxDiv.offsetHeight; var initialX,initialY,moveOffsetX,moveOffsetY; var ifMouseDown=false; var contact=""; //选取框变化相关代码用函数封装 function upMove(event){ // 选取框向上变化 var y=event.clientY; //判断鼠标的clientY是否在box元素上面 if( y>boxTop ){ var mainY=getPosition(mainDiv).top; var addHeight=mainY-y; var heightBefore=mainDiv.offsetHeight-2; mainDiv.style.height=heightBefore+addHeight+"px"; main.style.top=main.offsetTop-addHeight+"px"; } } function rightMove(event){ // 选取框向右变化 //clientX,clientY分别获取鼠标距离视窗的x,y坐标 var x=event.clientX; //判断clientX是否在box元素的右边 if( x<boxLeft+boxWidth ){ var widthBefore=mainDiv.offsetWidth-2; // 获取元素原先的宽度,注意offsetWidth会包含边框 var addWidth=x-getPosition(mainDiv).left-widthBefore; console.log(addWidth); mainDiv.style.width=widthBefore+addWidth+"px"; } } function downMove(event){ // 选取框向下变化 var y=event.clientY; //判断clientY是否在box元素的下面 if( y<boxTop+boxHeight ){ var mainY=getPosition(mainDiv).top; var heightBefore=mainDiv.offsetHeight-2; var addHeight=y-heightBefore-mainY; mainDiv.style.height=heightBefore+addHeight+"px"; } } function leftMove(event){ var x=event.clientX; //判断clientX是否在box元素的左边 if( x>boxLeft ){ var mainX=getPosition(mainDiv).left; var addWidth=mainX-x; var widthBefore=mainDiv.offsetWidth-2; mainDiv.style.width=widthBefore+addWidth+"px"; mainDiv.style.left=mainDiv.offsetLeft-addWidth+"px"; } } //mainDiv元素移动的函数 function Move(event){ var moveX=0; var moveY=0; var moveX=event.clientX-initialX; var moveY=event.clientY-initialY; if( ifMouseDown ){ moveX=event.clientX-moveOffsetX; moveY=event.clientY-moveOffsetY; console.log(moveX); if( mainDiv.offsetLeft+moveX>0&&mainDiv.offsetWidth+moveX<boxDiv.offsetWidth){ mainDiv.style.left=moveX+"px"; } if( mainDiv.offsetTop+moveY>0&&mainDiv.offsetHeight+moveY<boxDiv.offsetHeight){ mainDiv.style.top=moveY+"px"; } } } //鼠标在8个触点上面的按下事件 var arr_minDiv=mainDiv.getElementsByTagName("div");//获取所有的minDiv元素 var length=arr_minDiv.length; for(var i=0;i<length;i++){ arr_minDiv[i].onmousedown=function(event){ event.stopPropagation(); ifMouseDown=true; contact=this.id+"_minDiv"; } } //鼠标在mainDiv上面的按下事件 mainDiv.onmousedown=function(event){ initialX=event.clientX;//获取鼠标按下时的横坐标 initialY=event.clientY;//获取鼠标按下时的纵坐标 moveOffsetX=initialX-mainDiv.offsetLeft; moveOffsetY=initialY-mainDiv.offsetTop; ifMouseDown=true; contact="mainDiv"; } //鼠标松开事件 window.onmouseup=function(){ ifMouseDown=false; } //鼠标移动事件 window.onmousemove=function( event){ //console.log(ifMouseDown); if( ifMouseDown){ //采用switch代替多层if else switch(contact){ case "right_minDiv": rightMove(event); break; case "top_minDiv": upMove(event); break; case "left_minDiv": leftMove(event); break; case "bottom_minDiv": downMove(event); break; case "leftTop_minDiv": leftMove(event); upMove(event); break; case "rightTop_minDiv": rightMove(event); upMove(event); break; case "rightBottom_minDiv": rightMove(event); downMove(event); break; case "leftBottom_minDiv": leftMove(event); downMove(event); break; //设置mainDiv的移动方式 case "mainDiv": Move(event); break; } setChoice(mainDiv); } } }
开通这个博客没事写写,主要以前端开发为主,当然也有PHP和扯淡
时间: 2024-10-25 08:00:31