webgl+gsap实现顶部水滴滴下滚动页面代码动画效果代码
代码语言:html
所属分类:加载滚动
代码描述:webgl+gsap实现顶部水滴滴下滚动页面代码动画效果代码
代码标签: webgl gsap 顶部 水滴 滴下 滚动 页面 代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <style> body, html { margin: 0; padding: 0; font-family: sans-serif; font-size: 20px; } a { color: inherit; } .page { width: 100%; min-height: 1500px; display: flex; flex-direction: column; align-items: center; opacity: 0; } .page ::-moz-selection { background: #F7C02D; } .page ::selection { background: #F7C02D; } .text-overlay, .scroll-msg { width: 100%; height: 100vh; display: flex; flex-direction: column; align-items: center; justify-content: center; } .scroll-msg { margin-top: 2em; pointer-events: none; } .scroll-msg > div:nth-child(1) { margin-top: -10vh; padding-bottom: 1em; text-transform: uppercase; font-size: 2em; } .text-overlay { position: fixed; top: 0; left: 0; opacity: 0; } canvas#gooey-overlay { position: fixed; top: 0; left: 0; display: block; width: 100%; pointer-events: none; } .arrow-animated { font-size: 1em; animation: arrow-float 1s infinite; } @keyframes arrow-float { 0% { transform: translateY(0); animation-timing-function: ease-out; } 60% { transform: translateY(50%); animation-timing-function: ease-in-out; } 100% { transform: translateY(0); animation-timing-function: ease-out; } } .lil-gui { --width: 350px; max-width: 90%; --widget-height: 20px; font-size: 15px; --input-font-size: 15px; --padding: 10px; --spacing: 10px; --slider-knob-width: 5px; --background-color: rgba(5, 0, 15, .8); --widget-color: rgba(255, 255, 255, .3); --focus-color: rgba(255, 255, 255, .4); --hover-color: rgba(255, 255, 255, .5); --font-family: monospace; } .lil-gui.autoPlace { z-index: 1; } </style> </head> <body translate="no"> <div class="page"> <div class="scroll-msg"> <div>Hello </div> <div>scroll me</div> <div class="arrow-animated-wrapper"> <div class="arrow-animated">↓</div> </div> </div> </div> <canvas id="gooey-overlay"></canvas> <div class="text-overlay"> <p> <a href="" target="_blank">linkedIn</a> | <a href="" target="_blank">bfw</a> | <a href="" target="_blank">twitter (X)</a> </p> </div> <script type="x-shader/x-fragment" id="vertShader"> precision mediump float; varying vec2 vUv; attribute vec2 a_position; void main() { vUv = a_position; gl_Position = vec4(a_position, 0.0, 1.0); } </script> <script type="x-shader/x-fragment" id="fragShader"> precision mediump float; varying vec2 vUv; uniform vec2 u_resolution; uniform float u_scroll_progr; uniform float u_col_width; uniform float u_seed; uniform float u_scale; uniform float u_time; uniform float u_speed; uniform float u_opacity; uniform vec3 u_color; vec3 mod289(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; } vec2 mod289(vec2 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; } vec3 permute(vec3 x) { return mod289(((x*34.0)+1.0)*x); } float snoise(vec2 v) { const vec4 C = vec4(0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439); vec2 i = floor(v + dot(v, C.yy)); vec2 x0 = v - i + dot(i, C.xx); vec2 i1; i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); vec4 x12 = x0.xyxy + C.xxzz; x12.xy -= i1; i = mod289(i); vec3 p = permute(permute(i.y + vec3(0.0, i1.y, 1.0)) + i.x + vec3(0.0, i1.x, 1.0)); vec3 m = max(0.5 - vec3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); m = m*m; m = m*m; vec3 x = 2.0 * fract(p * C.www) - 1.0; vec3 h = abs(x) - 0.5; vec3 ox = floor(x + 0.5); vec3 a0 = x - ox; m *= 1.79284291400159 - 0.85373472095314 * (a0*a0 + h*h); vec3 g; g.x = a0.x * x0.x + h.x * x0.y; g.yz = a0.yz * x12.xz + h.yz * x12.yw; return 130.0 * dot(m, g); } float get_l(vec2 v) { return 1. - clamp(0., 1., length(v)); } float rand(float n) { return fract(sin(n) * 43758.5453123); } void main() { float scale = .001 * u_scale; float speed = .001 * u_speed; vec2 uv = vUv; uv.x *= (scale * u_resolution.x); vec2 noise_uv = uv; noise_uv *= 5.; noise_uv.y *= (.25 * scale * u_resolution.y); noise_uv += vec2(0., u_time * 1.5 * speed); float shape = 0.; shape += snoise(noise_uv); shape = clamp(.5 + .5 * shape, 0., 1.); shape *= pow(.5 * uv.y + .7 + pow(u_scroll_progr, 2.) + (.4 * u_scroll_progr * (1. - pow(vUv.x - .2, 2.))), 10.); shape = clamp(shape, 0., 1.); float dots = 0.; float bars = 0.; float light = 0.; const int num_col = 9; for (int i = 0; i < num_col; i++) { vec2 col_uv = vUv; float start_time_offset = rand(100. * (float(i) + u_seed)); float c_t = fract(u_time * speed + start_time_offset); float drop_time = .2 + .6 * rand(10. * (float(i) + u_seed)); float before_drop_normal = c_t / drop_time; float before_drop_t = pow(before_drop_normal, .4) * drop_time; float after_drop_normal = max(0., c_t - drop_time) / (1. - drop_time); float after_drop_t_dot = 3. * pow(after_drop_normal, 2.) * (1. - drop_time); float after_drop_t_bar = pow(after_drop_normal, 2.) * (drop_time); float eased_drop_t = step(c_t, drop_time) * before_drop_t; eased_drop_t += step(drop_time, c_t) * (drop_time + after_drop_t_dot); col_uv.y += (1. + 3. * rand(15. * float(i))) * u_scroll_progr; col_uv.x *= (u_resolution.x / u_resolution.y); col_uv *= (7. * scale * u_resolution.y); col_uv.x += (u_col_width * (.5 * float(num_col) - float(i))); vec2 dot_uv = col_uv; dot_uv.y += 4. * (eased_drop_t - .5); float dot = get_l(dot_uv); dot = pow(dot, 4.); float drop_grow = step(c_t, drop_time) * pow(before_drop_normal, .4); drop_grow += step(drop_time, c_t) * mix(1., .8, clamp(7. * after_drop_normal, 0., 1.)); .........完整代码请登录后点击上方下载按钮下载查看
网友评论0