前端Canvas:让你的网站更具视觉冲击力

前端Canvas:让你的网站更具视觉冲击力

毒舌时刻

前端Canvas?这不是游戏开发才用的吗?

"Canvas性能差,我不用"——结果错过了丰富的视觉效果,
"Canvas太复杂了,我学不会"——结果只能用静态图片,
"我用CSS就够了,要Canvas干嘛"——结果无法实现复杂的动画效果。

醒醒吧,Canvas不是游戏开发的专利,前端也可以用它来创建丰富的视觉效果!

为什么你需要这个?

  • 丰富的视觉效果:创建动态图形、动画和游戏
  • 高性能:直接操作像素,性能优异
  • 交互性:支持鼠标、触摸等交互
  • 数据可视化:绘制图表、仪表盘等
  • 跨平台:在所有现代浏览器中运行

反面教材

// 反面教材:简单的Canvas绘制 function drawCircle() { const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); // 绘制一个简单的圆形 ctx.beginPath(); ctx.arc(100, 100, 50, 0, Math.PI * 2); ctx.fillStyle = 'red'; ctx.fill(); ctx.stroke(); } // 反面教材:没有优化的动画 function animate() { const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); let x = 0; setInterval(() => { // 每次都清除整个画布 ctx.clearRect(0, 0, canvas.width, canvas.height); // 绘制移动的矩形 ctx.fillStyle = 'blue'; ctx.fillRect(x, 50, 50, 50); x += 1; if (x > canvas.width) { x = 0; } }, 16); } 

正确的做法

