图片剪切效果

第一篇博文,把今天写的一个实现图片剪切效果的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

图片剪切效果的相关文章

猫猫学IOS(三十二)UI之Quartz2D矩阵操作和图片剪切

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 矩阵操作 矩阵操作:(旋转,缩放,平移) 通过矩阵操作,把画出来的东西进行形变 旋转操作 方法:CGContextRotateCTM(<#CGContextRef c#>, <#CGFloat angle#>)该接受两个参数(图形上下文,弧度) 注意点:设置矩阵操作必须要在添加图形之前,如果设置在添加图形之后的话

小程序_图片剪切功能(支持多图片上传)

前端图片剪切上传功能是常见的功能,在开发过程中,研发一个这样的功能要花的时间也会很多,现在把一个研发好了的图片剪切插件发出来.支持剪切和大小缩放. wxml 1 <!--图片展示 --> 2 <view bindtap='upEwm' data-which='1'> 3 <view>第一个图</view> 4 <image style='width:200rpx;height:200rpx;background-color:red' src='{{he

图片上传,图片剪切jquery.imgareaselect

---恢复内容开始--- <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd&q

iOS开发UI篇—Quartz2D使用(图片剪切)

iOS开发UI篇-Quartz2D使用(图片剪切) 一.使用Quartz2D完成图片剪切 1.把图片显示在自定义的view中 先把图片绘制到view上.按照原始大小,把图片绘制到一个点上. 代码: 1 - (void)drawRect:(CGRect)rect 2 { 3 UIImage *image2=[UIImage imageNamed:@"me"]; 4 [image2 drawAtPoint:CGPointMake(100, 100)]; 5 } 显示: 2.剪切图片让图片圆

JS实现有点炫的图片展示效果-图片解体和组合

经过4个月的努力学习,迎来了进入市场的最后一个学习项目.自己模仿了一个图片展示效果,用在了项目中,感觉挺炫的.在这里分享一下,希望大家喜欢~! bomb-showImg : 在线演示http://runjs.cn/detail/tl9quyke查看源码http://runjs.cn/code/tl9quyke HTML : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

原生 JavaScript 图片裁剪效果

图片裁剪程序效果如下,可鼠标操作. 拖动左边小方框时在右侧实时显示对应的裁剪图片,同时左侧的拖动框里图片完全显示,拖动框外部图片模糊显示.8个控制点可以对显示区域大小进行控制. HTML 和 CSS 部分 左侧的裁剪操作区域可以分为三层. 最底层的图片半透明效果:中间层的图片只显示制定区域,其他部分隐藏:最上层为拖拽控制层.最低层和中间层使用同一张图片,利用CSS属性clip控制中间层只显示一部分. 三个层都使用 absolute 绝对定位.下面是 HTML 和 CSS 代码. 1 <div i

网站——循环图片切换效果(最近做网站,已经快炸了)

看一下效果 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="zh-cn"><head><meta

一款在论坛上看到的JS封装的随机过渡方式的图片切换效果

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

CSS3 实现六边形Div图片展示效果

效果图: 实现原理: 这个效果的主要css样式有: 1.>transform: rotate(120deg); 图片旋转 2.>overflow:hidden;  超出隐藏 3.>visibility: hidden;  也是隐藏,与display:none;相似,但不同的是,它虽然隐藏了,但依然会在网页中占有位置 我们要用到3层div进行旋转来得到这个效果(ps:3层div的大小是一样的). 最外层div(boxF)旋转120度.第二层(boxS)旋转-60度,第三层(boxT)再旋转