You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现隧道效果:将滚动位置转换为0至3区间的变量值

隧道滚动缩放效果修正方案

我要复刻隧道滚动效果,需求是:把滚动位置转换成0到3的数值,每100vh的滚动区间内,对应元素完成从0到3的缩放变化。目前用的jQuery函数计算逻辑有问题,代码如下:

$(window).scroll(function() {

    var scr = $(window).scrollTop();
    var h = window.innerHeight;

    $('.img-container').each(function(i, el) {
       var start = h*i;
       var end = start + h;
       if (scr >= start && scr < end) {

         var percZ = (scr-start)*3/((scr-start)+h);
         $(el).css('transform', 'scale('+percZ+')');

         if (percZ > 3) {
           $(el).css('transform', 'scale(3)');
         }
       }
   });
});

问题分析

原代码里的percZ计算逻辑错误,(scr-start)*3/((scr-start)+h)这个公式永远达不到3——当滚动到区间底部(scr-start = h)时,结果仅为h*3/(h+h)=1.5,完全不符合0到3的需求。

修正方案

正确的计算逻辑是基于当前区间内的滚动占比:用(scr - start)除以区间高度h得到0到1的比例,再乘以3就得到0到3的目标数值。同时要处理边界情况,确保数值不会超出0-3的范围。

修正后的代码:

$(window).scroll(function() {
    var scr = $(window).scrollTop();
    var h = window.innerHeight;

    $('.img-container').each(function(i, el) {
        var start = h * i;
        var end = start + h;
        let percZ;

        if (scr < start) {
            // 未进入当前元素的滚动区间,缩放为0
            percZ = 0;
        } else if (scr >= end) {
            // 滚动过当前元素的区间,缩放固定为3
            percZ = 3;
        } else {
            // 区间内滚动,计算0-3的缩放值
            const scrollRatio = (scr - start) / h;
            percZ = scrollRatio * 3;
        }

        $(el).css('transform', `scale(${percZ})`);
    });
});

关键说明

  • 滚动位置在元素对应区间上方时,元素缩放保持0;
  • 滚动进入区间后,根据滚动距离占区间高度的比例,线性计算0到3的缩放值;
  • 滚动完全离开区间后,元素缩放固定为3;
  • 用模板字符串代替字符串拼接,代码更简洁易读。

内容的提问来源于stack exchange,提问作者ilariaroglieri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:16:01