html5 圆形过渡到方形,HTML5/Canvas使用方形构建的3D圆环

这段代码展示了一个使用JavaScript、Babel和CoffeeScript编写的图形动画。通过获取canvas元素,设置其宽高,并利用二维绘图上下文绘制图形,实现了一种基于时间变化的动态效果。代码中涉及到数学函数、坐标变换以及路径绘制,创建了复杂的动画图形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaScript

语言:

JaveScriptBabelCoffeeScript

确定

var canvas = document.getElementsByTagName('canvas')[0];

var ctx = canvas.getContext('2d');

canvas.width = canvas.height = 400;

aaa();

function aaa() {

var a, b, c, d, e, tim, max, x, y, x2, y2, px, py, tx, ty,

r, mc, ms, st, len, gx, gy, gz, yp, yp2, xp, xp2, z;

ctx.fillStyle = "rgb(0,0,0)";

ctx.fillRect(0, 0, canvas.width, canvas.height);

tim = new Date().getTime() / 70;

gz = Math.sin(tim / 31);

gx = Math.sin(tim / 29) / 2;

gy = Math.sin(tim / 37) / 2;

a = tim / 79;

yp = Math.cos(a);

yp2 = Math.sin(a);

a = tim / 77;

xp = Math.cos(a);

xp2 = Math.sin(a);

ty = canvas.height / 2;

tx = canvas.width / 2;

py = 35;

px = py * Math.sin(Math.PI / 3);

for (d = 0; d < 3; d++) {

r = Math.PI * 2 / 3 * d;

mc = Math.cos(r);

ms = Math.sin(r);

for (a = 0; a < 10; a++) {

for (b = 0; b < 10; b++) {

c = 0;

if (b % 2 == 1) c = 0.5;

x = (b) * px + tim * 4;

y = (a + c) * py;

hisi(x, y, d);

}

}

}

d = st;

for (z = 0; z < 10000; z++) {

if (!st) break;

e = d.q;

ctx.beginPath();

for (a = 0; a < e.length; a++) ctx.lineTo(tx + e[a][0] * 140, ty + e[a][1] * 140);

ctx.closePath();

c = "hsl(" + d.c + ",97%," + d.lit + "%)";

ctx.fillStyle = c;

ctx.strokeStyle = c;

ctx.lineWidth = 1;

ctx.fill();

if (!d.tugi) break;

d = d.tugi;

}

function hisi(x, y, col) {

var a, b, c, d, e, x0, y0, x1, y1, z1, p, p1, p2, rx, ry,

r1, r2, myp, myp2, z;

p = [

[x, y],

[x + px / 2, y + py / 4],

[x, y + py / 2],

[x - px / 2, y + py / 4]

];

len = 4;

p1 = [];

for (a = 0; a < 4; a++) {

c = p[a];

d = p[(a + 1) % 4];

for (b = 0; b < len; b++) {

r1 = b / len;

r2 = 1 - r1;

x0 = c[0] * r2 + d[0] * r1;

y0 = c[1] * r2 + d[1] * r1;

p1.push([x0, y0]);

}

}

p = p1;

p2 = [];

for (a = 0; a < p.length; a++) {

x0 = p[a][0];

y0 = p[a][1];

if (col) {

x1 = x0 * mc - y0 * ms;

y1 = x0 * ms + y0 * mc;

x0 = x1;

y0 = y1;

}

rx = (x0 / px / 20) * Math.PI * 2;

ry = (y0 / py / 20) * Math.PI * 2 + tim / 33;

myp = Math.cos(rx);

myp2 = Math.sin(rx);

z = Math.cos(ry) / 2 + 1;

y = Math.sin(ry) / 2;

x = z * myp2;

z = z * myp;

y1 = y * yp + z * yp2;

z1 = y * yp2 - z * yp;

x1 = x * xp + z1 * xp2;

z = x * xp2 - z1 * xp;

z1 = Math.pow(1.4, z + gz);

x = (x1 + gx) * z1;

y = (y1 + gy) * z1;

p2.push([x, y, z]);

}

pp(p2, col);

} //hisi

function pp(q, co) {

var a, b, c, d, e, f, g, h, i, ob, col;

ob = {

q: q,

c: (co * 120 + 55)

};

a = q[2 * len];

b = q[1 * len];

c = q[0];

d = [b[0] - a[0], b[1] - a[1], b[2] - a[2]];

e = [c[0] - b[0], c[1] - b[1], c[2] - b[2]];

h = d[0] * e[1] - d[1] * e[0];

f = d[1] * e[2] - d[2] * e[1];

g = d[2] * e[0] - d[0] * e[2];

if (h < 0) {

h = -h;

f = -f;

g = -g;

i = 1;

}

a = f - g * 0.7 + h * 1.2;

b = Math.abs(f) + Math.abs(h) + Math.abs(g);

a = a / b;

a = a * 25 + 25;

if (a < 10) a = 10;

if (!i) a *= 0.4;

ob.lit = a;

a = (q[0][2] + q[1 * len][2] + q[2 * len][2] + q[3 * len][2]) / 4;

ob.m = a;

if (!st) {

st = ob;

return;

}

b = st;

while (1) {

if (b.m > a) {

if (!b.mae) {

st = ob;

} else {

b.mae.tugi = ob;

}

ob.mae = b.mae;

b.mae = ob;

ob.tugi = b;

break;

}

if (!b.tugi) {

b.tugi = ob;

ob.mae = b;

break;

}

b = b.tugi;

}

}

requestAnimationFrame(aaa);

}

