隨機線條特效

来源:https://www.cnblogs.com/hatsuyuki/archive/2018/04/27/8963982.html
-Advertisement-
Play Games

還記得是去年的時候,查資料時偶然點進了一位名叫馬開東的大佬的博客,不禁為他的博客特效所吸引。正好當時在找模板,於是想著在註冊、登陸頁面用上這種特效。先是查看了一下網頁源碼把所有js,css鏈接點了一遍,弄下來試了一遍發現沒有用後,於是加了博客旁的一個qq群,但問了一下沒人理我,於是一氣之下退了群,關 ...


  還記得是去年的時候,查資料時偶然點進了一位名叫馬開東的大佬的博客,不禁為他的博客特效所吸引。正好當時在找模板,於是想著在註冊、登陸頁面用上這種特效。先是查看了一下網頁源碼把所有js,css鏈接點了一遍,弄下來試了一遍發現沒有用後,於是加了博客旁的一個qq群,但問了一下沒人理我,於是一氣之下退了群,關於特效的事也不了了之。

  後來在今年3月份偶然的一次機會,發現還有其他人也用了這個特效,而且還分享了出來。。。。那位大佬的鏈接我已經忘了,看了這篇文章可以告訴我,我補鏈接。

  說了這麼多話,現在進入正題:

  先看看效果

  就是這樣,只需要引入外網中的js即可:

  <script src="http://open.sojson.com/common/js/canvas-nest.min.js" count="500" zindex="-2" opacity="0.5" color="47,135,193" type="text/javascript">
View Code

  count是線條數量,zindex設置堆疊,opacity就是線條透明度

  下麵是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), //層級
            o: get_attribute(script, "opacity", 0.5), //透明度
            c: get_attribute(script, "color", "0,0,0"), //線條顏色,最好使用RGB顏色
            n: get_attribute(script, "count", 99) //線條數量
        };
    }
    //設置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 all_array = [current_point].concat(random_lines);
        var e, i, d, x_dist, y_dist, dist; //臨時節點
        //遍歷處理每一個點
        random_lines.forEach(function(r) {
            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 = 0; i < all_array.length; i++) {
                e = all_array[i];
                //不是當前點
                if (r !== e && 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());
                }
            }
            all_array.splice(all_array.indexOf(r), 1);

        }), 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
        };
    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_lines = [], i = 0; config.n > i; i++) {
        var x = random() * canvas_width, //隨機位置
            y = random() * canvas_height,
            xa = 2 * random() - 1, //隨機運動方向
            ya = 2 * random() - 1;
        random_lines.push({
            x: x,
            y: y,
            xa: xa,
            ya: ya,
            max: 6000 //沾附距離
        });
    }
    //0.1秒後繪製
    setTimeout(function() {
        draw_canvas();
    }, 100);
}();
View Code

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先,需要打開手機的USB調試和微信的TBS 調試。然後,打開chrome://inspect,點擊Inspect。此時,如果沒有Fan牆或使用離線開發者工具包,會出現空白頁面: 解決方法: Fan牆或使用離線開發者工具包後,還是會出現左側空白,簡單修改css樣式激活一下就可以了,如下動圖演示: 微 ...
  • 一、項目介紹 【知識準備】 ①Android Interface definition language(aidl,android介面定義語言),其目的實現跨進程的調用。進程是程式在os中執行的載體,一個程式對應一個進程,不同進程就是指不同程式,aidl實現不同程式之間的調用。 ②主線程與子線程通信 ...
  • 做安卓開發時一定要註意,主線程不能更改UI界面,如果出現程式運行時崩潰的情況,如果沒有明顯的語法錯誤,請檢查自己的進程是否出現衝突,崩潰。如果有與後臺的連接,即請求向伺服器發送請求的時尤其需要註意,或出現沒有報錯,但就是網路請求這段代碼不會執行,這種情況下,如果設置的參數或者其他地方沒有什麼問題,但 ...
  • 前言: ​ 這是每天看github上面的一位大佬 "冴羽" [的博客 自己加以自己的理解總結的 是指程式源碼中定義變數的區域 作用域決定瞭如何查找變數,也就是度額定當前執行代碼對變數的訪問許可權 JavaScript 使用的是 (lexical scoping) 也就是靜態作用域 靜態作用域與動態作用 ...
  • 先上效果預覽: Web Components 首先,什麼是 Web Components ? "MDN" 給出的定義是: Web Components 是一套不同的技術,允許您創建可重用的定製元素(它們的功能封裝在您的代碼之外)並且在您的web應用中使用它們。 ... ... 實現web compo ...
  • 今天在寫html5中播放曠視C2攝像頭視頻監控的功能,查了很多資料,才發現Html5 <video>並不支持rtsp協議。後來查到使用第三方轉碼才得以實現。 這裡把方法寫下來分享給大家。 首先要獲取攝像機品牌的RTSP地址: 如大華的是 rtsp://user:pwd@ip:port/cam/ re ...
  • 前言 之前用餓了麽印象最深刻的是聯動菜單和小球飛入購物車動畫,所以想看看別人是怎麼實現的,但是看了很多仿餓了麽的demo都是實現了一個完整的大的項目,要找到那個小模塊很麻煩,所以自己將聯動菜單和動畫提取出來寫了一個demo,方便學習。 目的只是想突出功能所以界面細節很relax,大家也relax的看 ...
  • 測試jQuery模板 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>jQuery Ajax</title> <!-- 引用線上jQuery文件 --> <script src="https://code.j ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...