我正在React中开发一个组件,它接受 colored颜色 、十六进制值作为字符串,它应该在我的组件内设置各种样式,包括状态悬停、之前和之后、焦点以及自定义 Select 器中. 简而言之,我需要动态、任意的造型. 我很清楚Tailwind并不很好地支持动态类,但您知道,如果它支持,我的一些类看起来会是这样的:

before:border-t-[${color}]
hover:text-[${color}]
data-[state=open]:text-[${color}]
bg-[${color}]
hover:bg-[${color}]

我try 在tailwind 中进行安全列表,就像这样:

 safelist: [
    "dark",
    {
      pattern: /border-[^/]+$/,
      variants: [
        "dark",
        "hover",
        "focus",
        "dark:hover",
        "dark:focus",
        "before",
        "after",
        "data-[state=open]",
      ],
    },
    {
      pattern: /text-[^/]+$/,
      variants: [
        "dark",
        "hover",
        "focus",
        "dark:hover",
        "dark:focus",
        "before",
        "after",
        "data-[state=open]",
      ],
    },
    {
      pattern: /bg-[^/]+$/,
      variants: [
        "dark",
        "hover",
        "focus",
        "dark:hover",
        "dark:focus",
        "before",
        "after",
        "data-[state=open]",
      ],
    },
  ],

但它不起作用.

解决方案是内联设置样式,而不是使用Tailwind,但内联样式不支持 Select 器.

所以感觉我就像走在了死胡同,这应该是相当简单和常见的事情,所以我不知道. 所以我的最后一个问题是:

Is is possible to create a React component that accepts a color as a hex value and it will dynamically and arbitrarly style stuff inside this component (even using selectors, including custom ones)? If so, how?

推荐答案

对于真正动态的 colored颜色 值,您需要使用内联样式.safelist个正规表达仅适用于配置的值,例如text-red-500.Tailwind无法将现有的每个 colored颜色 值编译为任意值-实际上会有无限的量.

对于您提到的每个具有变体的类,您可以使用CSS变量:

之前:border-t-[${ colored颜色 }]

<div
  class="before:border-t-[--color]"
  style={{ '--color': color }}
>

悬停:文本-[${ colored颜色 }]

<div
  class="hover:text-[--color]"
  style={{ '--color': color }}
>

数据-[状态=打开]:文本-[${ colored颜色 }]

<div
  class="data-[state=open]:text-[--color]"
  style={{ '--color': color }}
>

悬停:bg-[${ colored颜色 }]

<div
  class="hover:bg-[--color]"
  style={{ '--color': color }}
>

然后对于bg-[${color}],您需要使用内联风格:

<div style={{ backgroundColor: color }}>

尽管您也可以为此使用CSS变量,尽管它感觉多余(但在您的组件中可能有意义):

<div
  class="bg-[--color]"
  style={{ '--color': color }}
>

Css相关问答推荐

如何在Angular中创建primeNG pagator

如何使用css创建带有曲线的自定义按钮

如何让CSS过渡应用时宽度增加,而不是减少?

为什么我的Angular material css文件不工作?

当面板以Angular 上升时如何定位下拉面板

寻找组件中最大的元素来设置其他组件的高度

为什么在RadixUi上应用Tailwincss和自定义css类不起作用?

如何从 WooCommerce 中的 Betheme 图像中删除产品永久链接图标

包含 N 个 React 组件的砌体网格

如何在不使用 sx props 的情况下从 Select 样式中定位 mui paper 组件?

当页面大小小于VH时,Tailwind CSS如何使页脚留在底部

tailwind css 中的自定义组状态

Angular Datepicker - 更改日期范围 Select 样式

当计算的宽度不准确时,如何在 cypress 中测试元素的宽度?

如何强制 div 出现在下方而不是旁边?

固定元素在 Chrome 中消失

导航栏中的 Bootstrap 3.0 按钮

如何仅在一侧设置 CSS 边框?

CSS 外边框

背景图像可以大于 div 本身吗?