为什么在使用 styled-jsx 时不应用此关键帧动画?
Why is this keyframe animation not applied when using styled-jsx?
我尝试在没有任何条件的情况下在单独的行中添加 animation
,但是没有应用转换。我还尝试用反引号代替 animation
属性 的双引号,但没有成功。
如何在单击时应用动画 false
并在单击时播放半径的过渡 true
?
import { useState } from "react";
export default function Home() {
const [clicked, setClicked] = useState(false);
return (
<>
<main>
<svg onClick={() => setClicked((c) => !c)}>
<circle cx="50%" cy="40%" stroke="black" strokeWidth={2} fill="gray" />
</svg>
</main>
<style jsx>{`
svg {
width: 100%;
height: 100%;
}
circle {
r: ${clicked ? "10%" : "5%"};
animation: ${clicked ? "none" : "bounce 2s infinite"};
transition: r 0.8s ease-in-out;
}
@keyframes bounce {
0% {
r: 5%;
}
50% {
r: 6%;
}
100% {
r: 5%;
}
}
`}</style>
</>
);
}
这与 styled-jsx 如何应用它们的 css 规则有关。
每个 <style jsx>
标签将被 babel 转换成一段 js 代码,该代码将生成并跟踪 html.
中的实际 <style type="txt/css"/>
标签。
该标签将包含一个唯一 ID,如果您检查该标签,它将如下所示:
<style type="text/css" data-styled-jsx="">
svg.jsx-1097321267 {
width: 100%;
height: 100%;
}
circle.jsx-1097321267 {
r: 5%;
-webkit-animation: bounce 2s infinite;
animation: bounce 2s infinite;
-webkit-transition: r 0.8s ease-in-out;
transition: r 0.8s ease-in-out;
}
@-webkit-keyframes bounce-jsx-1097321267 {
0% {
r: 5%;
}
50% {
r: 6%;
}
100% {
r: 5%;
}
}
@keyframes bounce-jsx-1097321267 {
0% {
r: 5%;
}
50% {
r: 6%;
}
100% {
r: 5%;
}
}
</style>
注意动画是如何使用相同的 ID 生成的。
bounce-jsx-1097321267
.
styles-jsx 标签中的任何静态 references/classes 也会获得此 ID。
这都是在编译时通过 babel 完成的。
生成的 js 代码将为您完成所有引用。
动态分配 css 代码时出现问题。
${clicked ? "none" : "bounce 2s infinite"};
规则似乎无法将生成的 id 添加到 bounce
动画名称。
这可能是设计使然,也可能是错误,或者仅仅是 styled-jsx 中的限制。 IDK.
您有几个选项可以解决这个问题,
可能最简单的方法是使 css 样式静态化,并在应应用新样式时添加 class。
IE
circle {
r: 5%;
animation: bounce 2s infinite;
transition: r 0.8s ease-in-out;
}
.is-clicked {
animation: none;
r: 10%;
}
并应用 class 来圈出像
className={clicked && "is-clicked"}
,这样动画名称将包含一个 id,并且使用该动画的任何规则也将收到相同的 id。
我尝试在没有任何条件的情况下在单独的行中添加 animation
,但是没有应用转换。我还尝试用反引号代替 animation
属性 的双引号,但没有成功。
如何在单击时应用动画 false
并在单击时播放半径的过渡 true
?
import { useState } from "react";
export default function Home() {
const [clicked, setClicked] = useState(false);
return (
<>
<main>
<svg onClick={() => setClicked((c) => !c)}>
<circle cx="50%" cy="40%" stroke="black" strokeWidth={2} fill="gray" />
</svg>
</main>
<style jsx>{`
svg {
width: 100%;
height: 100%;
}
circle {
r: ${clicked ? "10%" : "5%"};
animation: ${clicked ? "none" : "bounce 2s infinite"};
transition: r 0.8s ease-in-out;
}
@keyframes bounce {
0% {
r: 5%;
}
50% {
r: 6%;
}
100% {
r: 5%;
}
}
`}</style>
</>
);
}
这与 styled-jsx 如何应用它们的 css 规则有关。
每个 <style jsx>
标签将被 babel 转换成一段 js 代码,该代码将生成并跟踪 html.
<style type="txt/css"/>
标签。
该标签将包含一个唯一 ID,如果您检查该标签,它将如下所示:
<style type="text/css" data-styled-jsx="">
svg.jsx-1097321267 {
width: 100%;
height: 100%;
}
circle.jsx-1097321267 {
r: 5%;
-webkit-animation: bounce 2s infinite;
animation: bounce 2s infinite;
-webkit-transition: r 0.8s ease-in-out;
transition: r 0.8s ease-in-out;
}
@-webkit-keyframes bounce-jsx-1097321267 {
0% {
r: 5%;
}
50% {
r: 6%;
}
100% {
r: 5%;
}
}
@keyframes bounce-jsx-1097321267 {
0% {
r: 5%;
}
50% {
r: 6%;
}
100% {
r: 5%;
}
}
</style>
注意动画是如何使用相同的 ID 生成的。
bounce-jsx-1097321267
.
styles-jsx 标签中的任何静态 references/classes 也会获得此 ID。
这都是在编译时通过 babel 完成的。
生成的 js 代码将为您完成所有引用。
动态分配 css 代码时出现问题。
${clicked ? "none" : "bounce 2s infinite"};
规则似乎无法将生成的 id 添加到 bounce
动画名称。
这可能是设计使然,也可能是错误,或者仅仅是 styled-jsx 中的限制。 IDK.
您有几个选项可以解决这个问题, 可能最简单的方法是使 css 样式静态化,并在应应用新样式时添加 class。
IE
circle {
r: 5%;
animation: bounce 2s infinite;
transition: r 0.8s ease-in-out;
}
.is-clicked {
animation: none;
r: 10%;
}
并应用 class 来圈出像
className={clicked && "is-clicked"}
,这样动画名称将包含一个 id,并且使用该动画的任何规则也将收到相同的 id。