// 正确的做法:Canvas基础绘制 function basicDrawing() { const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); // 设置画布尺寸 canvas.width = 800; canvas.height = 600; // 绘制矩形 ctx.fillStyle = 'blue'; ctx.fillRect(50, 50, 100, 100); // 绘制圆形 ctx.beginPath(); ctx.arc(250, 100, 50, 0, Math.PI * 2); ctx.fillStyle = 'red'; ctx.fill(); // 绘制路径 ctx.beginPath(); ctx.moveTo(350, 50); ctx.lineTo(450, 150); ctx.lineTo(350, 150); ctx.closePath(); ctx.strokeStyle = 'green'; ctx.lineWidth = 2; ctx.stroke(); // 绘制文本 ctx.font = '24px Arial'; ctx.fillStyle = 'black'; ctx.textAlign = 'center'; ctx.fillText('Canvas绘制示例', canvas.width / 2, 30); } // 正确的做法:Canvas动画 function canvasAnimation() { const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); canvas.width = 800; canvas.height = 600; let x = 0; let y = canvas.height / 2; let dx = 2; let dy = 2; const radius = 20; function animate() { // 清除画布 ctx.clearRect(0, 0, canvas.width, canvas.height); // 绘制移动的圆形 ctx.beginPath(); ctx.arc(x, y, radius, 0, Math.PI * 2); ctx.fillStyle = 'purple'; ctx.fill(); // 边界检测 if (x + radius > canvas.width || x - radius < 0) { dx = -dx; } if (y + radius > canvas.height || y - radius < 0) { dy = -dy; } // 更新位置 x += dx; y += dy; // 使用requestAnimationFrame requestAnimationFrame(animate); } animate(); } // 正确的做法:Canvas交互 function canvasInteraction() { const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); canvas.width = 800; canvas.height = 600; let isDrawing = false; let lastX = 0; let lastY = 0; // 鼠标按下事件 canvas.addEventListener('mousedown', (e) => { isDrawing = true; [lastX, lastY] = [e.offsetX, e.offsetY]; }); // 鼠标移动事件 canvas.addEventListener('mousemove', (e) => { if (!isDrawing) return; ctx.beginPath(); ctx.moveTo(lastX, lastY); ctx.lineTo(e.offsetX, e.offsetY); ctx.strokeStyle = 'black'; ctx.lineWidth = 2; ctx.stroke(); [lastX, lastY] = [e.offsetX, e.offsetY]; }); // 鼠标释放事件 canvas.addEventListener('mouseup', () => { isDrawing = false; }); // 鼠标离开事件 canvas.addEventListener('mouseout', () => { isDrawing = false; }); } // 正确的做法:Canvas数据可视化 function canvasChart() { const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); canvas.width = 800; canvas.height = 600; // 数据 const data = [12, 19, 3, 5, 2, 3, 7, 11, 15, 18, 10, 6]; const labels = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']; // 绘制坐标系 const padding = 50; const chartWidth = canvas.width - padding * 2; const chartHeight = canvas.height - padding * 2; // X轴 ctx.beginPath(); ctx.moveTo(padding, canvas.height - padding); ctx.lineTo(canvas.width - padding, canvas.height - padding); ctx.stroke(); // Y轴 ctx.beginPath(); ctx.moveTo(padding, padding); ctx.lineTo(padding, canvas.height - padding); ctx.stroke(); // 绘制数据 const maxValue = Math.max(...data); const barWidth = chartWidth / data.length; data.forEach((value, index) => { const barHeight = (value / maxValue) * chartHeight; const x = padding + index * barWidth; const y = canvas.height - padding - barHeight; // 绘制柱子 ctx.fillStyle = 'rgba(54, 162, 235, 0.6)'; ctx.fillRect(x + 5, y, barWidth - 10, barHeight); // 绘制标签 ctx.font = '12px Arial'; ctx.fillStyle = 'black'; ctx.textAlign = 'center'; ctx.fillText(labels[index], x + barWidth / 2, canvas.height - padding + 15); }); // 绘制标题 ctx.font = '20px Arial'; ctx.fillStyle = 'black'; ctx.textAlign = 'center'; ctx.fillText('月度销售数据', canvas.width / 2, padding / 2); } // 正确的做法:Canvas图像处理 function canvasImageProcessing() { const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); canvas.width = 800; canvas.height = 600; // 加载图像 const img = new Image(); img.crossOrigin = 'anonymous'; img.onload = () => { // 绘制原始图像 ctx.drawImage(img, 0, 0, 400, 300); // 获取图像数据 const imageData = ctx.getImageData(0, 0, 400, 300); const data = imageData.data; // 处理图像(灰度) for (let i = 0; i < data.length; i += 4) { const r = data[i]; const g = data[i + 1]; const b = data[i + 2]; const gray = (r + g + b) / 3; data[i] = gray; data[i + 1] = gray; data[i + 2] = gray; } // 绘制处理后的图像 ctx.putImageData(imageData, 400, 0); }; img.src = 'https://picsum.photos/800/600'; } 

毒舌点评

看看,这才叫前端Canvas!不是简单地绘制几个图形,而是创建丰富的视觉效果、动画和交互。

记住,Canvas是一个强大的工具,它可以让你创建从简单的图表到复杂的游戏等各种视觉效果。合理使用Canvas,可以让你的网站更具视觉冲击力。

所以,别再觉得Canvas复杂了,它是前端视觉效果的重要工具!

总结

  • 基础绘制:矩形、圆形、路径、文本等
  • 动画效果:使用requestAnimationFrame实现流畅动画
  • 交互操作:鼠标、触摸等事件处理
  • 数据可视化:绘制图表、仪表盘等
  • 图像处理:像素级操作,实现滤镜效果
  • 性能优化:合理使用缓存、避免频繁重绘
  • 响应式:根据容器大小调整画布尺寸
  • 工具库:使用Chart.js、Fabric.js等库简化开发

前端Canvas,让你的网站更具视觉冲击力!

Read more

Hunyuan-MT-7B-WEBUI部署全流程,新手也能懂

