iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript利用canvas实现炫酷的碎片切图效果
  • 476
分享到

JavaScript利用canvas实现炫酷的碎片切图效果

摘要

目录前言需求分析实现过程坐标系切割绘制切割&渲染动画前言 今天分享一个炫酷的碎片式切图效果,这个其实在自己的之前的博客上有实现过,本人觉得这个效果还是挺炫酷的,这次还是用我们

前言

今天分享一个炫酷的碎片式切图效果,这个其实在自己的之前的博客上有实现过,本人觉得这个效果还是挺炫酷的,这次还是用我们的canvas来实现,代码量不多,但有些地方还是需要花点时间去理解的,需要点数学几何理解能力,老规矩,我们还是先看效果再来看实现步骤。

需求分析

从上面我们看到图片在切换的时候其实是一个一个的小碎片慢慢从点击位置往外扩散开来,这一个个小碎片,在页面中其实就是一个个的小方块。这里的难点在于如何将一张完整的图片切割成一个一个的小方块分别进行渲染,还有就是这个棱形图案的位置确定。

  • 切割:这里我们可以以坐标系的形式来进行切割,每一个方块都对应着它们自己在坐标系中的位置(x, y)
  • 绘制:这里的重点在于drawImage方法
  • 棱形扩散:这里需要点数学几何理解能力,后面作图理解

实现过程

坐标系

在实现之前,我们先来理解一个概念:「坐标系」

注意:这里所说的坐标系不是我们数学中的坐标系,但两者又有些类似,不同点在于两者的原点位置以及y轴的方向不同。

切割

这一步主要是为了确定每一个单元格的大小,单元格的长宽最好不要是最大公约数或最小公约数,因为过大效果不够炫,过小性能会有压力。

我这里画板长宽为 800 * 530 ,选取 16 * 15 为单元尺寸,即整个画布由 50 * 35 共 1750 个单元格组成。切割分完单元格之后我们需要先计算一些基本的参数备用。

this.imgW = 800; // 图片原始宽
this.imgH = 530; // 图片原始高

this.conW = 800; // 画布宽
this.conH = 530; //  画布高

this.dw = 16; // 单元格宽
this.dh = 15; // 单元格高

this.I = this.conH / this.dh; //单元行数
this.J = this.conW / this.dw; // 单元列数

this.DW = this.imgW / this.J; // 原图单元宽
this.DH = this.imgH / this.I; // 原图单元高

「行数 = 画布高度 / 单元格高度;列数 = 画面宽度 / 单元格宽度」

绘制

本次绘制的重点在于drawImage这个方法,我们可以先来了解一下这个方法的参数及功能

drawImage

drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)

这个方法一共有9个参数,作用是在画布上绘制图像。看到这么多参数是不是已经被劝退了,哈哈

  • 「image」:绘制到上下文的元素。允许任何的画布图像源,例如:htmlImageElementSVGImageElementHTMLVideoElementHTMLCanvasElementImageBitmapOffscreenCanvas或 VideoFrame 。
  • 「sx」:(可选)需要绘制到目标上下文中的,image 的矩形(裁剪)选择框的左上角 X 轴坐标。可以使用 3 参数或 5 参数语法来省略这个参数。
  • 「s y」:(可选)需要绘制到目标上下文中的,image 的矩形(裁剪)选择框的左上角 Y 轴坐标。可以使用 3 参数或 5 参数语法来省略这个参数。
  • 「sWidth」:(可选)需要绘制到目标上下文中的,image 的矩形(裁剪)选择框的宽度。如果不说明,整个矩形(裁剪)从坐标的 sx 和 sy 开始,到 image 的右下角结束。可以使用 3 参数或 5 参数语法来省略这个参数。使用负值将翻转这个图像。
  • 「sHeight」:(可选)需要绘制到目标上下文中的,image的矩形(裁剪)选择框的高度。使用负值将翻转这个图像。
  • 「dx」image 的左上角在目标画布上 X 轴坐标。
  • 「dy」image 的左上角在目标画布上 Y 轴坐标。
  • 「dWidth」image 在目标画布上绘制的宽度。允许对绘制的 image 进行缩放。如果不说明,在绘制时 image 宽度不会缩放。注意,这个参数不包含在 3 参数语法中。
  • 「dHeight」image 在目标画布上绘制的高度。允许对绘制的 image 进行缩放。如果不说明,在绘制时 image 高度不会缩放。注意,这个参数不包含在 3 参数语法中。

这9个参数我们可以这样来记忆,第一个参数是图像源,接下来的四个参数指的是原图,最后四个参数指的是画布

