我有一个div,我从左到右移动。为了使它始终在屏幕上,并且在窗口调整大小时不会错位,我根据屏幕的哪一侧最接近,切换使用left
和right
。
发生的情况是,只要用户在屏幕的同一侧来回移动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绝对是最后的手段。
1条答案
按热度按时间uqjltbpv1#
当从右向左切换时,您的转换似乎是
snap
到另一边的原因是因为您将left
和right
设置为auto
值。CSS过渡(或一般的CSS动画)不适用于具有auto
值的 prop 。这是从使用CSS过渡的文档:
auto
值通常是非常复杂的情况。规范建议不要在auto
和**auto
之间设置动画。一些用户代理,如基于Gecko的用户代理,实现了这一要求,而其他用户代理,如基于WebKit的用户代理,则不那么严格。在auto
中使用动画可能会导致不可预测的结果,具体取决于浏览器及其版本,应避免使用。也许你会更好地使用
transform
CSS属性与translateX()
函数,而不是left/right
CSS prop ?这样做会给予你一个单一的,可靠的,CSS值转换,并更高的性能。你的代码可能看起来像这样:
字符串
你的CSS过渡看起来像这样:
型
希望这对你有帮助!