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

如何在不改变位置的情况下翻转SVG图像?角色翻转位置偏移求助

角色翻转后位置偏移问题修复

我正在制作一款角色可在不同位置间移动的小游戏,当角色返回上一位置时需要进行翻转操作。但目前通过代码实现翻转后,角色的位置发生了偏移,不符合预期。以下是原始实现代码:

if(mv=='next'){
    var nxtpoint = parseInt(current)+1;
    var nxtpositionx =parseInt($("#pointmap-"+nxtpoint).attr('x'));
    var nxtpositiony = parseInt($("#pointmap-"+nxtpoint).attr('y'));
    var crntnxtbtn = $("#nxt-"+current);
    var crntprvbtn = $("#prv-"+current);
    var nxtbtn = $("#nxt-"+nxtpoint);
    var prvbtn = $("#prv-"+nxtpoint);
    charmv.css('transform','rotateY(0deg)');            
    charmv.animate({ "x": nxtpositionx+charpositionx, "y": nxtpositiony+charpositiony }, "slow" );
    if(nxtbtn){
        nxtbtn.css('display','block');
    }
    prvbtn.css('display','block');

    crntnxtbtn.css('display','none');
    crntprvbtn.css('display','none');
}

if(mv=='prev'){
    var prvpoint = parseInt(current)-1;
    var prvpositionx = parseInt($("#pointmap-"+prvpoint).attr('x'));
    var prvpositiony = parseInt($("#pointmap-"+prvpoint).attr('y'));
    var crntnxtbtn = $("#nxt-"+current);
    var crntprvbtn = $("#prv-"+current);
    var nxtbtn = $("#nxt-"+prvpoint);
    var prvbtn = $("#prv-"+prvpoint);
    // charmv.css('transform','rotateX(180deg)');
    // charmv.css('transform-origin','center');
    charmv.css('transform','scale(-1, 1)')
    charmv.animate({ "x": prvpositionx+charpositionx, "y": prvpositiony+charpositiony }, "slow" );            

    if(prvbtn){
        prvbtn.css('display','block');
    }
    nxtbtn.css('display','block');
    crntnxtbtn.css('display','none');
    crntprvbtn.css('display','none');
}

问题原因

使用scale(-1,1)翻转时,元素默认以左上角为变换原点,翻转后元素会以该点为基准反向缩放,导致视觉上的位置偏移;同时jQuery的animate操作的是元素的x/y属性,和CSS transform的变换逻辑相互独立,容易产生冲突。

修复方案

方案1:统一使用CSS Transform处理位移与翻转

将位移和翻转合并到同一个transform属性中,并设置变换原点为元素中心,避免偏移:

if(mv=='next'){
    var nxtpoint = parseInt(current)+1;
    var nxtpositionx = parseInt($("#pointmap-"+nxtpoint).attr('x'));
    var nxtpositiony = parseInt($("#pointmap-"+nxtpoint).attr('y'));
    var crntnxtbtn = $("#nxt-"+current);
    var crntprvbtn = $("#prv-"+current);
    var nxtbtn = $("#nxt-"+nxtpoint);
    var prvbtn = $("#prv-"+nxtpoint);
    
    // 设置变换原点为中心,合并翻转重置与位移
    charmv.css({
        'transform-origin': 'center center',
        'transform': 'rotateY(0deg) translate(' + (nxtpositionx + charpositionx) + 'px, ' + (nxtpositiony + charpositiony) + 'px)'
    });
    
    if(nxtbtn){
        nxtbtn.css('display','block');
    }
    prvbtn.css('display','block');

    crntnxtbtn.css('display','none');
    crntprvbtn.css('display','none');
}

if(mv=='prev'){
    var prvpoint = parseInt(current)-1;
    var prvpositionx = parseInt($("#pointmap-"+prvpoint).attr('x'));
    var prvpositiony = parseInt($("#pointmap-"+prvpoint).attr('y'));
    var crntnxtbtn = $("#nxt-"+current);
    var crntprvbtn = $("#prv-"+current);
    var nxtbtn = $("#nxt-"+prvpoint);
    var prvbtn = $("#prv-"+prvpoint);
    
    // 设置变换原点为中心,合并翻转与位移
    charmv.css({
        'transform-origin': 'center center',
        'transform': 'scale(-1, 1) translate(' + (prvpositionx + charpositionx) + 'px, ' + (prvpositiony + charpositiony) + 'px)'
    });
    
    if(prvbtn){
        prvbtn.css('display','block');
    }
    nxtbtn.css('display','block');
    crntnxtbtn.css('display','none');
    crntprvbtn.css('display','none');
}

方案2:保留jQuery Animate,抵消翻转偏移

如果坚持使用jQuery的animate,需要计算元素宽度,抵消scale(-1)带来的x轴偏移:

if(mv=='prev'){
    var prvpoint = parseInt(current)-1;
    var prvpositionx = parseInt($("#pointmap-"+prvpoint).attr('x'));
    var prvpositiony = parseInt($("#pointmap-"+prvpoint).attr('y'));
    var crntnxtbtn = $("#nxt-"+current);
    var crntprvbtn = $("#prv-"+current);
    var nxtbtn = $("#nxt-"+prvpoint);
    var prvbtn = $("#prv-"+prvpoint);
    
    // 设置变换原点为中心,执行翻转
    charmv.css({
        'transform-origin': 'center center',
        'transform': 'scale(-1, 1)'
    });
    
    // 计算元素宽度,抵消翻转带来的x偏移
    var charWidth = charmv.width();
    charmv.animate({ 
        "x": prvpositionx + charpositionx - charWidth, 
        "y": prvpositiony + charpositiony 
    }, "slow" );            

    if(prvbtn){
        prvbtn.css('display','block');
    }
    nxtbtn.css('display','block');
    crntnxtbtn.css('display','none');
    crntprvbtn.css('display','none');
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 11:45:55