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