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

推荐订阅源

N
News | PayPal Newsroom
P
Proofpoint News Feed
Cyberwarzone
Cyberwarzone
C
Cisco Blogs
SecWiki News
SecWiki News
Know Your Adversary
Know Your Adversary
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Vercel News
Vercel News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
NISL@THU
NISL@THU
WordPress大学
WordPress大学
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Threat Research - Cisco Blogs
AI
AI
Simon Willison's Weblog
Simon Willison's Weblog
Security Archives - TechRepublic
Security Archives - TechRepublic
有赞技术团队
有赞技术团队
L
LINUX DO - 热门话题
Hacker News: Ask HN
Hacker News: Ask HN
V
V2EX
G
GRAHAM CLULEY
TaoSecurity Blog
TaoSecurity Blog
Hugging Face - Blog
Hugging Face - Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
F
Fortinet All Blogs
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
云风的 BLOG
云风的 BLOG
Recorded Future
Recorded Future
Latest news
Latest news
The Hacker News
The Hacker News
aimingoo的专栏
aimingoo的专栏
T
Troy Hunt's Blog
S
Schneier on Security
I
Intezer
Google DeepMind News
Google DeepMind News
A
Arctic Wolf
Apple Machine Learning Research
Apple Machine Learning Research
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threatpost
爱范儿
爱范儿
The Register - Security
The Register - Security
S
SegmentFault 最新的问题
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
宝玉的分享
宝玉的分享
Recent Commits to openclaw:main
Recent Commits to openclaw:main
美团技术团队
B
Blog RSS 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.