Loading...
Loading...
Thiết lập Lenis (physics-based smooth scroll) cho TOÀN TRANG + đồng bộ đúng cách với GSAP ScrollTrigger (raf loop dùng chung driver, không lệch pha, không giật khi quay lại tab). Gọi khi user nói "lenis", "smooth scroll", "cuộn mượt kiểu apple", "physics-based scroll", hoặc /lenis-smooth-scroll. KHÁC `skills/gsap-scrolltrigger-pin` (đó là pin + cuộn ngang cho MỘT section cụ thể — dùng CHUNG được với skill này, pin không thay được nền smooth-scroll) và KHÁC `skills/scroll-effects` (vanilla, không dependency; skill này CÓ dependency Lenis + GSAP, là nền smooth-scroll cho cả trang chứ không phải hiệu ứng lẻ).
npx skill4agent add rheinmir/setup lenis-smooth-scrollRheinmir/uiux-assetscroll-effectsgsap-scrolltrigger-pingsap-scrolltrigger-pin/lenis-smooth-scrollgsap-scrolltrigger-pinscroll-effectsbản gốc (Rheinmir/uiux-asset) → copy nguyên file → chỉ sửa nội dungassets/ (vanilla rút gọn) → ADAPTreduced-motion? → không Lenisnew Lenis → driver: 2A raf tự quản (không GSAP) XOR 2B gsap.ticker (có GSAP) → lenis.on('scroll', ScrollTrigger.update) → reveal/data-speed ăn theo cùng driver| Field | Required? | Ý nghĩa | |
|---|---|---|---|
| In | trang/dự án đích | có | có build step (npm) hay trang tĩnh (CDN) |
| In | có dùng GSAP ScrollTrigger? | có | quyết định driver 2A hay 2B |
| In | được kéo lib ngoài? | có | quyết định bản gốc hay |
| Out | trang cuộn Lenis | có | một driver duy nhất; |
| Out | bằng chứng verify | có | |
npm i lenis gsapassets/demo.htmlunpkg.com/leniscdnjs.cloudflare.com/.../gsap@studio-freight/lenislenisgsap.ticker.lagSmoothing(0)requestAnimationFrame(raf)gsap.ticker.addlenis.raf(time)gsap.ticker* 1000prefers-reduced-motion: reducescroll-behavior: smoothassets/lenis-demo.jsplaywright-verifydata-ls-revealpage.emulateMediaassets/Rheinmir/uiux-assetassets/prefers-reduced-motion: reduce@studio-freight/lenis| Step | Type | Inputs | Action | Outputs/exit | Failure/next |
|---|---|---|---|---|---|
| W01 | judgment | yêu cầu | Chọn pen gốc phù hợp trong bảng "Bản gốc", mở link chạy xem đúng hiệu ứng | pen được chọn | không được kéo lib ngoài → B01 |
| W02 | effect | pen | Copy nguyên file | trang chạy | — |
| W03 | deterministic | trang | Cài ( | Lenis chạy | có GSAP → B02 |
| W04 | deterministic | trang | Verify bằng | pass | giật/nhảy → rà lỗi #1–#3, lặp W03 |
Rheinmir/uiux-asset.html_assets/file://git clone --depth 1 https://github.com/Rheinmir/uiux-asset| Pen gốc — tác giả | Link |
|---|---|
| Lenis Smooth Scroll & GSAP Page — filipz | chạy · code |
| Lenis Smooth Scroll Cinematic Experience — filipz | chạy · code |
| Layout Explorations with GSAP, Flip, Lenis and ScrollTrigger N°2 — filipz | chạy · code |
| Staggered Text Scroll Reveal — gusevdigital | chạy · code |
assets/assets/demo.htmlassets/lenis-demo.cssassets/lenis-demo.jsconst lenis = new Lenis({
lerp: 0.1, // nội suy mỗi frame (0–1): thấp = mượt/trễ hơn, cao = bám sát input hơn
duration: 1.2, // easing khi có target (vd anchor scroll), không áp dụng cho wheel liên tục
smoothWheel: true, // bật vật lý mượt cho wheel/trackpad — lý do chính để dùng Lenis
});function raf(time) {
lenis.raf(time);
requestAnimationFrame(raf);
}
requestAnimationFrame(raf);gsap.registerPlugin(ScrollTrigger);
lenis.on('scroll', ScrollTrigger.update); // Lenis cuộn -> báo ScrollTrigger cập nhật ngay
gsap.ticker.add((time) => lenis.raf(time * 1000)); // gsap.ticker LÀM vòng raf cho Lenis luôn
gsap.ticker.lagSmoothing(0); // tắt bù-lag mặc định của GSAP (xem lý do bên dưới)gsap.tickerrequestAnimationFramerequestAnimationFrame(raf)pinscrubrequestAnimationFrame(raf)gsap.ticker.add(...)gsap.tickertimelenis.raf()* 1000lenis.on('scroll', ScrollTrigger.update)lerpscrollTopscrollgsap.ticker.lagSmoothing(0)lagSmoothing(0)prefers-reduced-motion: reduceLenisnew Lenis(...)if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
// new Lenis(...) + sync ở trên
} else {
// cuộn gốc trình duyệt; nếu có reveal-on-scroll đi kèm, hiện thẳng bằng CSS/class, không chờ cuộn mượt
}assets/lenis-demo.jsdata-speedassets/demo.htmldata-ls-revealScrollTrigger.create({ once: true })data-speed="0.12"gsap.to(..., { scrollTrigger: { scrub: true } })|v| ≤ 0.3scroll| ID | Kind | Guard | Hành vi | Skip / failure | Rejoin |
|---|---|---|---|---|---|
| B01 | conditional_required | dự án KHÔNG được kéo lib ngoài / cần bản tự viết | dùng | — | W03 |
| B02 | conditional_required | trang có GSAP ScrollTrigger | driver 2B: | không GSAP → 2A | W04 |
| B03 | conditional_required | | không | — | W04 |
| B04 | user_optional | trang cần thêm pin/cuộn ngang section | khởi tạo Lenis theo skill này TRƯỚC rồi dùng | — | W04 |
playwright-verifydata-ls-revealpage.emulateMedialenis-smooth-scroll-gsap-page.htmlrequestAnimationFrame(raf)gsap.ticker.add(...)* 1000Rheinmir/uiux-asset/scroll-effects/assets/