jquery 即使我正在切换正在使用的属性,我也可以维护CSS转换吗?

aor9mmx1  于 2023-08-04  发布在  jQuery
关注(0)|答案(1)|浏览(95)

我有一个div,我从左到右移动。为了使它始终在屏幕上,并且在窗口调整大小时不会错位,我根据屏幕的哪一侧最接近,切换使用leftright
发生的情况是,只要用户在屏幕的同一侧来回移动div(也就是说,div保持朝向相同的属性),我用于更改左和右属性的CSS过渡就可以顺利工作,但是一旦方向从左切换到右,反之亦然,就没有过渡,div只是立即移动。
如何在使用left和right之间切换时保持我拥有的CSS过渡(或我没有的类似过渡)?
我在JavaScript中有这个函数:

function moveTimeline(screenIndex) {
    // possibly variable because of window resize
    let timelineSectionWidth = (TIMELINE_BACKGROUND_WIDTH - documentElement.clientWidth) / num_timelinePieces;
    // check what side the div is supposed to be attached to
    let isOnLeftSide = (screenIndex < num_timelinePieces / 2);
    // reverse the index if it's on the right side
    if (!isOnLeftSide)
        screenIndex = screenIndex - num_timelinePieces;
    // calculate new pixel position
    let new_timelinePosition = Math.floor(screenIndex * timelineSectionWidth);

    // unset the unused properties so they don't interfere
    if (isOnLeftSide) {
        timelineBackground.css({
            "left": "-" + new_timelinePosition + "px",
            "right": "auto"
        });
    } else {
        timelineBackground.css({
            "left": "auto",
            "right": (new_timelinePosition) + "px"
        });
    }
}

字符串
CSS的这个属性:

transition: left 1s ease, right 1s ease;


我希望div能继续从左到右平滑地移动,即使在切换auto试点上的属性时,但最终没有工作。不知道从这里如何进行。我真的不想使用一个单一的属性,因为如果调整窗口的大小,它会弄乱div的位置,而手动一步一步地移动div绝对是最后的手段。

uqjltbpv

uqjltbpv1#

当从右向左切换时,您的转换似乎是snap到另一边的原因是因为您将leftright设置为auto值。CSS过渡(或一般的CSS动画)不适用于具有auto值的 prop 。
这是从使用CSS过渡的文档:
auto值通常是非常复杂的情况。规范建议不要在auto和**auto之间设置动画。一些用户代理,如基于Gecko的用户代理,实现了这一要求,而其他用户代理,如基于WebKit的用户代理,则不那么严格。在auto中使用动画可能会导致不可预测的结果,具体取决于浏览器及其版本,应避免使用。
也许你会更好地使用transform CSS属性与translateX()函数,而不是left/right CSS prop ?这样做会给予你一个单一的,可靠的,CSS值转换,并更高的性能。
你的代码可能看起来像这样:

function moveTimeline(screenIndex) {

  ...

  if (isOnLeftSide) {
      timelineBackground.css({
         "transform": `translateX(-${new_timelinePosition}px)`
      });
  } else {
      timelineBackground.css({
          "transform": `translateX(${new_timelinePosition}px)`
      });
  }
}

字符串
你的CSS过渡看起来像这样:

transition: transform 1s ease;


希望这对你有帮助!

相关问题