### 使用 Canvas 和 CSS 绘制圆形图形 #### 1. 使用 HTML5 的 `<canvas>` 元素绘制圆形 `<canvas>` 是一种强大的绘图工具,可以用来创建动态的图形。以下是基于 `arc()` 方法的一个简单示例来绘制一个红色填充的圆形: ```javascript // 获取 canvas 元素并初始化上下文对象 var c = document.getElementById("myCanvas"); var ctx = c.getContext("2d"); // 设置填充颜色 ctx.fillStyle = "#FF000"; // 开启一条新路径 ctx.beginPath(); // 调用 arc() 方法定义圆弧参数 (x, y, r, startAngle, endAngle, anticlockwise) ctx.arc(70, 70, 50, 0, Math.PI * 2, false); // 关闭路径 ctx.closePath(); // 填充路径 ctx.fill(); ``` 此代码片段会生成一个以 `(70, 70)` 为中心、半径为 `50` 的实心红圈[^1]。 --- #### 2. 使用纯 CSS 实现圆形效果 如果只需要静态显示圆形而无需复杂交互,则可以通过简单的 CSS 来完成。下面是一个例子: ```html <div class="circle"></div> <style> .circle { width: 100px; height: 100px; background-color: red; border-radius: 50%; /* 将宽高比例设为正方形,并应用边框半径 */ } </style> ``` 这里的关键在于设置了 `width` 和 `height` 属性使容器成为正方形,再利用 `border-radius: 50%` 把它变成完美的圆形[^3]。 --- #### 3. 结合两者的优势——动态与美观兼备 当需要更复杂的视觉效果时,比如渐变背景或者动画加载条,可以结合两者的优点。例如制作一个带进度指示器的圆形图表: ```html <canvas id="progressCircle" width="200" height="200"></canvas> <script> const canvas = document.getElementById('progressCircle'); const ctx = canvas.getContext('2d'); function drawProgress(percent) { const centerX = canvas.width / 2; const centerY = canvas.height / 2; const radius = 80; // 清除画布 ctx.clearRect(0, 0, canvas.width, canvas.height); // 底层灰色圆环 ctx.strokeStyle = '#cccccc'; ctx.lineWidth = 10; ctx.beginPath(); ctx.arc(centerX, centerY, radius, 0, Math.PI * 2, false); ctx.stroke(); // 动态蓝色部分表示进度百分比 let angle = percent / 100 * Math.PI * 2; ctx.strokeStyle = 'blue'; ctx.beginPath(); ctx.arc(centerX, centerY, radius, -Math.PI / 2, (-Math.PI / 2) + angle, false); ctx.stroke(); } setInterval(() => { let randomPercent = Math.floor(Math.random() * 100); // 随机生成进度值 drawProgress(randomPercent); }, 1000); </script> ``` 上述脚本每隔一秒更新一次随机进度数值,并重新渲染带有相应长度蓝色彩虹的部分[^2]。 --- ### 总结 无论是采用轻量级解决方案(如仅靠 CSS),还是追求高度定制化功能(借助 JavaScript 控制 Canvas API),都可以轻松达成目标。具体选择取决于项目需求以及个人偏好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值