我正在努力重做这Codepen在react 打字.我在博文here里找到的 简单的方式-创建react 应用程序,并添加到css文件,它完美的工作. 不,我try 了样式组件的方法,但我似乎错过了一些东西,因为它还不起作用?

App.tsx

import React from "react";
import "./App.css";
import styled from "styled-components";

/* Animate when Houdini is available */
const Houdini = styled.div`
width: 400px;
height: 300px;
border-radius: 10px;
padding: 2rem;
margin: auto;

display: grid;
place-content: center;
text-align: center;

font-size: 1.5em;

--border-size: 0.3rem;
border: var(--border-size) solid transparent;

/* Paint an image in the border */
border-image: conic-gradient(
    from var(--angle),
    #d53e33 0deg 90deg,
    #fbb300 90deg 180deg,
    #377af5 180deg 270deg,
    #399953 270deg 360deg
  )
  1 stretch;
background: rgb(255 255 255 / var(--opacity));

@supports (background: paint(houdini)) {
  @property --opacity {
    syntax: "<number>";
    initial-value: 0.5;
    inherits: false;
  }

  @property --angle {
    syntax: "<angle>";
    initial-value: 0deg;
    inherits: false;
  }

  @keyframes opacityChange {
    to {
      --opacity: 1;
    }
  }

  @keyframes rotate {
    to {
      --angle: 360deg;
    }
  }

  .rainbow {
    animation: rotate 4s linear infinite, opacityChange 3s infinite alternate;
  }

  /* Hide the warning */
  .warning {
    display: none;
  }
}
`;

function App() {
  return (
    <>
      <Houdini>
        <p>
          This demo uses a real border with <code>border-image</code>, a
          background, and finally Houdini to animate.
        </p>
      </Houdini>

      <div>
        <p>
          ⚠️ Your browser does not support{" "}
          <a href="https://web.dev/css-individual-transform-properties/">
            @property
          </a>{" "}
          so the animation won’t work
          <br />
          Please use Chrome.
        </p>
      </div>
    </>
  );
}

export default App;

And a slight variation the working Codepen And the change in my App.tsx个 the rest is the same like above - same issue, I used styled components and the effect does not show.

const Houdini = styled.div`
.
.
.
--border-size: 0.3rem;
border: var(--border-size) dotted transparent;
  background-image: linear-gradient(
      to right,
      rgb(255 255 255 / var(--opacity)),
      rgb(255 255 255 / var(--opacity))
    ),
    conic-gradient(
      from var(--angle),
      #d53e33 0deg 90deg,
      #fbb300 90deg 180deg,
      #377af5 180deg 270deg,
      #399953 270deg 360deg
    );
  background-origin: border-box;
  background-clip: padding-box, border-box;
.
.
.

`;

推荐答案

罪魁祸首是启动动画的nestedcss规则:

.rainbow {
  animation: rotate 4s linear infinite, opacityChange 3s infinite alternate;
}

...在CodePen示例中,它以具有边框的元素为目标:

<div class="rainbow">
  <p>This demo uses a real border with <code>border-image</code>,
  a background, and finally Houdini to animate.</p>
</div>

但一旦转换为样式组件,类名为"彩虹"的<div>就被替换为<Houdini>样式的Reaction组件.因此,它的类名不再是"彩虹",而是由样式化组件生成.

<Houdini> // styled-components replaces it by something like "<div class="sc-bczRLJ kCseJt">"
  <p>
    This demo uses a real border with <code>border-image</code>, a
    background, and finally Houdini to animate.
  </p>
</Houdini>

为了达到相同的效果(即,准备然后嵌套规则来启动动画,应用于相同的类名),我们可以简单地使用&(与号)标识符,样式化组件被生成的类名替换(SASS/SCSS技术):

https://styled-components.com/docs/basics#pseudoelements-pseudoselectors-and-nesting

&单个与号指的是组件的所有实例;它用于应用广泛的覆盖

& /*.rainbow*/ {
  animation: rotate 4s linear infinite, opacityChange 3s infinite alternate;
}

...现在动画成功了!

注意:不要忘记还要定义初始的css变量(例如,在全局css文件中):

:root {
  --angle: 45deg;
  --opacity: 0.5;
}

*,
*::before,
*::after {
  box-sizing: border-box;
}

CodeSandbox上的演示:https://codesandbox.io/s/winter-dream-ej7yec?file=/src/App.tsx:1069-1176

Javascript相关问答推荐

是什么原因导致此Angular 16电影应用程序中因类型错误而不存在属性?

根据总价格对航班优惠数组进行排序并检索前五个结果- Angular HTTP请求

D3多线图显示1线而不是3线

如何在Javascript中的控制台上以一行形式打印循环的结果

如何在Obsidian dataview中创建进度条

给定一个凸多边形作为一组边,如何根据到最近边的距离填充里面的区域

函数返回与输入对象具有相同键的对象

如何从URL获取令牌?

cypress中e2e测试上的Click()事件在Switch Element Plus组件上使用时不起作用

为什么Mutations 观察器用微任务队列而不是macrotask队列处理?

编剧如何获得一个div内的所有链接,然后判断每个链接是否都会得到200?

在开发期间,Web浏览器如何运行&qot;.jsx&qot;文件?

try 使用PM2在AWS ubuntu服务器上运行 node 进程时出错

SPAN不会在点击时关闭模式,尽管它们可以发送日志(log)等

从逗号和破折号分隔的给定字符串中查找所有有效的星期几

是否可以将异步调用与useState(UnctionName)一起使用

如何使本地html页面在重新加载时保持当前可隐藏部分的打开状态?

计算对象数组中属性的滚动增量

如何调整下拉内容,使其不与其他元素重叠?

JQuery-无法 Select 使用elementor添加的元素的值