html5怎么实现放大镜功能

html5实现放大镜功能的方法:1、创建一个HTML示例文件;2、使用html5 canvas标签初始化图像;3、获得canvas和image对象;4、通过“function drawAnchor() {…}”等方法将选中的区域放大,然后再绘制到原先的图片上,保证两块区域的中心点一致即可。

html5怎么实现放大镜功能

本教程操作环境:Windows10系统、HTML5版、DELL G3电脑

html5怎么实现放大镜功能?

【HTML5】Canvas 实现放大镜效果

图片放大镜

效果

html5怎么实现放大镜功能

立即学习“前端免费学习笔记(深入)”;

原理

首先选择图片的一块区域,然后将这块区域放大,然后再绘制到原先的图片上,保证两块区域的中心点一致, 如下图所示:
html5怎么实现放大镜功能

初始化

html5怎么实现放大镜功能

登录后复制

获得 canvas 和 image 对象,这里使用 html5怎么实现放大镜功能 标签预加载图片

var canvas = document.getElementById("canvas");var context = canvas.getContext("2d");var img = document.getElementById("img");

登录后复制

设置相关变量

// 图片被放大区域的中心点,也是放大镜的中心点var centerPoint = {};// 图片被放大区域的半径var originalRadius = 100;// 图片被放大区域var originalRectangle = {};// 放大倍数var scale = 2;// 放大后区域var scaleGlassRectangle

登录后复制

画背景图片

function drawBackGround() {    context.drawImage(img, 0, 0);}

登录后复制

计算图片被放大的区域的范围

这里我们使用鼠标的位置作为被放大区域的中心点(放大镜随着鼠标移动而移动),因为 canvas 在画图片的时候,需要知道左上角的坐标以及区域的宽高,所以这里我们计算区域的范围

function calOriginalRectangle(point) {    originalRectangle.x = point.x - originalRadius;    originalRectangle.y = point.y - originalRadius;    originalRectangle.width = originalRadius * 2;    originalRectangle.height = originalRadius * 2;}

登录后复制

绘制放大镜区域

裁剪区域

放大镜一般是圆形的,这里我们使用 clip 函数裁剪出一个圆形区域,然后在该区域中绘制放大后的图。一旦裁减了某个区域,以后所有的绘图都会被限制的这个区域里,这里我们使用 save 和 restore 方法清除裁剪区域的影响。save 保存当前画布的一次状态,包含 canvas 的上下文属性,例如 style,lineWidth 等,然后会将这个状态压入一个堆栈。restore 用来恢复上一次 save 的状态,从堆栈里弹出最顶层的状态。

context.save();context.beginPath();context.arc(centerPoint.x, centerPoint.y, originalRadius, 0, Math.PI * 2, false);context.clip();......context.restore();

登录后复制

计算放大镜区域

通过中心点、被放大区域的宽高以及放大倍数,获得区域的左上角坐标以及区域的宽高。

scaleGlassRectangle = {    x: centerPoint.x - originalRectangle.width * scale / 2,    y: centerPoint.y - originalRectangle.height * scale / 2,    width: originalRectangle.width * scale,    height: originalRectangle.height * scale}

登录后复制

绘制图片

在这里我们使用 context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height); 方法,将 canvas 自身作为一副图片,然后取被放大区域的图像,将其绘制到放大镜区域里。

context.drawImage(canvas,    originalRectangle.x, originalRectangle.y,    originalRectangle.width, originalRectangle.height,    scaleGlassRectangle.x, scaleGlassRectangle.y,    scaleGlassRectangle.width, scaleGlassRectangle.height);

登录后复制

绘制放大边缘

createRadialGradient 用来绘制渐变图像

context.beginPath();var gradient = context.createRadialGradient(    centerPoint.x, centerPoint.y, originalRadius - 5,    centerPoint.x, centerPoint.y, originalRadius);gradient.addColorStop(0, 'rgba(0,0,0,0.2)');gradient.addColorStop(0.80, 'silver');gradient.addColorStop(0.90, 'silver');gradient.addColorStop(1.0, 'rgba(150,150,150,0.9)');context.strokeStyle = gradient;context.lineWidth = 5;context.arc(centerPoint.x, centerPoint.y, originalRadius, 0, Math.PI * 2, false);context.stroke();

登录后复制

添加鼠标事件

为 canvas 添加鼠标移动事件

canvas.onmousemove = function (e) {    ......}

登录后复制

转换坐标

鼠标事件获得坐标一般为屏幕的或者 window 的坐标,我们需要将其装换为 canvas 的坐标。getBoundingClientRect 用于获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置。

function windowToCanvas(x, y) {    var bbox = canvas.getBoundingClientRect();    return {x: x - bbox.left, y: y - bbox.top}}

登录后复制

修改鼠标样式

我们可以通过 css 来修改鼠标样式

#canvas {    display: block;    border: 1px solid red;    margin: 0 auto;    cursor: crosshair;}

登录后复制

图表放大镜

