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

向下滚动放大元素、占满屏幕后上移的前端交互实现问题

滚动控制元素缩放+满屏后上移交互实现

核心逻辑调整说明

  • 新增位移偏移量变量,拆分交互为两个阶段:未达最大缩放值时执行缩放,达到阈值后执行上移
  • 回滚时先还原元素位置,再缩小元素,符合用户操作直觉
  • 修正原代码中直接对比transform字符串的逻辑错误,改用数值判断更精准
  • 新增过渡属性让动画更丝滑

完整可运行代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>滚动缩放位移交互</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        .zoom{  
            height:100vh;  
            width:100%;  
            display:grid;  
            place-items:center;  
            position:fixed;  
            top: 0;  
            left:0;
            background: url('img/bg.png');
            /* 新增过渡让动画更流畅 */
            transition: transform 0.08s linear;
        }
        .afterzoom{
            height: 200vh;
            background: red;
        }
        img {
            /* 避免图片变形 */
            object-fit: contain;
        }
    </style>
</head>
<body>
    <div class="zoom">  
        <img src="img/square.png" alt="缩放元素">
    </div>
    <div class="afterzoom"></div>
    <script>
        const zoomElement = document.querySelector(".zoom");
        let zoom = 1;
        const ZOOM_SPEED = 0.1;
        // 最大缩放阈值,可根据你的图片初始宽度调整,放大到这个值刚好占满屏幕
        const MAX_ZOOM = 5;
        let offsetY = 0;
        // 上移速度,可根据需求调整
        const MOVE_SPEED = 20;

        document.addEventListener("wheel", function(e) {  
            // 阻止默认滚动避免页面抖动
            e.preventDefault();
            const delta = e.deltaY > 0 ? 1 : -1;

            if (delta > 0) {
                // 向下滚动:先放大再上移
                if (zoom < MAX_ZOOM) {
                    zoom = Math.min(zoom + ZOOM_SPEED, MAX_ZOOM);
                } else {
                    offsetY -= MOVE_SPEED;
                }
            } else {
                // 向上滚动:先复位位置再缩小
                if (offsetY < 0) {
                    offsetY = Math.min(offsetY + MOVE_SPEED, 0);
                } else {
                    zoom = Math.max(zoom - ZOOM_SPEED, 1);
                }
            }
            // 同时应用缩放和位移
            zoomElement.style.transform = `scale(${zoom}) translateY(${offsetY}px)`;
        });
    </script>
</body>
</html>

参数调整说明

  • 如果你需要调整放大阈值,修改MAX_ZOOM数值即可,数值越大放大倍数越高
  • 调整ZOOM_SPEED可以改变缩放速度,数值越大缩放越快
  • 调整MOVE_SPEED可以改变元素上移的速度,数值越大移动越快
  • 过渡效果的时长和曲线可以修改.zoom的transition属性自定义

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:45:02