当前位置: 首页 > news >正文

html网页中图片展示为碎片,基于HTML代码实现图片碎片化加载功能

这篇文章主要介绍了基于HTML代码实现图片碎片化加载功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

今天来实现一个图片碎片化加载效果,效果如下:

我们分为 3 个步骤来实现:

定义 html 结构

拆分图片

编写动画函数

定义html结构

这里只需要一个 canvas 元素就可以了。

>

拆分图片

这个例子中,我们将图片按照 10 行 10 列的网格,拆分成 100 个小碎片,这样就可以对每一个小碎片独立渲染了。

let image = new Image();

image.src ="https://cdn.yinhengli.com/canvas-example.jpeg";

let boxWidth, boxHeight;

// 拆分成 10 行,站群系统,10 列

let rows = 10,

columns = 20,

counter = 0;

image.onload = function () {

// 计算每一行,每一列的宽高

boxWidth = image.width / columns;

boxHeight = image.height / rows;

// 循环渲染

requestAnimationFrame(animate);

};

requestAnimationFrame :告诉浏览器,你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。

编写动画函数

接下来我们编写动画函数,站群,让浏览器在每一次重绘前,随机渲染某个小碎片。

这里的核心是 context.drawImage 方法。

let canvas = document.getElementById("myCanvas");

let context = canvas.getContext("2d");

function animate() {

// 随机渲染某个模块

let x = Math.floor(Math.random() * columns);

let y = Math.floor(Math.random() * rows);

// 核心

context.drawImage(

image,

x * boxWidth,  // canvas 中横坐标起始位置

y * boxHeight, // canvas 中纵坐标起始位置

boxWidth,      // 画图的宽度(小碎片图像的宽)

boxHeight,     // 画图的高度(小碎片图像的高)

x * boxWidth,  // 从大图的 x 坐标位置开始画图

y * boxHeight, // 从大图的 y 坐标位置开始画图

boxWidth,      // 从大图的 x 位置开始,画多宽(小碎片图像的宽)

boxHeight      // 从大图的 y 位置开始,画多高(小碎片图像的高)

);

counter++;

// 如果模块渲染了 90%,就让整个图片显示出来。

if (counter > columns * rows * 0.9) {

context.drawImage(image, 0, 0);

} else {

requestAnimationFrame(animate);

}

}

完整代码

>

let image = new Image();

image.src ="https://cdn.yinhengli.com/canvas-example.jpeg";

let canvas = document.getElementById("myCanvas");

let context = canvas.getContext("2d");

let boxWidth, boxHeight;

let rows = 10,

columns = 20,

counter = 0;

image.onload = function () {

boxWidth = image.width / columns;

boxHeight = image.height / rows;

requestAnimationFrame(animate);

};

function animate() {

let x = Math.floor(Math.random() * columns);

let y = Math.floor(Math.random() * rows);

context.drawImage(

image,

x * boxWidth, // 横坐标起始位置

y * boxHeight, // 纵坐标起始位置

boxWidth, // 图像的宽

boxHeight, // 图像的高

x * boxWidth, // 在画布上放置图像的 x 坐标位置

y * boxHeight, // 在画布上放置图像的 y 坐标位置

boxWidth, // 要使用的图像的宽度

boxHeight // 要使用的图像的高度

);

counter++;

if (counter > columns * rows * 0.9) {

context.drawImage(image, 0, 0);

} else {

requestAnimationFrame(animate);

}

}

总结

通过这个 Demo,我们使用了 canvasAPI 实现了图片的碎片加载效果,是不是特别简单!

相关报道:

漫威超级英雄电影《尚气》将于今年9月3日在北美上映,近日该片主演刘思慕接受外媒NBC访谈时表示,电影中不会出现 更多

陪伴几代人成长的《数码宝贝》20周年剧场版《数码宝贝:最后的进化》今日发布中国专属定档海报和定档预告,重磅 更多

相关文章:

  • 自定义快捷键--向前/向后/全文搜索
  • 组装台式计算机需要哪些硬件,电脑硬件有哪些?组装一台电脑需要哪些配件详解...
  • linux系统一些信息(待整理)
  • html里设置选中过渡时间,HTML / CSS – 过渡选择器
  • Divide two integers without using multiplication, division and mod operator.
  • 在html5中您能够直接将,HTML5 基础测试题
  • CFLAGS CPPFLAGS CPPFLAGS 区别
  • 女生适合学的计算机语言,转行IT必看!你究竟适合学习哪种编程语言?
  • WampServer修改MySQL密码
  • 计算机的应用领悟是,理论知识:计算机应用基础课程学习领悟
  • npm用法
  • 几点计算机水平考试,全国计算机等级考试开始报名,这几点要注意
  • python-Redis数据结构服务器
  • 小学多媒体计算机室管理计划,多媒体教室管理工作计划
  • 和|不等同于或||
  • 〔开发系列〕一次关于小程序开发的深度总结
  • ➹使用webpack配置多页面应用(MPA)
  • 08.Android之View事件问题
  • 345-反转字符串中的元音字母
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • create-react-app项目添加less配置
  • httpie使用详解
  • java取消线程实例
  • java小心机(3)| 浅析finalize()
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • redis学习笔记(三):列表、集合、有序集合
  • SQLServer插入数据
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 分布式事物理论与实践
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • ------- 计算机网络基础
  • 微信小程序:实现悬浮返回和分享按钮
  • 小而合理的前端理论:rscss和rsjs
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #前后端分离# 头条发布系统
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (二)hibernate配置管理
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • *p++,*(p++),*++p,(*p)++区别?
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .NET企业级应用架构设计系列之技术选型
  • /proc/interrupts 和 /proc/stat 查看中断的情况