效果演示:

代码目录:

主要代码实现:

HTML代码 :

<!doctype html>
<html><head><meta charset="utf-8"><title>彩带特效</title></head><body><script id="fs" type="x-shader/x-fragment">precision mediump float; uniform float time; uniform vec2 mouse; uniform vec2 resolution; // window ratio float ratio = resolution.x / resolution.y; float PI = 3.1415926; float line(vec2 p, float pct, float i) { return smoothstep(pct - sin(time / i) *0.06, pct, p.y) - smoothstep(pct, pct + sin(time / i) * 0.06, p.y); } vec2 rotate2d(vec2 p, float angle) { p = mat2(cos(angle), -sin(angle), sin(angle), cos(angle)) * p; return p; } void main(void) { // center center vec2 p = vec2(gl_FragCoord.xy* 2.0 - resolution) / min(resolution.x, resolution.y); // left bottom //vec2 p = gl_FragCoord.xy / resolution.xy; float l = length(p); vec3 c = vec3(0.0); vec3 d = vec3(l, 1.0 - p.x, 1.0 - p.y); for (float i = 1.0; i<=3 6.0; i++) { p=rotate2d(p, i * 10.0); float s=t ime / i; float y=s in(p.x + s) * 0.4 * l; float pct=l ine(p, y, i); c +=p ct; } gl_FragColor=v ec4(c * d, 1.0); } </script><script id="vs" type="x-shader/x-vertex">attribute vec3 position; void main(void){ gl_Position = vec4(position, 1.0); }</script><script>// variable for globallet c, // canvascw, ch, // window sizemx, my, // mousegl, // contextuniLocation, // for shaderrun, // not usedeCheck, // not usedstartTime, time, tempTime; // times/*** Make canvas*/const createCanvas = () => {const b = document.getElementsByTagName('body')[0];const c = document.createElement('canvas');c.setAttribute('id', 'canvas');c.style.position = 'fixed';c.style.display = 'block';c.style.zIndex = '-1';c.style.top = '0';c.style.left = '0';c.style.width = '100%';c.style.height = '100%';c.style.background = 'black';b.appendChild(c);};/*** Check event* @params {Object} e - check event*/const checkChange = e => {run = e.currentTarget.checked;if (run) {startTime = new Date().getTime();render();} else {tempTime += time;}};/*** Mouse event* @params {Object} e - mouse event*/const mouseMove = e => {mx = e.clientX / cw;my = e.clientY / ch;};/*** Resize window*/const resizeWindow = () => {cw = c.width = window.innerWidth;ch = c.height = window.innerHeight;init();};/*** Rendering function*/const render = () => {// run?if (!run) return;// timetime = (new Date().getTime() - startTime) * 0.001;// clear colorgl.clear(gl.COLOR_BUFFER_BIT);// uniformsgl.uniform1f(uniLocation[0], time);gl.uniform2fv(uniLocation[1], [mx, my]);gl.uniform2fv(uniLocation[2], [cw, ch]);// drawgl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);gl.flush();// recurrequestAnimationFrame(render);};/*** Create shader* @params {String} id - element id* @return {Object} shader - shader object*/const create_shader = id => {let shader;// get reference tagconst scriptElement = document.getElementById(id);// if not exsist returnif (!scriptElement) return;// check script attributeswitch (scriptElement.type) {// vertex shadercase 'x-shader/x-vertex':shader = gl.createShader(gl.VERTEX_SHADER);break;// fragment shadercase 'x-shader/x-fragment':shader = gl.createShader(gl.FRAGMENT_SHADER);break;default:return;}// assign source to shadergl.shaderSource(shader, scriptElement.text);// compile shadergl.compileShader(shader);// check shader was compiled?if (gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {return shader;} else {console.log(gl.getShaderInfoLog(shader));}};/*** Create program object and link shader function* @param {String} vs - element name* @param {String} fs - element name* @return {object} program - return program object*/const create_program = (vs, fs) => {let program;// create program objectprogram = gl.createProgram();// attach shader program objectgl.attachShader(program, vs);gl.attachShader(program, fs);// link shadergl.linkProgram(program);// check shader linkif (gl.getProgramParameter(program, gl.LINK_STATUS)) {// if success enable programgl.useProgram(program);return program;} else {return null;}};/*** Create vbo function* @param {Array} - Array in position* @return {Object} - vertex buffer object */const create_vbo = data => {//create buffer objectconst vbo = gl.createBuffer();// bind buffergl.bindBuffer(gl.ARRAY_BUFFER, vbo);// set data to buffergl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW);// invalidata buffergl.bindBuffer(gl.ARRAY_BUFFER, null);return vbo;};/*** Create index buffer object function* @param {Array} data - Array in index* @return {Object} ibo - index buffer object*/const create_ibo = data => {// create buffer objectconst ibo = gl.createBuffer();// bind buffergl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo);// set data to buffergl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Int16Array(data), gl.STATIC_DRAW);// invalidate buffergl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);return ibo;};/*** Init canvas*/const init = () => {time = 0.0;tempTime = 0.0;uniLocation = new Array();// get elementc = document.getElementById('canvas');//eCheck = document.getElementById('check');// canvas sizecw = c.width = window.innerWidth;ch = c.height = window.innerHeight;// get webgl contextgl = c.getContext('webgl') || c.getContext('experimental-webgl');// set viewportgl.viewport(0, 0, cw, ch);// init shaderconst prg = create_program(create_shader('vs'), create_shader('fs'));run = prg != null;if (!run) {eCheck.checked = false;}uniLocation[0] = gl.getUniformLocation(prg, 'time');uniLocation[1] = gl.getUniformLocation(prg, 'mouse');uniLocation[2] = gl.getUniformLocation(prg, 'resolution');// init vertexconst position = [-1.0, 1.0, 0.0,1.0, 1.0, 0.0, -1.0, -1.0, 0.0,1.0, -1.0, 0.0];const index = [0, 2, 1,1, 2, 3];const vPosition = create_vbo(position);const vIndex = create_ibo(index);const vAttLocation = gl.getAttribLocation(prg, 'position');gl.bindBuffer(gl.ARRAY_BUFFER, vPosition);gl.enableVertexAttribArray(vAttLocation);gl.vertexAttribPointer(vAttLocation, 3, gl.FLOAT, false, 0, 0);gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, vIndex);// etc initgl.clearColor(0.0, 0.0, 0.0, 1.0);mx = 0.5;my = 0.5;startTime = new Date().getTime();};window.addEventListener('load', () => {createCanvas();init();render();// eventc.addEventListener('mousemove', mouseMove, false);//eCheck.addEventListener('change', checkChange, false);window.addEventListener('resize', resizeWindow, false);}, false);</script></body></html>

