HTML5中,如何为图片制作放大镜效果?

html-css042

HTML5中,如何为图片制作放大镜效果?,第1张

制作图片的放大效果我考虑到的方法是将原始图片绘制到canvas上,然后在对canvas进行局部裁剪最后对裁剪的部分进行放大,这样就可以实现放大镜的效果。

这里我给出一个实现这个想法的示例。该示例实际上就是运用HTML5 canvas中对画布进行裁剪与保存画布状态的相关知识实现的。

上面是给出示例的效果图。这是不是你想要的放大镜效果呢?

下面我们来看下示例代码:在这个示例中当你点击图片时图片就会出现上图效果,再一次点击时就变成原始图片了。

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>放大镜</title>

<!—HTML代码设计:一个简单的canvas元素-->

</head>

<body>

<div id="result-stub" class="well hidden">

<canvas id="canvas" width="345" height="345">

<p>你的浏览器不支持canvas元素</p>

</canvas>

</div>

<script>

window.onload=function() {

//获取canvas对象以及图片对象

var

canvas = document.getElementById('canvas'),

img = new Image(),

context = null,

dataUrl = null,

//设置一个标记,该标记的作用是控制我们点击canvas时放大镜效果的消失和出现

isMagnified = false,

//init函数只要是在图片加载时绘制出图形

init = function() {

img.onload = function() {

//绘制原始图片

context.drawImage(img, 0, 0)

//将图片信息转化为二进制信息或者URL信息存储在dataUrl中方便后面调用

dataUrl = canvas.toDataURL()

}

img.src = 'fist-pump-baby.jpg'

//设置标记值

isMagnified = false

},

//magnify函数的作用是绘制具有放大镜效果的图形

magnify = function() {

//保存当前画布的绘制状态即画布绘制原始图片的状态。方便我们在后面恢复到绘制原始图片的状态

context.save()

//因为放大镜的圆圈和把手是通过canvas绘制的这里设置了一些绘制把手和圆圈的样式属性。

context.lineWidth = 10// 线条宽度

context.shadowColor = '#000'// 阴影的颜色黑色

context.shadowBlur = 15// 模糊级别为15

context.shadowOffsetX = 5// 形状与阴影的水平距离5

context.shadowOffsetY = 5// 形状与阴影的垂直距离5

//保存画布当前状态即我们设置阴影属性后的状态方便后面使用

context.save()

//绘制出放大镜把手的图形

context.beginPath()

context.moveTo(230, 230)

context.lineCap = 'round'

context.lineWidth = 30

context.lineTo(285, 285)

context.stroke()

//对图片进行裁剪,裁剪出的图形是一个圆形。

context.beginPath()

context.arc(

150,

150,

115,

0,

Math.PI * 2,

true)

context.clip()

//创建一个新的Image对象,这个Image对象的图片资源是前面存储在dataUrl中的图片资源。所以这个Image对象和之前初始化的Image对象是完全一样的。

var magnified = new Image()

magnified.src = dataUrl

//对Image对象进行放大1.5倍,并进行绘制。注意此时的画布状态时裁剪为一个圆形的状态,所以这里绘制的也仅仅是图片中的一个圆形区域。这里为了绘制出图片中娃娃的脸设置了绘制的图片有一定的偏移量。

context.scale(1.5, 1.5)

context.drawImage(img, -40, -40)

//调用restore()函数将画布状态恢复到绘制把放大镜把手时的状态,即具有阴影属性

context.restore()

//绘制放大镜的圆圈,即绘制刚刚我们裁剪出来图片的边框。这样刚刚裁剪出来的圆形图形就会正好处于放大镜的圆圈中。

context.arc(

150,

150,

115,

0,

Math.PI * 2,

true)

context.stroke()

//重置画布,将画布恢复到绘制元素图片的状态,以方便绘制出放大效果后,再次点击是绘制原始图片。

context.restore();

//设置标记值,实现点击后放大效果消失。

isMagnified = true

}

//加载初始化代码,即当运行页面时会在页面绘制出一个原始图像

init()

//监听画布的点击事件,当点击页面的图像时会根据标记的值来进行判断是否对画布进行方大处理

$('canvas').click(function() {

if (isMagnified) {

init()//绘制原始图像

}

else {

magnify()//绘制放大的图像

}

})

}

</script>

<script src="jquery.js"></script>

</body>

</html>

对于这些知识在一个叫秒秒学的教程网站上有相关的学习资料,有兴趣的可以自己去看看,希望对你有帮助。

