JavaScript

语言:

JaveScriptBabelCoffeeScript

确定

var fsCanvas = document.getElementById("canvas"),

ctx;

var glitchImageData,

originalImageData,

pixels;

var patternWidth = 96,

patternHeight = 96,

patternCanvas,

patternContext,

pattern;

var cosCache0 = [],

cosCache1 = [];

// these control glitching, and are in turn controlled by TweenMax

var gvars = {

waveAmp0:0,

waveFrq0:4,

waveOfs0:0,

waveAmp1:0,

waveFrq1:4,

waveOfs1:0,

pos0:0,

pos1:0

};

window.onload = function() {

createPatternImage();

initFullScreenCanvas();

createImageData();

processImageData();

setupTweens();

requestAnimationFrame(loop);

};

function createPatternImage() {

var canvas = document.createElement('canvas'),

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

canvas.width = patternWidth;

canvas.height = patternHeight;

c.fillStyle = '#000';

c.fillRect(0, 0, patternWidth, patternHeight);

c.fillStyle = '#fff';

c.beginPath();

c.arc(patternWidth * 0.5, patternHeight * 0.5, patternHeight * 0.25, 0, Math.PI * 2);

c.fill();

// c.fillRect(32, 32, patternWidth - 64, patternHeight - 64);

patternCanvas = canvas;

patternContext = c;

}

function initFullScreenCanvas() {

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

}

function createImageData() {

originalImageData = patternContext.getImageData(0, 0, patternWidth, patternHeight);

glitchImageData = patternContext.getImageData(0, 0, patternWidth, patternHeight);

}

function processImageData() {

var data = originalImageData.data,

pixelCount = data.length / 4,

pixelIndex = 0,

x, y;

pixels = [];

for (var i = 0; i < pixelCount; i++) {

pixelIndex = i * 4;

x = i % patternWidth;

y = Math.floor(i / patternHeight);

if (!pixels[y]) pixels[y] = [];

pixels[y][x] = [

data[pixelIndex + 0],

data[pixelIndex + 1],

data[pixelIndex + 2]

];

}

}

function setupTweens() {

var ts = 1; // for testing

var tl0 = new TimelineMax({repeat:-1, yoyo:true});

tl0.to(gvars, 2, {waveAmp0:4, waveFrq0:12, waveOfs0:32, ease:Cubic.easeInOut, delay:0.25});

tl0.timeScale(ts);

var tl1 = new TimelineMax({repeat:-1, yoyo:true});

tl1.to(gvars, 2.5, {waveAmp1:6, waveFrq1:8, waveOfs1:16, ease:Cubic.easeInOut, delay:0.25});

tl1.timeScale(ts);

var tl2 = new TimelineMax({repeat:-1, yoyo:true});

tl2.to(gvars, 3, {pos0:196, ease:Cubic.easeInOut, delay:0});

tl2.timeScale(ts);

var tl3 = new TimelineMax({repeat:-1, yoyo:true});

tl3.to(gvars, 3, {pos1:-196, ease:Expo.easeInOut, delay:0.5});

tl3.timeScale(ts);

}

function update() {

var data = glitchImageData.data,

row,

pixelIndex = 0;

var fx, fy;

var rx, ry,

gx, gy,

bx, by;

var wave0Sin,

wave1Sin,

wave0Cos,

wave1Cos,

pos0,

pos1;

cosCache0.length = 0;

cosCache1.length = 0;

for (var y = 0; y < patternHeight; y++) {

row = pixels[y];

fy = y / patternHeight;

wave0Sin = Math.sin(gvars.waveOfs0 + gvars.waveFrq0 * fy) * gvars.waveAmp0;

wave1Sin = Math.sin(gvars.waveOfs1 + gvars.waveFrq1) * gvars.waveAmp1;

pos0 = gvars.pos0;

pos1 = gvars.pos1;

for (var x = 0; x < patternWidth; x++) {

pixelIndex = (y * patternWidth + x) * 4;

fx = x / patternWidth;

if (cosCache0[x] === undefined) {

cosCache0[x] = wave0Cos = Math.cos(gvars.waveOfs0 + gvars.waveFrq0 * fx) * gvars.waveAmp0;

}

else {

wave0Cos = cosCache0[x];

}

if (cosCache1[x] === undefined) {

cosCache1[x] = wave1Cos = Math.cos(gvars.waveOfs1 + gvars.waveFrq1) * gvars.waveAmp1;

}

else {

wave1Cos = cosCache1[x];

}

rx = x + wave0Sin * wave1Sin + pos0;

ry = y + wave1Cos;

gx = x + wave0Cos;

gy = y + wave1Sin * wave0Cos + pos1;

bx = x - wave1Cos * wave0Sin - pos0;

by = y + wave0Cos;

data[pixelIndex + 0] = getChannel(rx, ry, 0);

data[pixelIndex + 1] = getChannel(gx, gy, 1);

data[pixelIndex + 2] = getChannel(bx, by, 2);

}

}

}

var screenScale = 1;

function draw() {

patternContext.putImageData(glitchImageData, 0, 0);

pattern = ctx.createPattern(patternCanvas, 'repeat');

var w = window.innerWidth,

h = window.innerHeight;

// resizing the canvas also clears the context

if (w !== fsCanvas.width || h !== fsCanvas.height) {

screenScale = w / (Math.ceil(w / patternWidth) * patternWidth);

fsCanvas.width = w;

fsCanvas.height = h;

}

else {

ctx.clearRect(0, 0, w, h);

}

ctx.save();

ctx.scale(screenScale, screenScale);

ctx.fillStyle = pattern;

ctx.fillRect(0, 0, w * (1/screenScale), h * (1/screenScale));

ctx.restore();

}

