特效描述:利用HTML5实现 勾股树 植物生长 动画特效。利用HTML5实现勾股树植物生长动画特效

代码结构

1. HTML代码

const canvas = document.querySelector("#canvas");

const context = canvas.getContext("2d", { alpha: false });

let vw = canvas.width = window.innerWidth;

let vh = canvas.height = window.innerHeight;

// let boxSize = Math.min(vw / 6, vh / 4);

let boxSize = 80;

const maxLevel = 10;

const roundTo = 1000;

const color1 = { h: 69, s: 75, l: 51 };

const color2 = { h: 288, s: 98, l: 17 };

const colors = getColors(color1, color2, maxLevel + 2);

const mouse = {

x: vw / 2,

y: vh / 2

};

let count = 0;

let lean = 0;

let scale = 0;

let resized = false;

let requestId = null;

let x = (vw - boxSize) / 2;

let y = vh;

//

// CALC BRANCHES

// ================================================================================

const calcBranches = (function() {

let memo = {};

let memoize = function(width, scale, lean) {

const memoKey = `${width}-${scale}-${lean}`;

if (!memo[memoKey]) {

const currentH = width * scale;

const result = {

leftSize: Math.sqrt(currentH ** 2 + (width * (0.5 - lean)) ** 2),

rightSize: Math.sqrt(currentH ** 2 + (width * (0.5 + lean)) ** 2),

leftAngle: Math.atan(currentH / ((0.5 - lean) * width)),

rightAngle: Math.atan(currentH / ((0.5 + lean) * width))

};

memo[memoKey] = result;

memoize.count++;

}

return memo[memoKey];

}

memoize.count = 0;

memoize.cache = memo;

return memoize;

})();

window.addEventListener("resize", onResize);

window.addEventListener("mousemove", onMouseMove);

update();

//

// DRAW TREE

// ================================================================================

function drawTree(size, scale, lean, level) {

if (size < 1) {

count += 2;

return;

}

size = Math.round(size * roundTo) / roundTo;

const { leftSize, leftAngle, rightSize, rightAngle } = calcBranches(size, scale, lean);

context.save();

context.fillRect(0, 0, size, -size);

context.fillStyle = colors[level];

context.translate(0, -size);

context.rotate(-leftAngle);

if (level) {

drawTree(leftSize, scale, lean, level - 1);

} else {

context.fillRect(0, 0, leftSize, -leftSize);

}

context.translate(leftSize, 0);

context.rotate(rightAngle + leftAngle);

if (level) {

drawTree(rightSize, scale, lean, level - 1);

} else {

context.fillRect(0, 0, rightSize, -rightSize);

}

context.restore();

}

//

// UPDATE

// ================================================================================

function update() {

if (resized) {

vw = canvas.width = window.innerWidth;

vh = canvas.height = window.innerHeight;

// boxSize = Math.min(vw / 6, vh / 4);

x = (vw - boxSize) / 2;

y = vh;

}

scale = Math.round(map(mouse.y, vh, 0, 0, 0.8) * roundTo) / roundTo;

lean = Math.round(map(mouse.x, 0, vw, 0.5, -0.5) * roundTo) / roundTo;

context.fillStyle = "white";

context.fillRect(0, 0, vw, vh);

context.save();

context.fillStyle = colors[maxLevel+1];

context.translate(x, y);

drawTree(boxSize, scale, lean, maxLevel, maxLevel);

context.restore();

resized = false;

requestId = null;

}

//

// GET COLORS

// ================================================================================

function getColors(c1, c2, steps) {

const colors = [];

for (let i = 0; i < steps; i++) {

const t = i / (steps - 1);

const h = Math.round(lerp(c1.h, c2.h, t));

const s = Math.round(lerp(c1.s, c2.s, t));

const l = Math.round(lerp(c1.l, c2.l, t));

colors.push(`hsl(${h},${s}%,${l}%)`);

}

return colors;

}

//

// ON MOUSE MOVE

// ================================================================================

function onMouseMove(event) {

mouse.x = event.clientX;

mouse.y = event.clientY;

if (!requestId) {

requestId = requestAnimationFrame(update);

}

}

//

// ON RESIZE

// ================================================================================

function onResize() {

resized = true;

if (!requestId) {

requestId = requestAnimationFrame(update);

}

}

function lerp(a, b, t) {

return a + (b - a) * t;

}

function map(x, a, b, c, d) {

return c + (d - c) * ((x - a) / (b - a)) || 0;

}

