javascript - 如何在 Anime.js 中按照 SVG 路径“完美”居中对象?
问题描述
我正在使用Anime.js围绕SVG 中的圆形路径移动一个 20 像素的正方形。然而,正方形在它的圆形路径中并不完全居中:
anime({
targets: '.square',
translateX: path('x'),
translateY: path('y'),
rotate: path('angle'),
easing: 'linear',
duration: 10000,
loop: true,
});
https://codepen.io/gremo/pen/wvKjrMW
我找到了类似的例子,但我无法理解进行这项工作的数学原理:
解决方案
发生这种情况是因为您的对象(正方形)确实在遵循路径。但是,对象是根据左上角的第一个像素值平移的(因此,如果您制作一个1px x 1px
正方形,您应该会看到该正方形很好地跟随路径)。这就是为什么对象的左上角总是粘在这条线上的原因。您想要的是使对象的中间部分粘在线条上。
使用静态和手动计算的值(框的原始宽度和高度的 50%)是合理的(例如-10px
,同时给出top
和left
)。但是,当有许多对象被动画化时,您可能不想这样做(因为您需要在发生更改时更新所有 CSS 代码)。::after
相反,我们可以使用你的伪元素.square
并将其向左平移 50% 的宽度,向顶部平移 50% 的高度。这样,物体的附着在直线上的点就是正方形的中心部分。现在,当您更新原始.square
元素的宽度和高度时,您不需要更新top
andleft
值。您不能简单地将transform: translate(-50%, -50%)
值添加到原始值.square
div 因为它将使用 Anime.js 进行动画处理,并且初始变换值将丢失。从 JS 获取计算出的初始变换值很棘手。
document.addEventListener('DOMContentLoaded', function() {
const path = anime.path('.circle path');
anime({
targets: '.square',
translateX: path('x'),
translateY: path('y'),
easing: 'linear',
duration: 10000,
loop: true,
});
});
body {
background-color: #001f3f;
}
.container {
position: relative;
margin: 0 auto;
max-width: 500px;
}
.circle {
fill: none;
stroke: #b10dc9;
}
.square {
position: absolute;
top: 0;
left: 0;
display: inline-block;
width: 20px;
height: 20px;
}
.square::after {
content: '';
position: absolute;
width: 100%;
height: 100%;
transform: translate(-50%, -50%);
background-color: #f012be;
}
<script src="https://unpkg.com/animejs@3.2.0/lib/anime.min.js"></script>
<div class="container">
<svg class="circle" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
<path d="M400,250c0,82.84-67.16,150-150,150s-150-67.16-150-150s67.16-150,150-150S400,167.16,400,250z" />
</svg>
<span class="square"></span>
</div>
推荐阅读
- flutter - 如何通过 woocommerce rest api 在 json 文件中发布 line_items?
- angular - ng update 确实让我的角度应用程序升级到 11.0.0-next.6 但我想要稳定版本 10.x
- c# - 如何将 ASP.NET Core 和本地现有数据库发布到 Azure?
- html - 如何在没有空格的情况下在两侧之间留出空间
- python - 如何在 discord.py 中添加视频时间线?
- javascript - 查找字符串可以是数组
- google-chrome - Chrome 开发者工具如何配置 webworkers?
- postgresql - 如何在 PostgreSQL 中归档的 JSON 上创建索引
- postgresql - 从临时表中删除记录时出现 SQL 语法错误
- ios - 命令 PhaseScriptExecution 失败,退出代码非零 Xcode v12.0.1