javascript - 使用带有 svg 标签的 IntersectionObserver 的解决方案
问题描述
所以我正在为我的网站制作一个技能部分,我为圆环技能创建了一个动画来填充,这就是它的样子。
问题是动画在页面加载时激活,我看不到动画,因为当我滚动到技能部分时,动画已经开始和结束。
圆环动画是用 SVG 标签制作的,我想在用户观察技能圆环时使用 IntersectionObserver 来激活动画。它不起作用,因为 IntersectionObserver 可以观察到 svg 元素的类,我该如何解决?
这是代码
<div class="svg-item">
<h1 class="skill">Python</h1>
<svg width="100%" height="100%" viewBox="0 0 40 40" class="donut">
<circle class="donut-hole" cx="20" cy="20" r="15.91549430918954" fill="#000000"></circle>
<circle class="donut-ring" cx="20" cy="20" r="15.91549430918954" fill="transparent" stroke-width="3.5"></circle>
<circle class="don" cx="20" cy="20" r="15.91549430918954" fill="transparent" stroke-width="3.5" stroke-dasharray="100 0" stroke-dashoffset="25"></circle>
<g class="donut-text">
<text y="50%" transform="translate(0, 2)">
<tspan x="50%" text-anchor="middle" class="donut-percent">100%</tspan>
</text>
</g>
</svg>
CSS
/** SKILLS **/
@keyframes donut-chart-fill {
to { stroke-dasharray: 0 100; }
}
.container-skills {
display: flex;
flex-wrap: wrap;
position: relative;
justify-content: center;
gap: 150px;
top: 300px;
}
.skill {
color: #fcfdf8;
text-align: center;
padding-bottom: 1px;
height: 30px;
}
.svg-item {
width: 200px;
height: 200px;
font-size: 16px;
}
.donut-ring {
stroke: #00000;
}
.donut-segment {
animation: donut-chart-fill 1s reverse ease-in;
transform-origin: center;
stroke: #00a6ff;
}
.donut-text {
fill: #00a6ff;
}
.donut-label {
font-size: 0.28em;
font-weight: 200;
line-height: 1;
fill: #000;
transform: translateY(0.25em);
}
.donut-percent {
font-size: 0.5em;
fill: #00a6ff;
line-height: 1;
transform: translateY(0.5em);
}
JS
function callback(entries) {
entries.forEach(function (entry) {
if (entry.isIntersecting) {
entry.target.classList.add('donut-segment');
} else {
entry.target.classList.remove('donut-segment');
}
});
}
function initObserver() {
var observer = new IntersectionObserver(callback);
var items = document.querySelectorAll('.don');
for(var i in items) {
if(!items.hasOwnProperty(i)) {
continue;
}
observer.observe(items[i]);
}
}
if (window.IntersectionObserver) {
initObserver();
} else {
console.log("IntersectionObserver not supported.");
}
“don”类不会显示环形动画,除非被称为“donut-segment”,我在 JavaScript 部分尝试的代码但它不起作用,它不会改变“don”类(在SVG 标签)到“甜甜圈段”。
提前感谢您的帮助:)
解决方案
推荐阅读
- android - 在应用程序模块中更改 build.gradle 后,出现错误:找不到符号方法 setVolumeControlStream
- sql - ORACLE查询,如果一行满足FK条件,则忽略所有行
- ruby-on-rails - Rails 5.2 仅在包含样式表或 javascript 时才渲染
- elasticsearch - 将 AWS S3 连接到 ElasticSearch
- regex - 需要正则表达式使搜索更懒惰
- java - 如何为 android recyclerview 网格布局设置边框。
- ssl - 安装 SSL 后 Apache 不启动
- sql - 在 Presto 中将两列转换为键值对 JSON 字符串
- java - 离子返回 XML 错误而期望 JSON
- angular - 离子含量部分相互重叠