Hunyuan-MT-7B-WEBUI部署全流程,新手也能懂 你是不是也遇到过这样的情况:看到一个超厉害的翻译模型介绍,心里直呼“这太适合我们单位处理多语种公文了”,可点开文档第一行就写着“需配置CUDA 12.1+PyTorch 2.3+transformers 4.45……”——然后默默关掉页面? 别急。今天这篇,不讲CUDA版本兼容性,不聊LoRA微调参数,也不提什么FlashAttention优化。我们就用最直白的话,带你从零开始,把腾讯开源的 Hunyuan-MT-7B-WEBUI 真正跑起来。整个过程不需要写一行代码,不用改一个配置文件,连Linux命令都只用敲3条。哪怕你上一次接触终端还是在大学计算机课上,也能照着做完。 它支持日语、法语、西班牙语、葡萄牙语,还覆盖维吾尔语、藏语、哈萨克语、蒙古语、彝语等5种民族语言,总共38种语言互译;它在WMT25国际评测中拿下30个语向的第一名;它不是demo,是能直接输入一段中文,秒出维吾尔语译文的真实能力。而这一切,只需要你点几下鼠标。 下面就是完整流程。我们按真实操作顺序来,

“再跑一个 Prompt“:AI 时代程序员的多巴胺陷阱,正在悄悄毁掉你的大脑

“再跑一个 Prompt“:AI 时代程序员的多巴胺陷阱,正在悄悄毁掉你的大脑

“我知道这样不健康,但我停不下来……就再跑一个 prompt。” —— Glenn Sanford,eXp Realty 创始人,2026 年 1 月 前言:一个让硅谷大佬心脏骤停的"瘾" 2025 年夏天,Glenn Sanford 正处于事业巅峰。 他是 eXp Realty(市值数十亿美元的房地产公司)的创始人,也是 SUCCESS Enterprises 的 CEO。 他正在用 AI 构建一个"个人发展领域的 Netflix"——一个月内就搭建出了"Facebook 的替代品"。 然后,他的心脏开始乱跳了。 房颤(A-fib),一种严重的心律失常。

重塑数学边界:人工智能如何引领数学研究的新纪元

重塑数学边界:人工智能如何引领数学研究的新纪元

目录 一、人工智能如何重新定义数学研究的边界 (一)数学与AI的关系:从基础理论到创新思维的回馈 (二)AI的创造力:突破传统推理的局限 (三)AI对数学研究的潜在贡献:创新的催化剂 二、AI 与数学的碰撞:从传统到生成式AI的进化 (一)传统人工智能:符号推理与规则系统 (二)机器学习:从数据驱动到模式识别 (三)生成式AI:数学创新的新时代 (四)生成式AI在数学中的创造性潜力 三、人机共证:AI 参与数学证明的前沿探索 (一)初衷与基础工具:从手工推理到机器验证的演进之路 (二)自动化形式证明生成:AI 在严谨推理中的新进展 1. 关键特点:AI 证明系统三要素 1.1 早期探索者:RNN、搜索与强化学习的结合 1.2 向交互式智能迈进:

深度解析Claude官方Skill-Creator,不止是模板,更是AI技能工程化的完整体系

深度解析Claude官方Skill-Creator,不止是模板,更是AI技能工程化的完整体系

在AI Agent快速迭代的今天,Anthropic推出的Claude Skill系统,正在重新定义AI能力的扩展方式。而作为这个系统的“元技能”,Skill-Creator更是打破了人们对“技能开发”的固有认知——它不是简单的SKILL.md文档模板,也不是零散的工具集合,而是一套将AI技能开发标准化、流程化、工程化的完整体系。基于Claude官方Skill-Creator源码(485行SKILL.md,2026年3月7日版本)及Anthropic官方博客资料,我们从设计理念、架构细节、实操流程到企业落地,全方位拆解这个强大的“技能工厂”,让每一位从业者都能看懂其核心价值与应用逻辑。 一、认知澄清:Skill-Creator的本质的是“AI技能工程化系统” 很多人初次接触Skill-Creator时,都会误以为它只是一个用来生成SKILL.md文件的工具,毕竟从表面上看,它确实能引导用户完成技能文档的撰写。但深入源码和官方文档后会发现,它的本质是一个“AI技能工程化系统”,核心目标是解决三类关键问题:Skill是否真的能提升结果质量而不是单纯的心理安慰,Skill是否能在正确的场