实现我博客旁边的线条效果 html canvas-nest.js 源码

canvas-nest.js 这个js文件可以用来实现炫酷的线条与鼠标进行交互的功能,具体效果如图所示

js具体源码如下:

/**
     * Copyright (c) 2016 hustcc
     * License: MIT
     * Version: %%GULP_INJECT_VERSION%%
     * GitHub: https://github.com/hustcc/canvas-nest.js
    **/
    ! 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]; //当前加载的script
        return {
          l: script_len, //长度,用于生成id用
          z: get_attribute(script, "zIndex", -1), //z-index
          o: get_attribute(script, "opacity", 0.5), //opacity
          c: get_attribute(script, "color", "0,0,0"), //color
          n: get_attribute(script, "count", 99) //count
        };
      }
      //设置canvas的高宽
      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); //绘制一个宽高为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; //x轴距离 l
              y_dist = r.y - e.y; //y轴距离 n
              dist = x_dist * x_dist + y_dist * y_dist; //总距离, m

              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 = "rgba(" + config.c + "," + (d + 0.2) + ")",
                context.moveTo(r.x, r.y),
                context.lineTo(e.x, e.y),
                context.stroke());
            }
          }
        }), frame_func(draw_canvas);
      }
      //创建画布,并添加到body中
      var the_canvas = document.createElement("canvas"), //画布
        config = get_config_option(), //配置
        canvas_id = "c_n" + config.l, //canvas id
        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 / 45);
        }, random = Math.random,
        current_point = {
          x: null, //当前鼠标x
          y: null, //当前鼠标y
          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;
      };
      //随机生成config.n条线位置信息
      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]);
      //0.1秒后绘制
      setTimeout(function() {
        draw_canvas();
      }, 100);
    }();

在html网页中body的标签中添加script标签,如下所示

<script type="text/javascript" color="208,55,66" opacity="0.5"count="99"src="test.js"></script>

color 颜色自定义,opactity 是透明度,一般来说0.5-1就可以了,count的是数量,不要太大,太大可能会使得用户的浏览器卡顿,src后为该js文件的所在路径。

PS:

我直接用test命令了那个js文件

原文地址:https://www.cnblogs.com/kexing/p/7264753.html

时间: 2024-10-09 12:29:54

实现我博客旁边的线条效果 html canvas-nest.js 源码的相关文章

博客主页动态线条效果

经过一个下午你努力,我也把自己的博客主页变成了动态的效果了嘿嘿嘿. 这里声明一件事情以下内容是借鉴他人作品而写的我只是一个搬运工 借鉴博客   :https://www.cnblogs.com/panghu123/     如若侵权请告知 先插效果图  效果如下: 接着上代码: <script type="text/javascript"> /** * Copyright (c) 2016 hustcc * License: MIT * Version: v1.0.1 *

博客园客户端(睡睡版iphone)源码

1.关于 项目目前为V3.0版,也是我开发的最新版,目前已无法在appstore下载,项目介绍:http://www.cnblogs.com/bandy/p/3509482.html 2.现状 目前本人没有太多时间来维护和修改,希望有其他的朋友能够加入一起来把这个客户端做的更好. 3.代码地址 https://github.com/bandy101/cnblogs_iOS 4.重点模块流程图 5.项目预览 6.参与项目一起开发请加群:419250181

博客园里写blog可以添加自己的js文件

在博客园里写blog可以添加自己的js文件,这样就可以按照自己的要求在blog里实现一些自己想要的功能. 今天下午,度娘了很久,又看了一些大神的博客,debug了一下他们的代码,终于知道怎么添加js了,现在整理出来,帮助那些像我一样,想在博客上自己整整的朋友. 好废话不多说了直接上图. 进入自己的博客首页,点击[管理] 点击管理进入如下界面,点击[文件],如下图 做好这些准备工作以后,开始打开写随笔界面,添加js文件引用,如下图

Android类似于QQ账号登陆下拉框效果的实现(附源码)

效果图 部分源码 // 对popupWindow的设置 downArroImageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // 定义popupWindow popupWindow = new PopupWindow(MainActivity.this); // 设置宽度 popupWindow.setWidth(inputEditText.getWidth

pd的django个人博客教程----1:效果展示等

开发环境同to do list 1:首页:localhost/pd/ 2:导航栏测试或者生活点入: 测试:localhost/category/?cid=1 3:点击文章后进入文章显示页面 e.g:进入文章7:localhost/article/?id=7 4:右侧边栏文章分档界面; e.g:2015,10归档:localhost/archive/?year=2015&month=10 5:浏览排行与评论排行等只是点击跳转到相应文章页面就是了. 各个页面做了展示主要目的是列出对应的URL传递,好

JS无刷新修改URL类似博客园翻页效果

<script type="text/javascript"> function changeURL(){ var url = document.getElementById('url').value; window.history.pushState({},0,'http://'+window.location.host+'/'+url); } </script>

博客搬家算法伪码

已有平台:CSDN博客.51CTO.博客园.WordPress 不同平台的博客,数据解析方式不一样,数据抓取和存储都是类似的. 1.确定博客首页地址 a.平台地址 比如,CSDN的博客地址是 http://blog.csdn.net/ b.账号 fansunion CSDN某个用户的地址是:http://blog.csdn.net/FansUnion 2. 从首页获得关键信息 2.1获得博客分类列表 新人毕业-老人跳槽(24) OpenJDK源码研究笔记(16) 性能优化(11) 中国象棋(13

Alpha版本展示博客

团队成员简介: 周菲(队长):熟练掌握java和C语言,熟悉java数据库连接.JDBC和java桌面应用的开发,团队合作能力较强,责任心较强,做事认真细致,为人热情开朗. 博客地址:http://www.cnblogs.com/sugarfei/ 孔繁燕(队员):熟练掌握C++语言,了解Java语言,有良好的团队合作意识,为人认真诚恳. 博客地址:http://www.cnblogs.com/kfy-1104/ 团队源码仓库地址:https://coding.net/u/dhlg_201810

博客背景随着鼠标动的效果实现

在博客侧边栏公告中加上如下这段js: <!--- 导入js库 ---> <script src="//cdn.bootcss.com/canvas-nest.js/1.0.0/canvas-nest.min.js"> <canvas id="c_n4" width="860" height="958" style="position: fixed; top: 0px; left: 0px