上传图片并实现本地预览(1)

该版本是带有css样式的实现效果,属于初步整理。
纯js实现效果请看上传图片并实现本地预览(2)。
这两篇文档的区别在于:兼容IE时,本文的滤镜css样式写在css样式中。

效果预览

html

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title>本地上传图片并实现预览</title>
	<link rel="stylesheet" type="text/css" href="css/upload.css" />
	<!-- <script type="text/javascript" src="js/jquery-2.0.3.min.js"></script> -->
	<script type="text/javascript" src="js/jquery1.11.js"></script>
	<script type="text/javascript" src="js/upload.js"></script>
</head>
<body>
	<div class="upload-wrap">
		<div class="upload-box">
			<i class="close-btn"></i>
			<span class="upload-span">上传图片</span>
			<input class="upload-btn" accept="image/*" type="file" name="cus_upload_pic[]" />
			<div class="preview-img-box"></div>
		</div>
	</div>
</body>
</html>

css样式

用css实现上传按钮的美化,这个我就随便写了写,比较丑

.upload-wrap{
	overflow: hidden;
}
.upload-box{
	position: relative;
	width: 106px;
	height: 106px;
	border:1px solid #e1e1e9;
	overflow: hidden;
	float: left;
	margin: 10px;
}
.upload-span{
	display: block;
	width: 100%;
	height: 100%;
	line-height: 100px;
	font-size: 20px;
	color: #fff;
	background: green;
	text-align: center;
	position: absolute;
	left: 0;
	top: 0;
	z-index: 5;
}
.upload-btn{
	display: block;
	width: 100%;
	height: 100%;
	position: absolute;
	left: 0;
	right: 0;
	font-size:90px;
	z-index: 10;
	opacity: 0;
	filter:Alpha(opacity=0);
}
.close-btn{
	display: block;
	width: 17px;
	height: 17px;
	position: absolute;
	background: url(../img/close.gif);
	right: -1px;
	top: -1px;
	z-index: 100;
	cursor: pointer;
}
.preview-img-box{
	width: 100px;
	height: 100px;
	padding: 3px;
	position: absolute;
	top: 0;
	left: 0;
	z-index: 15;
	background: #fff;
	display: none;
}
.preview-img-box img{
	filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=image);
}

该句样式一定要有。如果没有此句,js会报错。

.preview-img-box img{
	filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=image);
}

没有此句css样式,上传图片效果如下图:

    

报错:


js

IE10以上才支持FileReader();针对IE7~IE9使用滤镜的方式实现图片预览。由于accept属性IE9及以下浏览器不兼容,因此在上传图片时对文件后缀名进行验证。

$(function(){
	$(document).on('change','.upload-btn',function(){
		var _this = $(this);
		var imgbox = _this.siblings('.preview-img-box');
		var maxWidth = imgbox.width();
		var maxHeight = imgbox.height();
		//IE浏览器,使用滤镜
		if(navigator.userAgent.indexOf("MSIE")>0){
			if(navigator.userAgent.indexOf("MSIE 7.0")>0 || navigator.userAgent.indexOf("MSIE 8.0")>0 || navigator.userAgent.indexOf("MSIE 9.0")>0){
				var sFilter='filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale,src="'; 
				_this.select();
				var imgsrc = document.selection.createRange().text;
				var imgreg = /\.jpg$|\.jpeg$|\.gif$|\.png$/i;
				if(imgreg.test(imgsrc)){
					imgbox.show();
					imgbox.html('<img class="preview-img" id="PreviewImg" src="" />');
					var img = document.getElementById("PreviewImg");
					img.filters.item('DXImageTransform.Microsoft.AlphaImageLoader').src = imgsrc;
					var rect = clacImgZoomParam(maxWidth, maxHeight, img.offsetWidth, img.offsetHeight);
					status = ('rect:'+rect.top+','+rect.left+','+rect.width+','+rect.height);
					var odiv = "<div style='width:"+rect.width+"px;height:"+rect.height+"px;margin-top:"+rect.top+"px;margin-left:"+rect.left+"px;"+sFilter+imgsrc+"\"'></div>";
					imgbox.html(odiv);
					document.selection.empty();
					var upload_box = '<div class="upload-box"><i class="close-btn"></i>'
									+'<span class="upload-span">上传图片</span>'
									+'<input class="upload-btn" accept="image/*" type="file" name="cus_upload_pic[]" />'
									+'<div class="preview-img-box"></div></div>';
					$(upload_box).appendTo($('.upload-wrap'));
				}
				else{
					alert('图片类型必须是.gif,jpeg,jpg,png中的一种!')
				}
			}
		}
		else{
			var ofile = _this.prop('files')[0] || _this.files[0];
			if(ofile){
				if(window.FileReader){
					var fr = new FileReader();
					fr.onloadend = function(e){
						var imgbox = _this.siblings('.preview-img-box');
						imgbox.show();
						console.log(e.target.result);
						var oimg = '<img class="preview-img" src="'+ e.target.result +'" />';
						$(oimg).appendTo(imgbox);
						var Img = imgbox.find('.preview-img');
						var rect = clacImgZoomParam(maxWidth, maxHeight, Img.width(), Img.height());
						Img.css({
							"display":"block",
							"width":rect.width,
							"height":rect.height,
							"margin-top":rect.top,
							"margin-left":rect.left
						})
					}
					fr.readAsDataURL(ofile);
				}
				var upload_box = '<div class="upload-box"><i class="close-btn"></i>'
								+'<span class="upload-span">上传图片</span>'
								+'<input class="upload-btn" accept="image/*" type="file" name="cus_upload_pic[]" />'
								+'<div class="preview-img-box"></div></div>';
				$(upload_box).appendTo($('.upload-wrap'));
			}
		}
	})

	//删除功能
	$(document).on('click','.close-btn',function(){
		var oindex = $(this).parents('.upload-box').index();
		if(oindex == 0){
			$(this).siblings('.preview-img-box').html('');
			$(this).siblings('.preview-img-box').hide();
			$(this).siblings('.upload-btn').val('');
			$(this).siblings('.upload-btn').show();
			$(this).siblings('.upload-span').show();
		}
		else{
			$(this).parents('.upload-box').remove();
		}
	})

})
function clacImgZoomParam( maxWidth, maxHeight, width, height ){  
    var param = {top:0, left:0, width:width, height:height};  
    if( width>maxWidth || height>maxHeight )  
    {  
        rateWidth = width / maxWidth;  
        rateHeight = height / maxHeight;  
          
        if( rateWidth > rateHeight )  
        {  
            param.width =  maxWidth;  
            param.height = Math.round(height / rateWidth);  
        }else  
        {  
            param.width = Math.round(width / rateHeight);  
            param.height = maxHeight;  
        }  
    }
    param.left = Math.round((maxWidth - param.width) / 2);  
    param.top = Math.round((maxHeight - param.height) / 2);  
    return param;  
}
posted @ 2016-10-18 15:41  桃之夭夭~  阅读(482)  评论(0编辑  收藏  举报