我们可能基于 canvas 绘制一些图表或者图像,如果两个元素的坐标离得比较近,就会给元素的选择带来一些影响,例如我们画两条线,一个线的坐标是(200.5, 400) -> (200.5, 200),另一个线的坐标为 (201.5, 400) -> (201.5, 20),那么这两条线几乎就会重叠在一起,如下图所示:
html5怎么实现放大镜功能

使用图表放大镜的效果
html5怎么实现放大镜功能

原理

类似于地图中的图例,放大镜使用较为精确的图例,如下图所示:
html5怎么实现放大镜功能

在放大镜坐标系统中,原始的区域会变大,如下图所示
html5怎么实现放大镜功能

绘制原始线段

首先创建一个线段对象

function Line(xStart, yStart, xEnd, yEnd, index, color) {    // 起点x坐标    this.xStart = xStart;    // 起点y坐标    this.yStart = yStart;    // 终点x坐标    this.xEnd = xEnd;    // 终点y坐标    this.yEnd = yEnd;    // 用来标记是哪条线段    this.index = index;    // 线段颜色    this.color = color;}

登录后复制

初始化线段

// 原始线段var chartLines = new Array();// 处于放大镜中的原始线段var glassLines;// 放大后的线段var scaleGlassLines;// 位于放大镜中的线段数量var glassLineSize;function initLines() {    var line;    line = new Line(200.5, 400, 200.5, 200, 0, "#888");    chartLines.push(line);    line = new Line(201.5, 400, 201.5, 20, 1, "#888");    chartLines.push(line);    glassLineSize = chartLines.length;    glassLines = new Array(glassLineSize);    for (var i = 0; i 

绘制线段

function drawLines() {    var line;    context.lineWidth = 1;    for (var i = 0; i 

计算原始区域和放大镜区域

function calGlassRectangle(point) {    originalRectangle.x = point.x - originalRadius;    originalRectangle.y = point.y - originalRadius;    originalRectangle.width = originalRadius * 2;    originalRectangle.height = originalRadius * 2;    scaleGlassRectangle.width = originalRectangle.width * scale;    scaleGlassRectangle.height = originalRectangle.height * scale;    scaleGlassRectangle.x = originalRectangle.x + originalRectangle.width / 2 - scaleGlassRectangle.width / 2;    scaleGlassRectangle.y = originalRectangle.y + originalRectangle.height / 2 - scaleGlassRectangle.height / 2;    // 将值装换为整数    scaleGlassRectangle.width = parseInt(scaleGlassRectangle.width);    scaleGlassRectangle.height = parseInt(scaleGlassRectangle.height);    scaleGlassRectangle.x = parseInt(scaleGlassRectangle.x);    scaleGlassRectangle.y = parseInt(scaleGlassRectangle.y);}

登录后复制

计算线段在新坐标系统的位置

由原理图我们知道,放大镜中使用坐标系的图例要比原始坐标系更加精确,比如原始坐标系使用 1:100,那么放大镜坐标系使用 1:10,因此我们需要重新计算线段在放大镜坐标系中的位置。同时为了简便,我们将线段的原始坐标进行了转化,减去原始区域起始的x值和y值,即将原始区域左上角的点看做为(0,0)。

function calScaleLines() {    var xStart = originalRectangle.x;    var xEnd = originalRectangle.x + originalRectangle.width;    var yStart = originalRectangle.y;    var yEnd = originalRectangle.y + originalRectangle.height;    var line, gLine, sgLine;    var glassLineIndex = 0;    for (var i = 0; i  xEnd) {            continue;        }        if (line.yEnd > yEnd || line.yStart  yEnd) {            gLine.yEnd = yEnd;        }        if (line.yStart 

绘制放大镜中心点

绘制放大镜中心的瞄准器

function drawAnchor() {    context.beginPath();    context.lineWidth = 2;    context.fillStyle = "#fff";    context.strokeStyle = "#000";    context.arc(parseInt(centerPoint.x), parseInt(centerPoint.y), 10, 0, Math.PI * 2, false);    var radius = 15;    context.moveTo(parseInt(centerPoint.x - radius), parseInt(centerPoint.y));    context.lineTo(parseInt(centerPoint.x + radius), parseInt(centerPoint.y));    context.moveTo(parseInt(centerPoint.x), parseInt(centerPoint.y - radius));    context.lineTo(parseInt(centerPoint.x), parseInt(centerPoint.y + radius));    //context.fill();    context.stroke();}

登录后复制

绘制放大镜

function drawMagnifyingGlass() {    calScaleLines();    context.save();    context.beginPath();    context.arc(centerPoint.x, centerPoint.y, originalRadius, 0, Math.PI * 2, false);    context.clip();    context.beginPath();    context.fillStyle = "#fff";    context.arc(centerPoint.x, centerPoint.y, originalRadius, 0, Math.PI * 2, false);    context.fill();    context.lineWidth = 4;    for (var i = 0; i 

添加事件

鼠标拖动

鼠标移动到放大镜上,然后按下鼠标左键,可以拖动放大镜,不按鼠标左键或者不在放大镜区域都不可以拖动放大镜。
为了实现上面的效果,我们要实现3种事件 mousedown, mousemove, 'mouseup', 当鼠标按下时,检测是否在放大镜区域,如果在,设置放大镜可以移动。鼠标移动时更新放大镜中兴点的坐标。鼠标松开时,设置放大镜不可以被移动。

canvas.onmousedown = function (e) {    var point = windowToCanvas(e.clientX, e.clientY);    var x1, x2, y1, y2, dis;    x1 = point.x;    y1 = point.y;    x2 = centerPoint.x;    y2 = centerPoint.y;    dis = Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2);    if (dis 

鼠标双击

当移动到对应的线段上时,鼠标双击可以选择该线段,将该线段的颜色变为红色。

canvas.ondblclick = function (e) {    var xStart, xEnd, yStart, yEnd;    var clickPoint = {};    clickPoint.x = scaleGlassRectangle.x + scaleGlassRectangle.width / 2;    clickPoint.y = scaleGlassRectangle.y + scaleGlassRectangle.height / 2;    var index = -1;    for (var i = 0; i  xStart && clickPoint.x  yEnd) {            scaleLine.color = "#f00";            index = scaleLine.index;            break;        }    }    for (var i = 0; i 

键盘事件

因为线段离得比较近,所以使用鼠标移动很难精确的选中线段,这里使用键盘的w, a, s, d 来进行精确移动

document.onkeyup = function (e) {    if (e.key == 'w') {        centerPoint.y = intAdd(centerPoint.y, -0.2);    }    if (e.key == 'a') {        centerPoint.x = intAdd(centerPoint.x, -0.2);    }    if (e.key == 's') {        centerPoint.y = intAdd(centerPoint.y, 0.2);    }    if (e.key == 'd') {        centerPoint.x = intAdd(centerPoint.x, 0.2);    }    draw();}

登录后复制推荐学习:《HTML5视频教程》  

以上就是html5怎么实现放大镜功能的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2921404.html

(0)
上一篇 2025年3月11日 18:28:08
下一篇 2025年3月7日 20:44:52

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • html5中video不支持的格式是哪个

    html5中video不支持的格式是flv格式,支持的格式包含MP4、WebM和Ogg;在html5中,元素提供了播放、暂停和音量控件来控制视频;同时元素也提供了width和height属性控制视频的尺寸,如果设置的高度和宽度,所需的视频空…

    2025年3月11日
    200
  • IE在哪个版本开始支持HTML5

    IE在IE9版本开始支持HTML5部分方法,HTML5是HTML最新的修订版本,2014年10月由万维网联盟完成标准制定;HTML5的设计目的是为了在移动设备上支持多媒体。 本教程操作环境:Windows10系统、HTML5版、DELL G…

    2025年3月11日
    200
  • html5会被淘汰吗

    html5不会被淘汰,因为HTML5将Web带入一个成熟的应用平台,在这个平台上,视频、音频、图像、动画以及与设备的交互都进行了规范;为了更好地处理今天的互联网应用,HTML5还添加了很多新元素及功能,比如图形的绘制、多媒体内容、更好的页面…

    2025年3月11日
    200
  • youtube html5播放失败怎么办

    youtube html5播放失败的解决办法:1、打开youtube,找到视频,在视频右下角点击分享;2、选择嵌入;3、去除iframe标签里面的width和height;4、为iframe添加一个父元素,设置一个让视频填满屏幕的百分比即可…

    2025年3月11日
    200
  • html5 input 禁止输入怎么实现

    html5 input禁止输入的实现方法:1、通过readonly规定输入字段为只读可复制;2、通过disabled实现被禁用的input元素可复制,但不能接收焦点;3、通过控制input的max length为0实现;4、通过“οnfοc…

    2025年3月11日
    200
  • html5中base的用法是什么

    html5中base标签的作用是为页面上的所有的相对链接规定默认URL或默认目标,在一个文档中,最多能使用一个元素,并且必须位于元素内部,其使用方法如“ ”。 本教程操作环境:Windows10系统、HTML5版、DELL G3电脑 htm…

    2025年3月11日
    200
  • html5 date样式怎么修改

    修改html5 date样式的方法:1、单独建立一个css文件,添加代码为“::-webkit-datetime-edit { padding: 1px;}  ::-webkit-datetime-edit-fields-wrapper {…

    2025年3月11日
    200
  • HTML5怎么实现禁止android视频另存为

    HTML5实现禁止android视频另存为的方法:1、在Video标签内添加“controlslist=”nodownload””属性;2、通过添加“$(“#video01”).bind(&#…

    2025年3月11日
    200
  • html5怎么实现隐藏剩余显示内容

    html5实现隐藏剩余显示内容的方法:1、设定隐藏显示的css样式为“.hiddenMemo{width:100px;white-space:nowrap;overflow: hidden;text-overflow: ellipsis;}…

    2025年3月11日
    200
  • safari支持html5吗

    safari是支持html5的;用户可以直接访问html5标准制作的页面,开发者则可以直接使用html5标签;safari是一款由苹果公司开发的网页浏览器,其使用WebKit浏览器引擎;html5则是构建Web内容的一种语言描述方式,是互联…

    2025年3月11日
    200

发表回复

登录后才能评论