【问题标题】:How can I scale a div without scaling its casted box-shadow in a performant way?如何在不以高性能方式缩放其投射的盒子阴影的情况下缩放 div?
【发布时间】:2016-08-27 11:32:09
【问题描述】:

我在div 上使用transform scaleY 动画,以廉价地为其hegiht 设置动画,但是当应用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);
}
<div></div>

jsbin.com demo

你可以看到 box-shadow 也被缩放了。不仅如此,它捕捉在动画的结尾,看起来很丑。

关于如何在缩放阴影的同时保持这个快速的 60fps transform 动画的任何建议? 对高度进行动画处理可以获得所需的效果,但在移动设备上会滞后很多。

已经尝试过

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

【问题讨论】:

  • 您最终的代码是否会在div 中包含一些也需要缩放的内容?还是你只想改变div的高度?
  • 假设我们不关心这里的内容会发生什么。
  • 我忽略了你写的动画 height 不是一个选项。至此,我认为现在还没有真正解决您的问题的方法。缩放阴影是恕我直言,因为scaleY 会缩放属于对象及其内容的所有内容。而且你在动画结束时看到的效果看起来像是渲染引擎的一个错误。
  • 谢谢你,我在上次编辑中使height 参数更清晰。
  • 我想到的唯一可以尝试的解决方法是使用边框图像而不是框阴影并为高度设置动画。但不知道性能会不会更好。

标签: css performance transform css-animations box-shadow


【解决方案1】:

你必须在这里使用另一个元素。对元素使用 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);
}
<div><span></span></div>

【讨论】:

  • “对元素使用变换会影响其子元素”。它没有。如果您查看 sn-p 中的阴影,它不会移动。 ;(
  • 确实如此,但这里的阴影在我没有缩放的父元素中。它在父元素中,我只缩放内部的跨度。你想要这样的东西吗?
  • 很抱歉我在上面的评论中感到困惑。无论如何,不​​,我不想让影子留在原地。它应该仍然在 div 周围而不被transformation 变形。
  • 看来这种变形是 webkit 中的一个错误,它在 Firefox 中运行良好。请记住,如果您使用比例来更改元素的大小,您也会更改其内容的大小。如果您想展开内容,纯 Javascript 将是最快的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
相关资源
最近更新 更多