惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

www.infosecurity-magazine.com
www.infosecurity-magazine.com
D
DataBreaches.Net
T
Tailwind CSS Blog
M
MIT News - Artificial intelligence
Stack Overflow Blog
Stack Overflow Blog
F
Full Disclosure
V2EX - 技术
V2EX - 技术
N
News and Events Feed by Topic
Help Net Security
Help Net Security
L
LangChain Blog
Y
Y Combinator Blog
宝玉的分享
宝玉的分享
Google Online Security Blog
Google Online Security Blog
P
Proofpoint News Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Blog of Author Tim Ferriss
Google DeepMind News
Google DeepMind News
The Register - Security
The Register - Security
B
Blog RSS Feed
N
Netflix TechBlog - Medium
N
News | PayPal Newsroom
TaoSecurity Blog
TaoSecurity Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
V
Vulnerabilities – Threatpost
B
Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
I
Intezer
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园_首页
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
AI
AI
aimingoo的专栏
aimingoo的专栏
大猫的无限游戏
大猫的无限游戏
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Cyberwarzone
Cyberwarzone
P
Proofpoint News Feed
Google DeepMind News
Google DeepMind News
G
GRAHAM CLULEY
Vercel News
Vercel News
罗磊的独立博客
MyScale Blog
MyScale Blog
Last Week in AI
Last Week in AI
博客园 - 司徒正美
C
CERT Recently Published Vulnerability Notes
GbyAI
GbyAI
Scott Helme
Scott Helme
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Troy Hunt's Blog
A
About on SuperTechFans
P
Privacy International News Feed

Codrops

Meet the Speakers of the First Three.js Conference | Codrops The Architecture Behind Trionn: Coordinating GSAP, Three.js, Lenis, and Web Audio | Codrops Where Stories Become Interactive Worlds: How makemepulse Brings Ideas to Life Across Web, XR, and Beyond | Codrops The Sleepers: Creating an Atmospheric WebGL Experience with Lightweight Techniques Building an Interactive Wave Propagation Cube Grid with Three.js | Codrops Ten Years Away: Designing an Interactive Comic for Studio375’s Tenth Anniversary | Codrops Building a Scroll-Driven 3D Gallery Using a Blender Camera Path with Three.js and GSAP | Codrops From Years of Client Work to a Next.js + Sanity Starter Kit | Codrops Sculpting a Digital Athlete: Capturing Stefanos Tsitsipas Beyond the Court | Codrops Building Persistent Page Transitions with WebGPU and Vanilla JavaScript | Codrops Inside Bisous: Designing an Editorial Experience for Cinematic CGI | Codrops Engineering the Web Experience Behind Shopify’s Spring ’26 Edition: Everywhere | Codrops Shaping Stories into Experience: The Work of Kevin Lam | Codrops Testing What Users Actually See with Vitest and Chromatic | Codrops Podium: Building a Website Where Running Becomes Storytelling | Codrops Designing Beyond the Surface: How DashDigital Turns Complexity into Clarity | Codrops Creative Entrepreneurship: Designing the Machine | Codrops Exploring 3D Image Rotations on Scroll | Codrops Always Building, Always Learning: Cyd Stumpel’s Journey Through the Modern Web | Codrops Designing A Better Lou: Reducing Cognitive Load Through Design, Content, and Systems | Codrops Sketching the Impossible: A 3D Portfolio Built Without a Single 3D Model | Codrops Building Horeca: Advanced Motion Design in Webflow Without the Performance Trade-Offs | Codrops Building an Interactive Digital Stamp Collection with Shaders, Postcards, and Playful Inspection | Codrops No Two Paths Alike: Inside San Rita’s Approach to Digital Experiences | Codrops The Making of the New Lesse Studio Website: Clarity, Performance, and Intentionality | Codrops Creating a Thumbnail Flow Animation with GSAP MotionPath | Codrops Forging Her Own Path: Houmahani Kane’s Journey in Creative Development | Codrops Beaucoup and the Pursuit of Memorable Experiences | Codrops The Future of Emotional Technology: Comfort Websites for Growth and Self-Awareness | Codrops The Never Ending Story: Building a Seamless Infinite Scroll Experience with GSAP & Lenis | Codrops Whooshes, Snaps and Shaders: Adrien Vanderpotte and the Feeling of the Interface | Codrops Building a Scroll-Driven 3D Cube Gallery in Webflow with GSAP | Codrops Creating Scroll-Driven SVG Map Animations with GSAP | Codrops Made With Gsap: Building a Fun Gravity-Based Mouse Trail | Codrops 80s Business Tech and Seamless Scene Transitions: Inside Shader.se’s Scroll-Driven WebGPU Pipeline | Codrops Merlin: The Code Boutique Turning Motion Into Digital Magic | Codrops Designing Ourselves: The New Obys Identity and Website | Codrops Exploring the HTML-in-Canvas Proposal | Codrops Le:mma Studio: Building the Feeling Behind the Screen | Codrops From Shader Uniforms to Clip-Path Wipes: How GSAP Drives My Portfolio | Codrops Reverse-Engineering Claude AI’s Mascot Animations with SVG and GSAP | Codrops Akaru: Crafting Precision-Driven Digital Experiences | Codrops Designing Against the Gallery: A Two-Year Journey to a Layered Portfolio Experience | Codrops Between Human and Machine: Sofia Papadopoulou’s Approach to Augmented Creativity | Codrops More Than a Portfolio: Building a Scroll-Driven 3D World with Something to Say | Codrops Rhumb Studio: Small but Mighty, Shaped by Curiosity | Codrops Susurrus: Crafting a Cozy Watercolor World with Three.js and Shaders | Codrops A Playful Clip Menu with GSAP’s easeReverse | Codrops False Earth: From WebGL Limits to a WebGPU-Driven World | Codrops Interactive Storytelling for the Web: Building Immersive Stories with Timelines, 3D, and Layered Scenes | Codrops The Art of Complex Motion: Corentin Bernadou’s World of Shaders and Experimentation | Codrops They Call Me Giulio: The Making of a Cinematic Cyberpunk Portfolio | Codrops Lusion: Where Digital Craft Meets Ambitious Experimentation | Codrops The Exat Microsite: Pushing a Typography Showcase to New Creative Extremes | Codrops A Single DM, a First SOTD, and the Start of Chanh M. Ho’s Creative Journey | Codrops Creating Custom Page Transitions in Astro with Barba.js and GSAP | Codrops R—K ’26: The Thinking and Code Behind a Portfolio Led by Presence | Codrops Building the Maxima Therapy Website: React, GSAP, and Dabbling with AI | Codrops Where Engineering Meets Craft: Edoardo Lunardi’s Obsession with the Details | Codrops Animating 160,000 Cubes in Three.js to Visualize Dithering | Codrops Arnaud Rocca’s Portfolio: From a GSAP-Powered Motion System to Fluid WebGL | Codrops Where Confidence Needs No Decoration: The Malvah.Studio Story | Codrops Motion Highlights #17 | Codrops
Building 4WIDE: Turning Distortion, Blur, and Motion into a Coherent Experience | Codrops
Tomoya Okada · 2026-04-23 · via Codrops

