博客园背景特效
粒子鼠标跟踪吸附
| |
| <script type="text/javascript"> |
| |
| !function () { |
| |
| function get_attribute(node, attr, default_value) { |
| return node.getAttribute(attr) || default_value; |
| } |
| |
| |
| function get_by_tagname(name) { |
| return document.getElementsByTagName(name); |
| } |
| |
| |
| function get_config_option() { |
| var scripts = get_by_tagname("script"), |
| script_len = scripts.length, |
| script = scripts[script_len - 1]; |
| return { |
| l: script_len, |
| z: get_attribute(script, "zIndex", -1), |
| o: get_attribute(script, "opacity", 0.8), |
| c: get_attribute(script, "color", "255,255,255"), |
| n: get_attribute(script, "count", 350) |
| }; |
| } |
| |
| |
| function set_canvas_size() { |
| canvas_width = the_canvas.width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth, |
| canvas_height = the_canvas.height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; |
| } |
| |
| |
| function draw_canvas() { |
| context.clearRect(0, 0, canvas_width, canvas_height); |
| |
| var e, i, d, x_dist, y_dist, dist; |
| |
| random_points.forEach(function (r, idx) { |
| r.x += r.xa, |
| r.y += r.ya, |
| r.xa *= r.x > canvas_width || r.x < 0 ? -1 : 1, |
| r.ya *= r.y > canvas_height || r.y < 0 ? -1 : 1, |
| context.fillRect(r.x - 0.5, r.y - 0.5, 1, 1); |
| |
| for (i = idx + 1; i < all_array.length; i++) { |
| e = all_array[i]; |
| |
| if (null !== e.x && null !== e.y) { |
| x_dist = r.x - e.x; |
| y_dist = r.y - e.y; |
| dist = x_dist * x_dist + y_dist * y_dist; |
| |
| dist < e.max && (e === current_point && dist >= e.max / 2 && (r.x -= 0.03 * x_dist, r.y -= 0.03 * y_dist), |
| d = (e.max - dist) / e.max, |
| context.beginPath(), |
| context.lineWidth = d / 2, |
| context.strokeStyle = "#0000FF", |
| context.moveTo(r.x, r.y), |
| context.lineTo(e.x, e.y), |
| context.stroke()); |
| } |
| } |
| }), frame_func(draw_canvas); |
| } |
| |
| |
| var the_canvas = document.createElement("canvas"), |
| config = get_config_option(), |
| canvas_id = "c_n" + config.l, |
| context = the_canvas.getContext("2d"), canvas_width, canvas_height, |
| frame_func = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (func) { |
| window.setTimeout(func, 1000 / 40); |
| }, random = Math.random, |
| current_point = { |
| x: null, |
| y: null, |
| max: 20000 |
| }, |
| all_array; |
| the_canvas.id = canvas_id; |
| the_canvas.style.cssText = "position:fixed;top:0;left:0;z-index:" + config.z + ";opacity:" + config.o; |
| get_by_tagname("body")[0].appendChild(the_canvas); |
| |
| |
| set_canvas_size(); |
| window.onresize = set_canvas_size; |
| |
| window.onmousemove = function (e) { |
| e = e || window.event; |
| current_point.x = e.clientX; |
| current_point.y = e.clientY; |
| }, window.onmouseout = function () { |
| current_point.x = null; |
| current_point.y = null; |
| }; |
| |
| for (var random_points = [], i = 0; config.n > i; i++) { |
| var x = random() * canvas_width, |
| y = random() * canvas_height, |
| xa = 2 * random() - 1, |
| ya = 2 * random() - 1; |
| |
| random_points.push({ |
| x: x, |
| y: y, |
| xa: xa, |
| ya: ya, |
| max: 6000 |
| }); |
| } |
| all_array = random_points.concat([current_point]); |
| |
| setTimeout(function () { |
| draw_canvas(); |
| }, 100); |
| }(); |
| </script> |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义