如何在不以高性能方式缩放其投射的框阴影的情况下缩放 div?

dop*_*umi 5 css performance transform css-animations box-shadow

我在 , 上使用transform scaleY动画div来廉价地为其高度设置动画,但是当box-shadow应用到它时效果不佳。

div {
    width: 300px;
    height: 100px;
    transform: scaleY(1);
    transition: all 2000ms;
    transform-origin: 0 0;
    background-color: yellow;
    box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14),
                0 1px 10px 0 rgba(0, 0, 0, 0.12),
                0 2px 4px -1px rgba(0, 0, 0, 0.4);
}
div:hover {
    transform: scaleY(5);
}
Run Code Online (Sandbox Code Playgroud)
<div></div>
Run Code Online (Sandbox Code Playgroud)

jsbin.com demo

你可以看到 box-shadow 也被缩放了。不仅如此,它还会在动画结束时捕捉,看起来很难看。

关于如何transform缩放阴影的情况下保持快速 60fps动画的任何建议?动画高度会获得所需的效果,但在移动设备上滞后很多。

已经试过了

将阴影应用到div::after伪元素并转换div它不起作用,因为阴影也会被缩放。

小智 2

您必须在这里使用另一个元素。对元素使用 Transform 会影响其子元素和 :after、:before 伪元素。阴影必须位于上面的元素中才能使用变换进行工作。您可以尝试在伪选择器中使用scaleY(1)和scale(-X),但这并不可靠。

div {
    width: 300px;
    height: 100px;
    
    z-index: 1;
    position: relative;
    box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14),
                0 1px 10px 0 rgba(0, 0, 0, 0.12),
                0 2px 4px -1px rgba(0, 0, 0, 0.4);
}
div span {
    transform: scaleY(1);
    transition: all 2000ms ease;
    transform-origin: 0 0;
    background-color: yellow;
    display: block; 
    width: 300px; height: 100px;
} 
div:hover span {
    transform: scaleY(5);
}
Run Code Online (Sandbox Code Playgroud)
<div><span></span></div>
Run Code Online (Sandbox Code Playgroud)