源码获取

查看博主主页或私信博主获取

精彩推荐更新中:

HTML5大作业实战100套

打卡 文章 更新 40  /  100天

大家可以点赞、收藏、关注、评论我啦 、需要完整文件随时联系我或交流哟~!

HTML+CSS+JS实现 ❤️彩色3D线条动画特效❤️相关推荐

  1. php 3d animation,基于three.js的酷炫Canvas 3D线条动画特效

    [温馨提示]源码包解压密码:www.youhutong.com 效果图: 描述说明: html5-canvas-animation是一款基于three.js的HTML5 canvas 3D线条动画特效 ...

  2. 短视频带货系统,HTML+CSS+JS实现宇宙星球旋转动画特效

    短视频带货系统,HTML+CSS+JS实现宇宙星球旋转动画特效 主要代码实现: css样式: /*** @date 2021/1/20 16:10*//* 取消默认间距 */* {margin: 0; ...

  3. HTML+CSS+JS实现 ❤️canvas 3D云动画效果❤️

  4. HTML+CSS+JS实现 ❤️ 宇宙星球旋转动画特效❤️

    代码目录: 主要代码实现: css样式: /*** @date 2021/1/20 16:10*//* 取消默认间距 */* {margin: 0;padding: 0; }a {text-decor ...

  5. HTML+CSS+JS实现 ❤️六边形圆柱弹性动画特效❤️

    效果演示:   代码目录: 主要代码实现: 部分CSS样式: :root {--w: 8vmin;/*** change width ***/--h: 15vmin;/*** change heigh ...

  6. HTML+CSS+JS实现 ❤️发光糖果泡泡动画特效❤️

  7. HTML+CSS+JS实现 ❤️等离子球体ui动画特效❤️

  8. HTML+CSS+JS实现 ❤️飞行人物图标动画特效❤️

  9. Canvas炫酷3D线条动画背景

    下载地址 Canvas炫酷3D线条动画背景,可以变色的颜色渐变网页动态背景特效. dd:

最新文章

  1. 执行前端测试的必要性
  2. python三层装饰器-2020 python学习第十六天————三层装饰器与迭代器
  3. 如何使用Dirsearch探测Web目录
  4. join和countDownLatch原理及区别详解
  5. List与逗号分隔的字符串相互转换
  6. c语言结构体中整形数组初始化,c – 将{0,0}在结构体中初始化数组?
  7. 面试官:Netty的线程模型可不是Reactor这么简单
  8. Java基础-final关键字
  9. 微信公众号H5开发——JSSDK调用微信接口
  10. java 任务定时调度(定时器)
  11. 上课笔记-机器学习(5)-美国人口普查数据进行收入预测分类
  12. s7五杀大数据英雄_S7入围赛战报:首个五杀!LYN击败GMB
  13. 设计要用计算机吗,作为设计师 你需要这样的笔记本电脑
  14. hackinglab.cn脚本关之三
  15. 985毕业,沪漂10年,月薪4w,我却活得一地鸡毛
  16. PP模块工艺路线明细BAPI
  17. 德国4-0葡萄牙 穆勒帽子戏法佩佩染红
  18. Windows 11 系统下载,正式版尚未发布
  19. 富友eERP打造服装企业电子商务快鱼时代
  20. Debug: Minkowski undefined symbol; Tensorboard has no attribute ‘version‘

热门文章

  1. EntityFramework进阶——事务
  2. C#中 out、ref、params 修饰符使用方法
  3. ES建立索引步骤, 1,index 2.mapping 3,别名
  4. layui表单的ajax联动,layui的select联动实现代码
  5. java js websocket_js+java websocket记录
  6. 如何在命令中授权给MySQL_MySQL如何使用授权命令grant
  7. pointnet分割自己的点云数据_细嚼慢咽读论文:PointNet论文及代码详细解析
  8. 计算机人文研究生专业,西安科技大学,艺术、人文、材料、计算机、通信等专业调剂信息...
  9. layui轮播图切换会有跳动_Layui中轮播图切换函数说明
  10. matlab非同秩矩阵相乘_线性代数精华——讲透矩阵的初等变换与矩阵的秩