Today I want to introduce the 4WIDE website, which launched on March 31, 2026. I’ll walk through the background, some of the technical side, and the thinking behind the visual design. Hope you stick around to the end!

Project backstory

Keep the tone but correct it, make it flow better, don’t add anything or take anythign away, don’t use dashes: This project was created as the business website for my independent practice under the name 4WIDE.

From the initial concept to the public launch, the project took about three months, during which I explored a wide range of ideas for both the content and the expression. The main point I focused on with this website was balancing expressiveness with clarity of message. It is not a website meant to merely showcase my personal artistic sensibilities. As a business website, it needed to clearly communicate what I do and what I can offer.

At the same time, one of the areas I want to pursue in my work is expressive design. I therefore aimed to find a balance where that intention could be conveyed properly while still allowing the site to function as a business website.

Tech stack & tools

The tech stack is as follows:

  • Framework: Astro
  • Page transitions: Swup
  • CMS: WordPress (Headless)
  • Hosting: Vercel
  • Animation: GSAP, Three.js

I selected these frameworks and libraries from tools I had already used and felt familiar with. That said, there were also technologies I used properly for the first time on this site: Swup and headless WordPress. They were both tools I had been interested in for some time but had not had the opportunity to use before, so I decided to take the chance and try them on this project.

Visual & interaction design

There are three visual and interactive elements I would like to introduce.

About page

This page is structured so that a curved image emerges from the main visual and leads into the message section. The idea behind this structure was to leave a strong impression of my stance toward both my business and my creative work. The narrative is that behind the surface-level elements labeled “Notes,” which describe my scope and approach, the more fundamental ideas begin to appear.

As I developed this flow, I felt that simply revealing the content from behind would not create enough visual impact, so I added a curved distortion and blur effect, along with an interaction where the text itself moves in sync with the scroll.