html5 可旋转的三维树形结构,利用HTML5实现勾股树植物生长动画特效相关推荐

  1. android 五彩纸屑动画,利用H5实现Canvas五彩纸屑飘落动画特效

    特效描述:利用H5实现 Canvas 五彩纸屑飘落 动画特效.利用H5实现Canvas五彩纸屑飘落动画特效 代码结构 1. HTML代码 "use strict"; var _cr ...

  2. html5实现粒子效果的文字,利用HTML5实现Canvas粒子文字特效

    特效描述:利用HTML5实现 Canvas 粒子文字特效.利用HTML5实现Canvas粒子文字特效 代码结构 1. HTML代码 change /*jshint esversion:6*/ var ...

  3. html5如何写出圆背景,利用HTML5实现Canvas虚幻圆点背景特效

    特效描述:利用HTML5实现 Canvas 虚幻圆点 背景特效.利用HTML5实现Canvas虚幻圆点背景特效 代码结构 1. 引入JS 2. HTML代码 (function($){ var can ...

  4. 苹果手机html5摇一摇游戏戏码,利用HTML5的devicemotion事件实现手机摇一摇抽奖,年会抽奖,html5devicemotion...

    利用HTML5的devicemotion事件实现手机摇一摇抽奖,年会抽奖,html5devicemotion 摇一摇JS脚本逻辑: 接下来是移动端JS脚本逻辑的实现,摇一摇的实现需借助html5新增的 ...

  5. html5经纬度定位 源码_利用HTML5定位功能获取经纬度,在根据经纬度利用百度地图获取位置信息...

    一.引入相关js 二.js代码 // 单次位置请求执行的函数 function getLocation(){ navigator.geolocation.getCurrentPosition(mapI ...

  6. html5简单制作效果,分享一个利用HTML5制作的海浪效果代码-H5教程

    在前面简单讲述了一下HTML里的Canvas,这次根据Canvas完成了"海浪效果"(水波上升). (O(∩_∩)O哈哈哈~作者我能看这个动画看一下午) 上升水波.gif动画分析 ...

  7. 利用HTML5+CSS3+JS实现简单的钟表

    HTML5+CSS3+JS实现动态时钟 利用HTML5+CSS3+JS实现简单的钟表,仅供参考学习 效果图: 在线效果预览 思路: 1. 先定义一个类名为timepiece的圆表表盘 HTML: &l ...

  8. 让人脸动起来html源码,分享利用HTML5的Canvas制作人脸的实例代码

    这里主要使用了 HTML5 的 Canvas 进行绘制.利用html5制作人脸的实例代码. 先看我们要绘制的人脸效果图: 这里主要使用了 HTML5 的 Canvas 进行绘制. 下面我们开始整个绘制 ...

  9. 分享web前端七款HTML5 Loading动画特效集锦

    以前我们大部分的Loading动画都是利用gif图片实现的,这种图片实现Loading动画的方法虽然也很不错,但是作为HTML5开发者来说,如果能利用HTML5和CSS3实现这些超酷的Loading动 ...

最新文章

  1. java double转换符_java中字符串怎么转换成double类型
  2. 2字节取值范围_第二篇——整数和浮点数在计算机中的表示(2)
  3. 认识探头(一) (转)
  4. DSS流媒体服务器搭建
  5. 实际生产中,微服务用 Spring Cloud 多还是 Dubbo 多?
  6. VC6编译64位程序
  7. 最新老男孩Linux云计算sre学什么
  8. vyos配置ds-nat
  9. Python计算流体动力学(CFD)模拟人体呼吸系统
  10. 分布式共识算法——Gossip协议(图解)
  11. mysql查询这一周数据库_MYSQL查询一周,一月内的数据
  12. 三端口 DC-DC 变换器(C 题)-- 2021年全国大学生电子设计竞赛试题
  13. kettle与MySQL数据库建立连接教程
  14. MATLAB---读取STL文件并解析
  15. mysql在线考试的设计_在线考试系统设计与实现(MySQL)
  16. Mina中的Pasta(Pallas和Vesta)曲线
  17. mysql 存储过程 varchar 赋值,mysql 存储过程中变量的定义与赋值操作
  18. 【转】免费学术资源网址
  19. arm 关于m a r系列区别
  20. 实现一个自主飞行的无人机需要的技术:定位导航-环境感知-目标感知-控制规划

热门文章

  1. 使用python处理日志文件
  2. m阶B+树与m阶B树的区别
  3. java jolt_java – Jolt条件规范
  4. ettercap内网DNS劫持实验
  5. 信用社 面试计算机流程,农村信用社面试流程及经验
  6. 强烈推荐10本程序员要读的书
  7. 机器学习之监督学习和 非监督学习区别
  8. 在Viz 3.x中如何导入Viz 2.8的打包文件.eva
  9. 【新手上路常见问答】关于技术管理
  10. 如下篇文章写的不错!