切割&渲染

这里我们主要是将一张图片切割成一个个的小碎片,是这些碎片拼起来就是一张完整的图片。

class ChipBanner {
  constructor() {
    this.cvs = document.querySelector("#chip");
    this.ctx = this.cvs.getContext("2d");
    this.imgList = document.querySelectorAll(".bg");
    this.imgIndex = 0;
    this.isAnimating = false;

    this.imgW = 800; //图片原始宽/高
    this.imgH = 530;

    this.conW = 800; //画布宽/高
    this.conH = 530;

    this.dw = 16; //画布单元宽/高
    this.dh = 15;

    this.I = this.conH / this.dh; //单元行/列数
    this.J = this.conW / this.dw;

    this.DW = this.imgW / this.J; //原图单元宽/高
    this.DH = this.imgH / this.I;
  }

  init() {
    this.ctx.beginPath();

    for (let i = 0; i < this.I; i++) {
      for (let j = 0; j < this.J; j++) {
        this.chipDraw(this.imgList[this.imgIndex], i, j);
      }
    }

    this.ctx.closePath();
    this.ctx.stroke();
  }
  drawText() {
    this.ctx.font = "150px serif";
    this.ctx.strokeStyle = "white";
    this.ctx.strokeText("1024", 500, 500);
  }

  chipDraw(img, i, j) {
    this.drawText();
    //负责绘制,i: 单元行号;j: 单元列号
    this.ctx.drawImage(
      img,
      this.DW * j,
      this.DH * i,
      this.DW,
      this.DH,
      this.dw * j,
      this.dh * i,
      this.dw,
      this.dh
    );
  }
}

这里正确拼出来看到的和正常图片没有任何区别

再来看一张拼错的图

刚开始几何坐标那里没写对,拼出来就成这样了,哈哈,看着就像动画帧卡住的样子。

动画

这里主要是要找出某个点周围棱形范围内的所有点的坐标,然后在清除这些坐标图案的同时,开始绘制下一张图片。

「菱形线上的点与坐标的 行号差值的绝对值 + 列号差值的绝对值 = 距离」

找出坐标棱形范围内所有的点

countAround(i, j, dst) {
    let arr = [];
    for (let m = i - dst; m <= i + dst; m++) {
      for (let n = j - dst; n <= j + dst; n++) {
        if (
          Math.abs(m - i) + Math.abs(n - j) == dst &&
          m >= 0 &&
          n >= 0 &&
          m <= this.I - 1 &&
          n <= this.J - 1
        ) {
          arr.push({ x: m, y: n });
        }
      }
    }
    return arr;
  }

清除单元格画布

chipClear(i, j) {
    this.ctx.clearRect(this.dw * j, this.dh * i, this.dw, this.dh);
}

合并&动画

start(i, j) {
    if (this.isAnimating) return;

    this.isAnimating = true;

    this.imgIndex++;

    if (this.imgIndex > this.imgList.length - 1) this.imgIndex = 0;

    let _this = this,
      dst = 0,
      timer = setInterval(() => {
        let resArr = _this.countAround(i, j, dst);

        resArr.forEach((item) => {
          _this.chipClear(item.x, item.y);  // 清除单元格
          _this.chipDraw(_this.imgList[_this.imgIndex], item.x, item.y); // 绘制下一张图片
        });

        if (!resArr.length) {
          clearInterval(timer);
          _this.isAnimating = false;
        }
        dst++;
      }, 30);
  }

大功告成,这样就实现了一个炫酷的碎片式切图效果了~

到此这篇关于javascript利用canvas实现炫酷的碎片切图效果的文章就介绍到这了,更多相关JavaScript canvas碎片切图效果内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaScript利用canvas实现炫酷的碎片切图效果

