中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用canvas實現知乎登錄頁的案例

發布時間:2020-10-24 17:21:17 來源:億速云 閱讀:367 作者:小新 欄目:web開發

小編給大家分享一下利用canvas實現知乎登錄頁的案例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

前言

打開知乎的登錄頁,就可以看到其背景有一個動效,看起來好像蠻不錯的樣子:

利用canvas實現知乎登錄頁的案例

這個效果使用canvas是不難實現的,接下來就一步一步地講解并實現這個效果。

分析

在動工之前先分析這個效果到底是如何運動的。首先要理解的是雖然看起來好像所有線和圓都在運動,但實際上只有圓才是在運動的,而線只不過是把滿足一定條件的任意兩個圓連接在一起。那么接下來就分析圓是怎么運動的,從效果看,每個圓都是在做勻速直線運動,而且運動方向不一,通過物理相關知識可以得知,每一個圓在水平方向和垂直方向都有一個速度。最后是當圓運動出畫布任一邊界的時候,這個圓會從出邊界的這條邊的對邊再次進入畫布。把這三個關鍵點理解清楚了就清晰很多了。

實踐

先創建一個canvas畫布:

// 這里就簡單地設置下背景色
<body style="background:#f7fafc;">
 <canvas id="canvas" style="width: 100%; height: 100%;"></canvas>
</body>

接著先獲取canvas的上下文環境并設置一些共用的屬性

var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");

canvas.width = document.documentElement.clientWidth;
canvas.height = document.documentElement.clientHeight;

context.fillStyle = "rgba(0, 0, 0, 0.08)";
context.strokeStyle = "rgba(0, 0, 0, 0.05)";
context.lineWidth = 0.5;

接下來繪制圓,那么繪制圓需要圓的圓心坐標,半徑,水平方向的速度,垂直方向的速度,并且這些信息要滿足一定的條件,通過一個函數來創建:

// 存放所有圓的數組,這里用balls
var balls = [];
function createBall() {
 // x坐標
 var _x = Math.random() * canvas.width;
 // y坐標
 var _y = Math.random() * canvas.height;
 // 半徑 [0.01, 15.01]
 var _r = Math.random() * 15 + 0.01;
 // 水平速度 [±0.0, ±0.5]
 var _vx = Math.random() * 0.5 * Math.pow( -1, Math.floor(Math.random() * 2 + 1) );
 // 垂直速度 [±0.0, ±0.5]
 var _vy = Math.random() * 0.5 * Math.pow( -1, Math.floor(Math.random() * 2 + 1) );
 // 把每一個圓的信息存放到數組中
 balls.push({
 x: _x,
 y: _y,
 r: _r,
 vx: _vx,
 vy: _vy
 });
}

然后根據自己的情況選擇需要繪制多少個圓,這里我假設有20個,看起來舒服一點:

// 圓的數量
var num = 20;
for(var i = 0; i < num; i++) {
 createBall();
}

現在圓的信息都有了,下一步就是繪制每一幀的圓和線,創建一個render函數,然后在函數內先繪制所有的圓出來:

for(var k = 0; k < num; k++) {
 context.save();
 context.beginPath();
 context.arc( balls[k].x, balls[k].y, balls[k].r, 0, Math.PI*2 );
 context.fill();
 context.restore();
}

接著要遍歷每兩個圓的圓心之間的距離是否小于某個臨界值(比如500),滿足則將這兩個圓的圓心連接起來:

for(var i = 0; i < num; i++) {
 for(var j = i + 1; j < num; j++) {
 if( distance( balls[i], balls[j] ) < 500 ) {
  context.beginPath();
  context.moveTo( balls[i].x, balls[i].y );
  context.lineTo( balls[j].x, balls[j].y );
  context.stroke();
 }
 }
}

這里的 distance 函數就是計算兩點之間的距離:

function distance(point1, point2) {
 return Math.sqrt( Math.pow( (point1.x - point2.x), 2 ) + Math.pow( (point1.y - point2.y), 2 ) );
}

還有一步就是判斷圓是否超出了邊界值,若滿足條件則從對邊再次進來:

for(var k = 0; k < num; k++) {
 balls[k].x += balls[k].vx;
 balls[k].y += balls[k].vy;

 if( balls[k].x - balls[k].r > canvas.width ) {
 balls[k].x = 0 - balls[k].r;
 }
 if( balls[k].x + balls[k].r < 0 ) {
 balls[k].x = canvas.width + balls[k].r;
 }
 if( balls[k].y - balls[k].r > canvas.height ) {
 balls[k].y = 0 - balls[k].r;
 }
 if( balls[k].y + balls[k].r < 0 ) {
 balls[k].y = canvas.height + balls[k].r;
 }
}

當然如果想簡單點,只要圓超出就移除并重新生成一個圓即可:

if( balls[k].x - balls[k].r > canvas.width || 
 balls[k].x + balls[k].r < 0 || 
 balls[k].y - balls[k].r > canvas.height || 
 balls[k].y + balls[k].r < 0) {
 balls.splice(k, 1);
 createBall();
}

這樣每一幀繪制的細節就完成了,最后一步就是讓圓都運動起來:

(function loop(){
 render();
 requestAnimationFrame(loop);
})();

以上是利用canvas實現知乎登錄頁的案例的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

襄汾县| 二连浩特市| 苍山县| 江阴市| 巩义市| 成武县| 泉州市| 且末县| 扶绥县| 文水县| 正阳县| 佛学| 天长市| 汾西县| 定南县| 乳源| 普陀区| 东源县| 普定县| 富蕴县| 呼图壁县| 临城县| 抚松县| 汉川市| 黔江区| 湄潭县| 耒阳市| 尤溪县| 呼玛县| 宁武县| 阿瓦提县| 商洛市| 海丰县| 嘉禾县| 土默特右旗| 西乌珠穆沁旗| 武宣县| 阿尔山市| 广河县| 遂宁市| 泊头市|