我正在使用自定义计时功能(http://cubic-bezier.com/#1,0,1,1)淡入div(使用CSS过渡)。计时功能基本上是“缓入”的更极端的版本。

div {
    opacity: 0;
    transition: opacity 1s;

.in {
    opacity: 1;
    transition-timing-function: cubic-bezier(1, 0, 1, 1);
}


除此之外,我希望能够通过在屏幕上滑动来在div中淡入淡出。我正在使用以下Jquery根据用户刷卡的距离设置不透明度:

documentWidth = $(document).width();

$(document).on('touchmove', function(e) {

    // How much of the animation is completed (in %)
    completion = e.changedTouches[0].pageX / documentWidth;

    $('div').css('opacity', completion);
})


不,这是线性的!那里有一个聪明的数学人,谁能弄清楚如何重述最后一行代表我的计时功能?

因此,例如,如果completion为25%,则不透明度应为2%左右。如果为50%,则应为11%左右;如果为75%,则应为31%左右。

最佳答案

首先找到与您的cubic-bezier曲线近似的曲线。使用给定的点和一些online tools,可以使用以下公式绘制曲线:

y = 464085.7 + (0.0174619 - 464085.7)/(1 + (x/22.88957)^4.174069)


在您的情况下,x表示您的completion变量,而y表示不透明度。

然后你的代码变成

let completion = e.changedTouches[0].pageX / documentWidth;
let exponential = Math.pow((completion / 22.88957), 4.174069);
let opacity = 464085.7 + (0.0174619 - 464085.7)/(1 + exponential);

$('div').css('opacity', opacity);


(当然,您可能会找到最适合您需求的更好的方程式)

09-18 03:38