看完下面的代码你就明白了,稍作删改就是你要的效果

<!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-Type" content="text/htmlcharset=gb2312" />

<title>jQuery心型图片墙鼠标悬浮变大</title>

<style type="text/css">

*{padding:0margin:0}

ul,li{list-style:none}

body{font:12px/20px "Microsoft Yahei","SimSun",Arial,sans-serifbackground:#CCC}

.heartPic{width:749pxheight:630pxmargin:60px auto 0 auto}

.heartPic ul{float:leftwidth:749px}

.heartPic ul li{float:leftwidth:100pxheight:100pxpadding:2pxcursor:pointer}

.heartPic ul li.on{z-index:99}

.heartPic ul li.on .in{position:relativeleft:-50pxtop:-50pxpadding:5px 5px 20px 5pxbackground:#666}

.heartPic ul li .pTxt{display:nonewidth:100pxheight:15pxtext-align:centercolor:#fffoverflow:hidden}

.heartPic .showDiv{display:block}

</style>

</head>

<body>

<div class="heartPic">

<ul>

<li></li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_01.jpg" />

<p class="pTxt">可爱的女娃娃</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_02.jpg" />

<p class="pTxt">呆萌的小熊</p>

</div>

</li>

<li></li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_03.jpg" />

<p class="pTxt">卡哇伊的小熊</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_04.jpg" />

<p class="pTxt">女巫骑着扫帚</p>

</div>

</li>

<li></li>

</ul>

<ul>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_05.jpg" />

<p class="pTxt">女娃娃</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_06.jpg" />

<p class="pTxt">星星可爱</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_07.jpg" />

<p class="pTxt">呆萌女</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_08.jpg" />

<p class="pTxt">狗狗</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_09.jpg" />

<p class="pTxt">绿树</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_10.jpg" />

<p class="pTxt">粉爱粉爱的</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_11.jpg" />

<p class="pTxt">蜡笔小新</p>

</div>

</li>

</ul>

<ul>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_12.jpg" />

<p class="pTxt">震不碎的心</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_13.jpg" />

<p class="pTxt">很有意境</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_14.jpg" />

<p class="pTxt">樱木花道最爱啊</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_15.jpg" />

<p class="pTxt">俩骷髅</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_16.jpg" />

<p class="pTxt">萌妹子</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_17.jpg" />

<p class="pTxt">可爱的小狗</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_18.jpg" />

<p class="pTxt">夫妇俩白头偕老</p>

</div>

</li>

</ul>

<ul>

<li></li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_19.jpg" />

<p class="pTxt">刷子</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_20.jpg" />

<p class="pTxt">偶的头像</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_21.jpg" />

<p class="pTxt">树叶子</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_22.jpg" />

<p class="pTxt">星星</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_23.jpg" />

<p class="pTxt">浅色哦</p>

</div>

</li>

<li></li>

</ul>

<ul>

<li></li>

<li></li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_24.jpg" />

<p class="pTxt">太阳帅哥</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_25.jpg" />

<p class="pTxt">大笑脸</p>

</div>

</li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_26.jpg" />

<p class="pTxt">企鹅</p>

</div>

</li>

<li></li>

<li></li>

</ul>

<ul>

<li></li>

<li></li>

<li></li>

<li>

<div class="in">

<img width="100" height="100" src="/jscss/demoimg/201404/index_27.jpg" />

<p class="pTxt">小兔子</p>

</div>

</li>

<li></li>

<li></li>

<li></li>

</ul>

</div>

<script type="text/javascript" src="/ajaxjs/jquery-1.6.2.min.js"></script>

<script type="text/javascript">

$(function(){

$(".heartPic li").hover(function(){

$(this).addClass("on")

$(this).find("img").animate({"width":"200px","height":"200px"})

$(this).find("div").animate({"width":"200px","height":"200px"})

$(this).find(".pTxt").animate({"width":"200px","height":"20px"})

$(this).find("p").addClass("showDiv")

},function(){

$(this).animate({height:"100px"},100).removeClass("on")

$(this).find("img").stop(true,true).animate({"width":"100px","height":"100px"})

$(this).find("div").stop(true,true).animate({"width":"100px","height":"100px"})

$(this).find(".pTxt").stop(true,true).animate({"width":"0px","height":"0px"})

})

})

</script>

<div style="text-align:centerclear:both">

</div>

</body>

</html>