如何使用 CSS transitions 和 JavaScript 使元素立即变大,然后平滑缩小?

问题描述 投票:0回答:2

我的页面有一个widget,它是一个span元素,样式如下:

span.widget
{
        line-height: 0;
        font-size: 150%;
        transition: font-size 1s;
}

我有 JavaScript 修改它的字体大小:

var widget=document.getElementById('the_widget');
widget.style.fontSize='200%';

如果我这样做,字体大小会在 1 秒内连续放大,效果很好。

然而,我想要实现的是字体大小瞬间跳起来,然后平滑地缩小。我试过以下代码:

widget.style.transition='none';
widget.style.fontSize='200%';
widget.style.transition='font-size 1s';
widget.style.fontSize='150%';

但是这不起作用,因为浏览器在第一次调整大小后不会重排元素,所以第二次调整大小只是保持不变,没有动画,也没有任何变化的迹象。

我也想到了与其他 css 大小转换类似的事情,比如高度和宽度,但遇到了同样的问题。

javascript html css css-transitions
2个回答
0
投票

所以,在输入这个问题之后,我实际上偶然发现了一个可能是可持续解决方案的变通办法或 hack,即使它有点神秘;我发现了这个问题:

强制浏览器在更改 CSS 时触发重排

表示您可以使用 JavaScript 强制重排,使用

offsetHeight
属性。如果你计时

我发现这在 Chrome 和 Firefox 中有效,尚未在任何其他浏览器中测试过:

widget.style.transition='none';
widget.style.fontSize='200%';
void(widget.offsetHeight);
widget.style.transition='font-size 1s';
widget.style.fontSize='150%';

我认为这是可行的,因为将表达式传递给

void
会强制对该表达式进行评估,在这种情况下会强制回流。

通过更改 CSS 类,然后将

font-size
transition
元素的更改附加到相应的类,可能有更优雅或简洁的方法来做到这一点。


0
投票

不需要javascript。
试试这个:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Font-size Animation</title>
    <style>
        div {
            width: fit-content;
            margin: auto;
        }
        span.widget {
            font-size: 150%;
            color: red;
            animation: stayingalive 1.5s ease-out infinite;
        }
        @keyframes stayingalive {
            0%, 30%, 100% {
                font-size: 150%;
            }
            15% {
                font-size: 210%;
            }
            50% {
                font-size: 250%;
            }
        }
    </style>
</head>
<body>
    <div>
        <span class="widget">Uh uh uh uh &#9886; &#10084; &#9887; staying alive!</span>
    </div>
</body>
</html>
© www.soinside.com 2019 - 2024. All rights reserved.