Below is part of the code used to create the curved effect.

float distortion = 1.0 + u_strength * r * r;
vec2 distortedUv = uv / distortion;

distortedUv.x /= u_aspect;
distortedUv = distortedUv * 0.5 + 0.5;

float t = clamp(r / 1.2, 0.0, 1.0);
float t2 = t * t;

vec2 radialDir = r > 0.001 ? normalize(uv) : vec2(0.0);
vec2 radialDirNorm = vec2(radialDir.x / u_aspect, radialDir.y);

There was also one technical point I particularly struggled with, which was mobile optimization. This expression was important to the narrative of this section, so I never considered turning it off on mobile.

However, as development progressed, I became increasingly concerned about the performance cost on mobile devices. To improve it as much as possible, I made several adjustments. Here are some of them:

1. Optimizing the images
I prepared images optimized for mobile sizes and changed the format to WebP.

2. Adjusting geometry size and segment count
I reduced both the size and the number of segments by half.

3. Adjusting the blur effect
The blur effect is turned off on mobile.

4. Adjusting the renderer’s powerPreference
On mobile, it is set to low-power.

The most effective of these was the third adjustment: modifying the blur effect. Blur-based visuals are extremely demanding in terms of performance.

Showcase page

This page was created to present several selected works with a strong emphasis on visual expression. To enhance immersion, I reused the curved and blur effect from the About page, while also introducing a large moving parallax effect and RGB shift.

I feel that blur and RGB effects work extremely well when the goal is to heighten immersion. They are used not only in web design but also frequently in visual and motion-based media.

As intended, I feel the overall scrolling experience became very smooth and created a space with a strong sense of depth.

Below is part of the code used to create the parallax effect.

vec2 uv = imageAspect(u_planeSize, u_imageSize, vUv);
uv = (uv - vec2(0.5)) / u_imageScale + vec2(0.5);
uv.x -= u_imageOffsetX;
uv.y -= u_imageOffsetY;
images.forEach((img, index) => {
  gsap.to(this.objcts[index].material.uniforms.u_imageOffsetY, {
    value: -0.3,
    scrollTrigger: {
      trigger: img,
      scroller: container,
      start: "top bottom",
      end: "bottom top",
      scrub: true,
    },
  });
});

Because the page is also connected to the CMS, content can be freely replaced, added, or removed from the admin panel.

Top page

The main visual on the top page is a reel-style video, but it actually has two modes: default and focus.

In focus mode, visitors can view information about 4WIDE, what I value, and the design elements that make up the site, such as Grid and Type. The shift to focus mode affects not only the information being shown, but also the background video, which becomes heavily distorted and plays more slowly. By doing this, I adjusted the experience so that it feels more focused.

Below is part of the code used to create the focus mode.

setupMvModeChange() {
  const modeButton = document.querySelector(".index-mv__mode-button");
  let modeFlag = false;
  modeButton.addEventListener("click", () => {
    if (mvModeRunning) return;
    modeFlag = !modeFlag;
    if (flag) {
      gsap.to(this.plane.material.uniforms.u_filter, {
        value: 0.9,
        duration: 1.4,
        ease: "power4.out",
      });
      if (this.fisheyePass.uniforms.u_strength) {
        gsap.to(this.fisheyePass.uniforms.u_strength, {
          value: 0.7,
          duration: 1.4,
          ease: "power4.out",
        });
      }
      if (this.video) {
        gsap.to(this.video, {
          playbackRate: 0.6,
          duration: 1.4,
          ease: "power4.out",
        });
      }
    } else {
      gsap.to(this.plane.material.uniforms.u_filter, {
        value: 0.3,
        duration: 1.4,
        ease: "power4.out",
      });
      if (this.fisheyePass.uniforms.u_strength) {
        gsap.to(this.fisheyePass.uniforms.u_strength, {
          value: 0.0,
          duration: 1.4,
          ease: "power4.out",
        });
      }
      if (this.video) {
        gsap.to(this.video, {
          playbackRate: 1,
          duration: 1.4,
          ease: "power4.out",
        });
      }
    }
  });
}

Reflections

This project, created as the website for my own business, became something through which I was able to think deeply and experiment extensively. Overall, I am very satisfied with the final result, though I am sure there are still areas where it could have been presented even better. This website is not something I consider finished, and I want to continue improving and refining it so that it can serve me for a long time.

Finally, I would like to thank Codrops for giving me the opportunity to introduce this project in this way. Thank you very much for reading until the end.