webgl实现48种canvas炫酷shader可全屏动画效果代码
代码语言:html
所属分类:动画
代码描述:webgl实现48种canvas炫酷shader可全屏动画效果代码,点击可全屏最大化播放动画,基于webgl实现的canvas动画,可作为背景或屏保。
代码标签: webgl canvas 炫酷 shader 全屏 动画
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> ::-webkit-scrollbar { width: 0.625rem; height: 0.625rem; } ::-webkit-scrollbar-thumb { background: #111; border-radius: 0.3125rem; box-shadow: inset 0.125rem 0.125rem 0.125rem rgba(255, 255, 255, 0.25), inset -0.125rem -0.125rem 0.125rem rgba(0, 0, 0, 0.25); } ::-webkit-scrollbar-track { background: #333; } body { margin: 0; display: grid; align-items: center; justify-content: center; background: #000; overflow-x: hidden; } canvas { position: absolute; inset: 0; width: 100vw; height: auto; object-fit: contain; z-index: -1; } body > * { grid-column: 1/-1; grid-row: 1/-1; } body:has(.fullscreen) { cursor: zoom-out; } #titles { display: flex; flex-wrap: wrap; justify-content: center; gap: 1em; padding: 1em 1em; } .card { position: relative; width: 150px; aspect-ratio: 1; border-radius: 1px; box-shadow: 0 0 1px 1px #fff9; font: 16px/1.5 system-ui; } .card::before { content: ""; position: absolute; inset: 0; border-radius: inherit; } .card::after { content: attr(data-title); display: grid; place-content: center; text-align: center; color: #fff; position: absolute; inset: 0; border-radius: inherit; filter: drop-shadow(-1px 0 2px #0008); -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px); opacity: 0; } .card:hover:not(.fullscreen) { cursor: zoom-in; } .card:hover:not(.fullscreen)::after { opacity: 1; transition: opacity 200ms ease-in 200ms; } .card.fullscreen { position: absolute; inset: 0; width: 100vw; height: 100lvh; transition: all 200ms ease-out; } #titles:has(.fullscreen) .card:not(.fullscreen) { position: absolute; left: -100vw; } @media (min-width: 600px) { .card { width: 550px; aspect-ratio: 2; border-radius: 18px; box-shadow: 0 0 10px 0 #fff9; font-size: 2em; } .card.fullscreen { border-radius: unset; box-shadow: unset; } .card:not(.fullscreen)::before { box-shadow: inset 0px 0px 20px 20px #000; } #titles { gap: 3em; } } </style> </head> <body > <canvas id="canvas"></canvas> <div id="titles"></div> <script type="x-shader/x-vertex">#version 300 es #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif in vec2 position; out vec2 texcoord; void main(void) { texcoord = position; gl_Position = vec4(position, 0, 1); } </script> <script type="x-shader/x-fragment" data-title="Flythrough">#version 300 es /********* * made by Matthias Hurrle (@atzedent) */ #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif out vec4 fragColor; in vec2 texcoord; uniform vec2 resolution; uniform float time; #define T time #define S smoothstep void main(void) { vec2 uv = texcoord * (resolution / max(resolution.x, resolution.y)), p = uv; float t = T * .25 - cos(T * .5) * 1.5; p *= mat2(cos(t), -sin(t), sin(t), cos(t)); vec3 col = vec3(0); p = normalize(p) * log(length(p) * .8); p = vec2(atan(p.y, p.x), length(p) * .5 + T * .5); vec3 z = vec3(p * .5, 0); float c = sin(t * .2) * .5 + .5, d.........完整代码请登录后点击上方下载按钮下载查看
网友评论0