本文链接: https://www.lsjlt.com/news/170011.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript利用canvas实现炫酷的碎片切图效果
    目录前言需求分析实现过程坐标系切割绘制切割&渲染动画前言 今天分享一个炫酷的碎片式切图效果,这个其实在自己的之前的博客上有实现过,本人觉得这个效果还是挺炫酷的,这次还是用我们...
    99+
    2022-11-13
    JavaScript canvas碎片切图效果 JavaScript canvas 碎片切图 JavaScript canvas 切图
  • JavaScript+Canvas实现酷炫的粒子和流星效果
    目录一:粒子效果二:流星效果一:粒子效果 <html> <head> <meta charset="utf-8"> <title&...
    99+
    2023-01-31
    JavaScript实现粒子效果 JavaScript实现流星效果 JavaScript 粒子 JavaScript 流星
  • 基于canvas实现超炫酷的流水灯效果
    本文实例为大家分享了基于canvas实现超炫酷的流水灯效果的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> &l...
    99+
    2024-04-02
  • HTML5中Canvas如何实现酷炫大波浪进度图效果
    这篇文章主要介绍了HTML5中Canvas如何实现酷炫大波浪进度图效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解...
    99+
    2024-04-02
  • JavaScript canvas实现镜像图片效果
    本文实例为大家分享了JavaScript canvas实现镜像图片效果的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html>...
    99+
    2024-04-02
  • 怎么用HTML5的canvas实现一个炫酷时钟效果
    小编给大家分享一下怎么用HTML5的canvas实现一个炫酷时钟效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!对于H5来说,canvas可以说是它最有特色的一...
    99+
    2023-06-09
  • JavaScript canvas实现九宫格切图效果
    本文实例为大家分享了canvas实现九宫格切图效果的具体代码,供大家参考,具体内容如下 首先页面展示 直接上代码 <!DOCTYPE html> <html ...
    99+
    2024-04-02
  • 基于Three.js实现酷炫3D地图效果
    目录实现效果前言使用1.修改整体的背景图可以使用颜色或用贴图改材质2. 取消地图上柱状图显示3.更换地图、更换省份、市 4.修改相机的视角,页面展示的远近角度5....
    99+
    2022-11-13
    Three.js 3D地图 Three.js 地图
  • CSS3+JavaScript如何实现炫酷呼吸效果
    这篇文章给大家分享的是有关CSS3+JavaScript如何实现炫酷呼吸效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。用css3动画实现的一个简单炫酷效果,最终的效果图如下:页面结构(index.html):...
    99+
    2023-06-08
  • 利用JavaScript制作一个酷炫的3D图片演示
    目录前言一、页面特效效果展示二、功能描述三、功能实现前言 对于学前端的小伙伴来说,吸引你们入坑的大都是一些炫酷的页面。但往往那些页面的源代码对初学的伙伴们都不太友好。今天给大家分享一...
    99+
    2024-04-02
  • 如何利用JavaScript制作一个酷炫的3D图片
    这篇文章将为大家详细讲解有关如何利用JavaScript制作一个酷炫的3D图片,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、页面特效效果展示注:上述效果图只是部分效果,原谅我还没有学会自制gif图!二...
    99+
    2023-06-29
  • 怎么用html5 canvas实现图片玻璃碎片特效
    本篇内容主要讲解“怎么用html5 canvas实现图片玻璃碎片特效”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用html5 canvas实现图片玻璃碎片...
    99+
    2024-04-02
  • js实现炫酷的烟花效果
    本文实例为大家分享了js实现炫酷的烟花效果的具体代码,供大家参考,具体内容如下 我们要理清整个流程的思路。 首先建立一块画布,用于展示烟花的效果,然后就要去思考烟花燃放的流程,我们都...
    99+
    2024-04-02
  • 如何使用html5 canvas实现图片玻璃碎片特效
    小编给大家分享一下如何使用html5 canvas实现图片玻璃碎片特效,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2024-04-02
  • vue自定义js图片碎片轮播图切换效果怎么实现
    这篇文章给大家分享的是有关vue自定义js图片碎片轮播图切换效果怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。定义一个banner.js文件,代码如下;window.re...
    99+
    2024-04-02
  • JavaScript实现酷炫的鼠标拖尾特效
    看完这个保证你有手就行,制作各种好看的小尾巴! 全部代码如下,看注释可以轻易看懂 <!DOCTYPE html> <html lang="en"> &l...
    99+
    2024-04-02
  • CSS如何实现炫酷的文字效果
    今天小编给大家分享一下CSS如何实现炫酷的文字效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2024-04-02
  • JavaScript怎么实现流动图片切换效果
    这篇文章主要介绍“JavaScript怎么实现流动图片切换效果”,在日常操作中,相信很多人在JavaScript怎么实现流动图片切换效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • 原生javascript实现图片轮播切换效果
    本文实例为大家分享了javascript实现图片轮播切换效果的具体代码,供大家参考,具体内容如下 效果如下: 代码部分: <!DOCTYPE html> <htm...
    99+
    2024-04-02
  • Android实现单页显示3个Item的ViewPager炫酷切换效果
    单页显示3个Item的ViewPager炫酷切换效果,适用于Banner等。效果图Rotate YRotate DownRotate UpAlphaScaleInScaleIn + Alpha + Rotate Down使用###(1)引入...
    99+
    2023-05-30
    android viewpager 切换
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作