【发布时间】:2021-07-28 18:09:04
【问题描述】:
我正在实现一个“窗格”视图组件。类似于 IntelliJ 或 VSCode,其中每个窗格可以重新排列为不同的行和列。拖放重新排列动作需要一个预览动画:一个围绕屏幕动画的框,显示动作完成后新窗格的插入位置。
基本上,我需要一个绝对定位的圆角矩形,它可以在屏幕周围流畅地制作动画。理想情况下,这将是 GPU 加速的。
我的尝试:
尝试不。 1
我只是创建了一个<div> 元素并为height、width、top 和left 值设置了动画。这有效,并允许所有其他 CSS 效果在矩形上工作,如边框和圆边。但是,它不是很快。建议不要直接为位置和大小设置动画,因为它会强制在每一帧上进行重排。
尝试不。 2
相反,我创建了1px by 1px 彩色<div>,并通过编辑它的transform CSS 属性来设置它的大小和位置。这是超级平滑的,因为它使用了 GPU 加速的变换属性。但是,它有一个缺点:我无法设置 <div> 的样式。我不能使用border 或border-radius,否则它们会被scale 转换扭曲。
想法
- 既然矩形是一个简单的形状,我们可以生成一个
svg并在不同位置之间进行插值吗?如果这发生在viewBox内,会顺利吗?我不确定这一点,因为我对 SVG 没有太多经验。
我的问题 – 如何在屏幕上平滑地设置一个 div 动画,它的样式是 border 或 border-radius?
我可以不用border,但强烈需要border-radius。
【问题讨论】:
-
既然只有
transform才能实现平滑移动动画,svg不能实现平滑移动动画? -
用
1px by 1px制作div标签可以制作流畅的动画,而制作border-radius似乎是个问题。如果在每个角落放置一个圆形四分之一边框怎么办?每当更改border-radius值时,每个角边框都会更改每个border-radius值。 -
@jacobkim 是的,我就是这么想的 :( 这只是一个想法,以防有一个我不知道的 SVG 技巧。我考虑为每个角落使用自定义剪辑图像(我相信这就是你的建议)但是我仍然需要为圆形四分之一边框的位置设置动画,这会很慢,因为它不能使用
transform。 -
您能否在问题中包含您的两次尝试的简单示例,以便我们轻松了解时间在哪里?
-
@haz 无法想象用
1px by 1px为div设置动画并调整大小的角度是多么缓慢或多么复杂border-radius!只是想如果div和1px by 1px和border-radius: 50%被用作拐角边框的线条。那么问题将是边界半径值的路径计算。
标签: javascript html css animation