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

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>

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

CSS3除了为开发者提供二维变形之外,还将动画从二维平面推动到了三维立体状态,能够实现真正的三维特效。

三维变形和二维变形一样,均使用的是transform属性。想要触发三维变形有两种方式:一种方式是通过语法告知浏览器“请采用三维方式进行变形处理”,另一种方式是直接使用CSS3三维变形的语法。

触发方法1:告知浏览器变形方式

-webkit-transform-style:preserve-3d

Tips:IE不支持三维变形,在移动端,绝大多数的浏览器均为WebKit内核,因此,在此句代码之前需要书写-webkit-的前缀内核。

Tips:不要为body元素设置-webkit- transform-style: preserve 3d,否则会对position:fixed定位的元素造成布局影响。在开发当中,如果当前元素属于body的子级元素,又希望应用三维变形,则在body和当前元素之间多嵌套一层结构,并为这层元素应用三维变形即可。

触发方法2:直接使用CSS3变形语法

<!DOCTYPE html>

<head>

    <meta charset="UTF-8">

    <title>言成科技/title>

    <style>

        .box1 {

            width: 150px

            height: 150px

            border: 2px solid blue

        }

        .box1 div {

            height: 150px

            background: rgba(0, 0, 0, 0.5)

            -webkit-transform: translate3d(30px, 60px, 20px) rotateX(30deg)

            transform: translate3d(30px, 60px, 20px) rotateX(30deg)

        }

    </style>

</head>

<body>

    <div class="box1">

        <div></div>

    </div>

</body>

</html>

具体三维变形的具体属性详见《CSS3-3D相关知识详解—视角以及变形方向》

3D效果制作

需求

制作一个立方体,并进行旋转

代码实例

<!DOCTYPE HTML>

<html>

<head>

 <meta charset="utf-8" />

 <title>言成科技</title>

 <link rel="stylesheet" type="text/css" href="https://css.h5course.cn/reset-1.0.0.css" />

 <style>

  .main-bac { -webkit-perspective:1500 } /*设定透视距离*/

  .main{

   width:200px 

   height:200px 

   margin: 0 auto

   position:relative

   -webkit-transform-style:preserve-3d

   -webkit-transition:-webkit-transform 2s ease 0s/*过渡时间*/

  }

  /*基本样式*/

  .main p{

   position: absolute 

   margin: 0 

   padding: 0 

   width: 200px 

   height: 200px  

   text-align: center 

   line-height: 200px 

   font-size: 26px 

   opacity:0.5

  }

  /*将第一个元素Z轴向前移动100px,形成第一个面(正面)*/

  .main p:nth-of-type(1) {

   background-color:red

   -webkit-transform:translateZ(100px)

  }

  /*将第一个元素Z轴向前移动100px,绕x轴旋转90度形成上面的面*/

  .main p:nth-of-type(2) {

   background-color:orange 

   -webkit-transform:rotateX(90deg) translateZ(100px)

  }

  /*将第一个元素Z轴向前移动100px,绕x轴旋转-90度形成下边的面*/

  .main p:nth-of-type(3) {

   background-color:yellow

   -webkit-transform:rotateX(-90deg) translateZ(100px)

  }

  /*将第一个元素Z轴向前移动100px,绕y轴旋转90度形成右侧的面*/

  .main p:nth-of-type(4) {

   background-color:green

   -webkit-transform:rotateY(90deg) translateZ(100px)

  }

  /*将第一个元素Z轴向前移动100px,绕y轴旋转-90度形成左侧的面*/

  .main p:nth-of-type(5) {

   background-color:#b435bf

   -webkit-transform:rotateY(-90deg) translateZ(100px)

  }

  /*将第一个元素Z轴向前移动100px,绕y轴旋转180度形成后面(背面)*/

  .main p:nth-of-type(6) {

   background-color:blue

   -webkit-transform:rotateY(180deg) translateZ(100px)

  }

  /*鼠标移入时绕Y轴旋转180度,绕Z轴旋转180度*/

  .main:hover {-webkit-transform:rotateY(180deg) rotateZ(180deg) }   

 </style>

</head>

<body>

 <div class="main-bac">

  <div class="main">

   <p>言成科技</p>

   <p>3D立方体</p>

   <p>HTML5学堂</p>

   <p>3D立方体</p>

   <p>码匠</p>

   <p>JavaScript</p>

  </div>              

 </div>

</body>

</html>

代码解析

当鼠标移入的时候,立方体逐渐的发生旋转(非突变),围绕X轴旋转45度的同时,围绕Y轴旋转45度。

当鼠标移出立方体时,立方体恢复到初始状态。在最开始状态时,并没有采用无限远的视角,设置一定的视角,让刚开始时直视立方体时,不会觉得是一个平面。

3D效果制作-目标效果图

以上资料来源:《HTML5布局之路》


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/6997579.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-31
下一篇 2023-03-31

发表评论

登录后才能评论

评论列表(0条)

保存