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

响应式网页小游戏CSS/JS关键帧动画自适应屏幕适配方案咨询

解决方案

你可以通过以下两种方案替换固定像素值,实现自适应的移动动画:

方案1:基于玩家自身尺寸的百分比实现(更简单,无需额外变量)

transform的百分比单位默认相对于元素自身尺寸,你的玩家方块本身已经是自适应舞台高度的,直接修改动画逻辑即可:

修改CSS代码

@keyframes moveLeft{
    0%{transform: translateX(0);}
    80%{transform: translateX(-200%);} /* 100%对应玩家自身宽度,可根据需求调整倍数 */
}
.animateLeft{animation: moveLeft 125ms ease-out;}

修改JS代码

  1. 修复class判断的逻辑bug,同时替换固定60px为动态计算的玩家尺寸倍数:
// 修复移动状态判断逻辑
function checkPlayerMovement(){
    if(player.classList.contains('animateLeft')){
        isPlayerMoving = 1;
    }
    else{
        isPlayerMoving = 0;
    }
};

// 替换固定移动步长
function playerMotion(){
    checkPlayerMovement();
    if(a == 1){
        if(isPlayerMoving == 1){
            return;
        }
        else{
            // 2对应CSS动画里的200%,和动画位移幅度保持一致即可
            newPlayerX -= player.offsetWidth * 2; 
            playerLeft();
        }
    }
};

方案2:基于舞台宽度比例实现(移动距离和舞台宽度严格挂钩)

如果需要移动距离和舞台宽度成固定比例,可以用CSS变量动态传值:

修改CSS代码

@keyframes moveLeft{
    0%{transform: translateX(0);}
    80%{transform: translateX(calc(-1 * var(--move-step)));}
}
.animateLeft{animation: moveLeft 125ms ease-out;}

修改JS代码

  1. 定义固定的移动比例常量,调整数值可以控制移动幅度:
const MOVE_STEP_RATIO = 0.03; // 每次移动距离为舞台宽度的3%,可自定义
  1. 在scale函数末尾新增CSS变量更新逻辑,每次窗口缩放同步更新步长:
function scale(){
    // 原有scale逻辑不变
    var w = window.innerWidth;
    var h = window.innerHeight;
    if(w/h > borderAspectRatio){
        stageWidth = 0.96*h*borderAspectRatio;
        stageHeight = 0.96*h;
    }
    else{
        stageWidth = 0.96*w;
        stageHeight = 0.96*w/borderAspectRatio;
    }
    stage.style.width = `${stageWidth}px`;
    stage.style.height = `${stageHeight}px`;

    // 新增:更新移动步长的CSS变量
    const moveStep = stageWidth * MOVE_STEP_RATIO;
    document.documentElement.style.setProperty('--move-step', `${moveStep}px`);
};
  1. 修复class判断逻辑,同时替换固定移动步长:
function checkPlayerMovement(){
    if(player.classList.contains('animateLeft')){
        isPlayerMoving = 1;
    }
    else{
        isPlayerMoving = 0;
    }
};

function playerMotion(){
    checkPlayerMovement();
    if(a == 1){
        if(isPlayerMoving == 1){
            return;
        }
        else{
            newPlayerX -= stageWidth * MOVE_STEP_RATIO; 
            playerLeft();
        }
    }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:45:03