运动线条特效-canvas

接下来分享一个特效

   <!DOCTYPE html>

<html lang="en">

<head>

  <TITLE> New Document </TITLE>

  <meta charset="utf-8">

  <style>

* {margin: 0; padding: 0;}

body {background: #17293a;}

canvas {display: block;}

  </style>

</HEAD>

<BODY>

<canvas></canvas>

<script>

(function() {

  'use strict';

  // Declare us some global vars

  var canvas, ctx, width, height, mouseParticles, followingParticles, mouse, numParticles, colors;

  // Generic Particle constructor

  function Particle(x, y, radius, color) {

    this.x = x;

    this.y = y;

    this.radius = radius;

    this.color = color;

    this.speed = 0.01 + Math.random() * 0.02;

    this.offset = -25 + Math.random() * 50;

    this.angle = Math.random() * 360;

    this.targetX = null;

    this.targetY = null;

    this.vx = null;

    this.vy = null;

    this.compositeOperation = 'source-over';

  }

  Particle.prototype = {

    constructor: Particle,

    draw: function(ctx) {

      ctx.save();

      ctx.globalCompositeOperation = 'lighter';

      ctx.fillStyle = this.color;

      ctx.translate(this.x, this.y);

      ctx.beginPath();

      ctx.arc(0, 0, this.radius, 0, Math.PI * 2, true);

      ctx.closePath();

      ctx.fill();

      ctx.restore();

    }

  }

  init(); // Start the program

  function init() {

    // Assign global vars accordingly

    canvas = document.querySelector('canvas');

    ctx = canvas.getContext('2d');

    width = canvas.width = window.innerWidth;

    height = canvas.height = window.innerHeight;

    // Get mouse positions

    mouse = getMousePos(canvas);

    // Two arrays to hold our rotating and 'following' particles

    mouseParticles = [];

    followingParticles = [];

    numParticles = 120;

    colors = ['#f1c40f', '#f39c12', '#e67e22', '#d35400', '#e74c3c', '#c0392b'];

    // Generate particles to rotate our mouse

    generateParticles(mouseParticles, numParticles, 0, 0);

    // Generate particles, which follow the mouse particles

    generateParticles(followingParticles, numParticles, Math.random() * width, Math.random() * height);

    drawFrame();

  }

  // Generic function for generating particles

  function generateParticles(particlesArray, count, x, y) {

    var i, particle;

    for (i = 0; i < count; i++) {

      if (particlesArray === followingParticles) {

        particle = new Particle(x, y, 3, colors[Math.floor(Math.random() * colors.length)]);

      } else {

        particle = new Particle(x, y, 3);

      }

      particlesArray.push(particle);

    }

  }

  function drawFrame() {

    // Update & Redraw the entire screen on each frame

    window.requestAnimationFrame(drawFrame, canvas);

    ctx.fillStyle = 'rgba(23, 41, 58, 0.12)';

    ctx.fillRect(0, 0, width, height);

    mouseParticles.forEach(rotateParticle);

    followingParticles.forEach(updateParticle)

  }

  // Update each of our following particles to follow the corresponding rotating one

  function updateParticle(particle, index) {

    var rotParticle, speed, gravity,

        dx, dy, dist;

    rotParticle = mouseParticles[index];

    speed = 0.0045;

    gravity = 0.8;

    particle.targetX = rotParticle.x;

    particle.targetY = rotParticle.y;

    dx = particle.targetX - particle.x;

    dy = particle.targetY - particle.y;

    dist = Math.sqrt(dx * dx + dy * dy);

    if (dist < 50) {

      particle.targetX = rotParticle.x;

      particle.targetY = rotParticle.y;

    } else {

      particle.targetX = mouseParticles[Math.round(index / 2)];

      particle.targetX = mouseParticles[Math.round(index / 2)];

    }

    particle.vx += dx * speed;

    particle.vy += dy * speed;

    particle.vx *= gravity;

    particle.vy *= gravity;

    particle.x += particle.vx;

    particle.y += particle.vy;

    particle.draw(ctx);

  }

  // Rotate our particles around the mouse one by one

  function rotateParticle(particle)  {

    var vr, radius, centerX, centerY;

    vr = 0.1;

    radius = width / 10;

    centerX = mouse.x;

    centerY = mouse.y;

    // Rotate the particles

    particle.x = centerX + particle.offset + Math.cos(particle.angle) * radius;

    particle.y = centerY + particle.offset + Math.sin(particle.angle) * radius;

    particle.angle += particle.speed;

    // Reposition a particle if it goes out of screen

    if (particle.x - particle.radius / 2 <= -radius / 2) {

      particle.x = 5;

    } else if (particle.x + particle.radius / 2 >= width - radius / 2) {

      particle.x = width - 5;

    } else if (particle.y - particle.radius / 2 <= -radius / 2) {

      particle.y = 5;

    } else if (particle.y + particle.radius / 2 >= height - radius / 2) {

      particle.y = height - 5;

    }

    //particle.draw(ctx);

  }

  // Util function for getting the mouse coordinates

  function getMousePos(element) {

    var mouse = {x: width / 2, y: height / 2};

    element.addEventListener('mousemove', function(e) {

      mouse.x = e.pageX;

      mouse.y = e.pageY;

    }, false);

    return mouse;

  }

}());

</script>

</BODY>

</HTML>


它是随着鼠标的移动,线条会移动,大家快去试试吧

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,661评论 2 32
  • 上网搜索了angularjs裁剪,发现只有正方形和圆形 http://www.cnblogs.com/smilec...
    四脚蛇阅读 722评论 0 1
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,027评论 0 2
  • 之前的一个阶段公司一直在做大屏的项目,所以我也一直在研究数据可视化的设计,当我阅读《数据可视化》时,看到了如下的一...
    pazzamanu阅读 2,916评论 0 2
  • 回首童年,难以抹掉的一道温暖色是各种各样的故事。春节来临,妈妈会娓娓道来关于传说中的“妖怪——年”的由来,家里同时...
    swam阅读 786评论 0 8