function loop() {

update();

draw();

requestAnimationFrame(loop);

}

function getChannel(x, y, c) {

function wrap(v, min, max) {

return (((v - min) % (max - min)) + (max - min)) % (max - min) + min;

}

x = wrap(x, 0, patternWidth - 1) | 0;

y = wrap(y, 0, patternHeight - 1) | 0;

return pixels[y][x][c];

}

HTML5求自动在闪,HTML5 重复而不停闪烁的团状物相关推荐

  1. html5幻灯片 自动滑动,基于HTML5功能强大的滑块幻灯片

    分享一款功能强大的HTML5滑块幻灯片.这是一款基于jQuery+HTML5实现的图片切换幻灯片代码.效果图如下: 实现的代码. html代码: Breaking Bad American crime ...

  2. beats x白灯一直闪_beatsx白灯不停闪烁怎么回事

    beatsx白灯不停闪烁是很多小伙伴们在使用的时候遇到的问题,在遇到这个问题的时候不少小伙伴们不清楚怎么回事,想要知道解决办法的小伙伴们,就让小编给大家详细的讲讲吧. beatsx白灯不停闪烁怎么回事 ...

  3. 我的CSDN笔记总索引(阅读量降序,代码自动遍历生成HTML5源码)

    Python代码用"命令容器"方法os.system(),调用Linux命令行工具crul获取CSDN博文页面源码,Python内置re正则解析出博文笔记信息,按阅读量降序模块输出 ...

  4. html5表单属性自动获得焦点,HTML5里autofocus属性

    转载:http://www.webhek.com/html5-autofocus/ HTML5给我们带来了一大堆神奇的东西.以前需要用JavaScript和Flash完成的任务,例如表单校验,INPU ...

  5. discuz自动添加兼容html5标签的音乐播放器

    关于在discuz中mp3附件自动添加Windows Media播放器插件的方法的文章网上有很多,只要修改./templates/default/discuzcode.htm文件就可以了,但是毕竟不是 ...

  6. html5交互效果,浅谈HTML5 CSS3的新交互特性

    本文标题的这副图片,是用Phosotshop制作的.但是,在搜索引擎中你却无法搜索到它,搜索引擎还没有强大到能够识别图片里面的文字.并且由于图片的体积不算太小,可能网速慢的网友在浏览的时候不得不耐心的 ...

  7. html5通过api调数据库,使用HTML5数据库API [关闭](Using HTML5 Database API [closed])

    使用HTML5数据库API [关闭](Using HTML5 Database API [closed]) 我正在开发一个使用phonegap/cordova 2.2的web应用程序,并希望将数据存储 ...

  8. HTML5新增视频标签(HTML5)

    HTML5新增视频标签(HTML5) <!DOCTYPE html> <html lang="en"><head><meta charse ...

  9. html5脑图_使用HTML5技术绘制思维导图

    客户常常提到思维导图,喜欢它的结构展示方式,和交互的友好,从图论的角度看,思维导图本质上是一种树,有一个根节点(主题)出发,联想到其他话题,于是分支开花,再分支,有时候也会构成网络结构,由子分支联想到 ...

  10. HTML5简明教程系列之HTML5 表格与表单(二)

    HTML的第二弹也来了,最近高产似母猪,状态也不错,代码来源为实验课.本期主要内容为:HTML表格与DIV应用.HTML表单.上期基础部分的传送门: HTML5简明教程系列之HTML5基础(一)_Th ...

最新文章

  1. Docker的安装、镜像源更换与简单应用
  2. Go 学习笔记(56)— Go 第三方库 sqlx (操作数据库)
  3. Linux学习4之常用命令--文件搜索命令
  4. 一卡通变“一脸通” 人脸识别更新校园考勤方式
  5. YUI Grid CSS的优雅设计(转)
  6. 程序员面试金典 - 面试题 08.07. 无重复字符串的排列组合(回溯)
  7. pyqt安装_Win10下安装LabelImg以及使用(绝对是全网最简单的教程)
  8. KNN(一)--简单KNN原理及实现
  9. 利用HTML5开发Android笔记(中篇)
  10. oracle建表创建约束
  11. C64x+ CPU中断 .
  12. 连接宽带提示服务器无响应,宽带拨号上网服务器无响应是怎么回事
  13. 小觅双目+IMU联合标定
  14. python 232串口通信
  15. 你全记住了 ,你就是老中医
  16. Unity2017 经典游戏开发教程 算法分析与实现 (张帆 著)
  17. 《神经质人格》摘录(第十二章)
  18. 大屏可视化低代码开发平台网址
  19. oracle如何恢复表中删除的数据?
  20. fiddle android

热门文章

  1. 【优化调度】基于matlab一致性算法求解电力系统分布式经济调度优化问题【含Matlab源码 770期】
  2. mysql 主从_mysql主从复制异常中断分析处理
  3. 图片超大 html,解决WebView加载html文本时,图片太大不能适配屏幕
  4. ubuntu 设置静态路由_Linux route 配置静态路由(转载)
  5. 最大连续子数组和 动态规划_53. 最大子序和(动态规划)
  6. java path combine_Path.Combine (合并两个路径字符串)方法的一些使用细节
  7. ubuntu终端命令停止_解决Linux关闭终端(关闭SSH等)后运行的程序或者服务自动停止【后台运行程序】...
  8. 土木工程与计算机专业考研学校排名,2017年土木工程专业考研大学排名
  9. sqlmap自动扫描注入点_SQLMAP使用指南[学员作品]
  10. 实现Servlet接口来开发Servlet程序